unit Main ;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActiveX, StdCtrls, Menus, NiApiLib_TLB, ComCtrls ;

//******************************************************************************
//  TNISession
//******************************************************************************
  type TNISession = class
  private

  public
    S : TSrvrSession ;

    // Constructor/destructor
    constructor Create ;
    destructor  Destroy ; override ;

    // TSrvrSession methods
    procedure Connect( szHostAddr : String ; iPort : Integer; szLogin : String ; szPassword : String ; szCatalog : String ) ;
    procedure Disconnect ;

    // TSrvrSession events
    procedure OnLogin( ASender : TObject ; LoginResult : Integer ) ;
    procedure OnConnectionLost( ASender : TObject ) ;
    procedure OnMessage( ASender : TObject ; const msg : IDispatch ) ;

  end;

//******************************************************************************
// TNITable
//******************************************************************************
type TNITable = class
private

public
    __Table : TTable ;

    // Constructor/destructor
    constructor Create ;
    destructor Destroy ; override ;

    // TTable methods
    procedure Open( const SrvrSession : IDispatch ; const szName: WideString ; Type_: ETableType ) ; safecall ;
    function GetData( Filter : OleVariant ) : Integer ; safecall ;
    function GetSlice( Filter : OleVariant ) : Integer ; safecall ;
    procedure SetOnlineUpdates( Val : ESubscribtion ) ; safecall ;

    // TTable events
    procedure OnData( ASender : TObject ; iCode : Integer ; const DataRowSet : IDispatch ; const szTableName : WideString ) ;
    procedure OnDataComplete( ASender : TObject ; iCode : Integer ; const szTableName : WideString ) ;
    procedure OnInsert( ASender : TObject ; const NiDataRow : IDispatch ; const szTableName : WideString ) ;
    procedure OnModify( ASender : TObject ; const NiDataRow : IDispatch ; const szTableName : WideString ) ;
    procedure OnDelete( ASender : TObject ; iRecid : Integer ; const szTableName : WideString ) ;
end ;

//******************************************************************************
//  TfrmMain
//******************************************************************************
type
  TfrmMain = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
private

public

end ;

var
    frmMain: TfrmMain;

    NISession : TNISession ;
    tblQuotes : TNITable ;

procedure niapi_OnLogin ;
procedure niapi_OnDisconnect ;
procedure niapi_QuotesOnInsert( NiDataRow : IDispatch ) ;

implementation

{$R *.dfm}

//******************************************************************************
// constructor TNISession.Create
//******************************************************************************
constructor TNISession.Create ;
begin
  S         := TSrvrSession.Create( nil ) ;
  S.OnLogin := self.OnLogin ;
  S.OnConnectionLost := self.OnConnectionLost ;
  S.OnMessage := self.OnMessage ; 
end ;

//******************************************************************************
// destructor TNISession.Destroy
//******************************************************************************
destructor TNISession.Destroy ;
begin
  FreeAndNil( S ) ;
end ;

procedure TNISession.Connect( szHostAddr : String ;
                              iPort : Integer ;
                              szLogin : String ;
                              szPassword : String ;
                              szCatalog : String ) ;
begin
      S.HostAddr := szHostAddr ;
      S.HostPort := iPort ;
      S.Name     := szLogin ;
      S.Password := szPassword ;
      if szCatalog <> '' then
          S.CatalogName := szCatalog ;
      S.Connect1 ;
end;

procedure TNISession.Disconnect ;
begin
  S.Disconnect1 ;
end ;

procedure TNISession.OnLogin( ASender : TObject ; LoginResult : Integer ) ;
begin
    MessageBox( frmMain.Handle, 'Соединение установлено', '', MB_OK or MB_ICONINFORMATION ) ;
    niapi_OnLogin( ) ;
end ;

procedure TNISession.OnConnectionLost( ASender : TObject ) ;
begin
  MessageBox( 0, 'Соединение потеряно', 'NiApi.dll test', MB_OK or MB_ICONEXCLAMATION ) ;
  niapi_OnDisconnect ;
end ;

procedure TNISession.OnMessage( ASender : TObject ; const msg : IDispatch ) ;
var
    m : IMessage ;
    i : Integer ;
begin
    m := msg as IMessage ;
    for i := 0 to m.Count - 1 do
        frmMain.Canvas.TextOut( 10, 10, m.Value( 0 ) )
end ;

constructor TNITable.Create ;
begin
    __Table := TTable.Create( nil ) ;
    __Table.OnInsert := self.OnInsert ;
    __Table.OnModify := self.OnModify ;
    __Table.OnDelete := self.OnDelete ;
    __Table.OnData   := self.OnData ;
    __Table.OnDataComplete := self.OnDataComplete ;
end ;

destructor TNITable.Destroy ;
begin
  FreeAndNil( __Table ) ;
end ;

procedure TNITable.Open( const SrvrSession : IDispatch ; const szName: WideString ; Type_: ETableType ) ; safecall ;
begin
  __Table.Open( SrvrSession, szName, Type_ ) ;
end ;

procedure TNITable.OnData( ASender : TObject ; iCode : Integer ; const DataRowSet : IDispatch ; const szTableName : WideString ) ;
begin

end ;

procedure TNITable.OnDataComplete( ASender : TObject ; iCode : Integer ; const szTableName : WideString ) ;
begin
end ;

procedure TNITable.OnInsert( ASender: TObject ; const NiDataRow : IDispatch ; const szTableName : WideString ) ;
var
    Row : IDataRow ;
    ovItem : OleVariant ;

begin
    ovItem := 'I_TIME' ;
    Row := NiDataRow as IDataRow ;
    frmMain.Caption := Row.Item[ ovItem ] ;
end ;

procedure TNITable.OnModify( ASender : TObject ; const NiDataRow : IDispatch ; const szTableName : WideString ) ;
begin
end ;

procedure TNITable.OnDelete( ASender : TObject ; iRecid : Integer ; const szTableName : WideString ) ;
begin

end ;

function TNITable.GetData( Filter : OleVariant ) : Integer ; safecall ;
begin
    GetData := __Table.GetData( Filter ) ;
end ;

function TNITable.GetSlice( Filter : OleVariant ) : Integer ; safecall ;
begin
    GetSlice := __Table.GetSlice( Filter ) ;
end ;

procedure TNItable.SetOnlineUpdates( Val : ESubscribtion ) ; safecall ;
begin
    __Table.SetOnlineUpdates( Val ) ;
end ;

//******************************************************************************
//  Additional procs
//******************************************************************************
procedure niapi_OnLogin ;
begin
    tblQuotes.Open( NISession.S.DefaultInterface, 'QUOTES', tabNoneAddr ) ;
    tblQuotes.SetOnlineUpdates( subEnabled ) ;
end ;

procedure niapi_OnDisconnect ;
begin
end ;

procedure TfrmMain.FormCreate( Sender : TObject ) ;
begin
    // OLE initialization
    CoInitialize( nil ) ;

    // Create main SrvrSession :
    NISession := TNISession.Create ;
    tblQuotes := TNITable.Create ;
end;

procedure niapi_QuotesOnInsert( NiDataRow : IDispatch ) ;
begin
end ;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
    // Интраст игровой
    NISession.Connect( 'ip', 2900, 'login', 'password', 'blahblahblah.xml' ) ;
end;

end .


