unit Main ;

interface

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

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

  public
    S : TSrvrSession ;
    fConnected : BOOL ;

    // 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 ) ;

  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 ;
    procedure RetrieveField(var Field: OleVariant); safecall;
    procedure RetrieveUpdateField(var pIndexVar: OleVariant); safecall;
    function AddUpdateFilter(ParentId: Integer; Operation: ELogicalOperation;
                             var Field: OleVariant; Condition: ECondition; var Value: OleVariant): Integer; 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 ) ;
end ;

//******************************************************************************
//  TNIDataRow
//******************************************************************************
type TNIDataRow = class
private

public
    __DataRow : TDataRow ;
    Structure : IDispatch ;
    Item : array of OleVariant ;

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

//******************************************************************************
// TNITransaction
//******************************************************************************
type TNITransaction = class
private

public
    Trans : TTransaction ;
    Structure : IDispatch ;
    // Constructor/destructor
    constructor Create ;
    destructor Destroy ; override ;
    // Methods
    procedure Open( const SrvrSession : IDispatch ; const Name : WideString ; Type_ : ETableType ) ;
    procedure Execute( const NiDataRow : IDispatch ) ; safecall ;
end ;

//******************************************************************************
// TNIStructure
//******************************************************************************
type TNIStructure = class
private
public
    // Vars
    __Struct : TStructure ;

    // Constructor/destructor
    constructor Create ;
    destructor Destroy ;
    // Methods
//    function FieldName( Index : Integer ) : WideString ; safecall ;
    function FieldAcronym( iIndex : Integer ) : WideString ; safecall ;
end ;

//******************************************************************************
//  TfrmMain
//******************************************************************************
type
  TfrmMain = class(TForm)
    MainMenu1: TMainMenu;
    mnFile: TMenuItem;
    mnFileConnect: TMenuItem;
    mnFileExit: TMenuItem;
    mnFileDisconnect: TMenuItem;
    StatusBar1: TStatusBar;
    PageControl1: TPageControl;
    tabQuotes: TTabSheet;
    StrGrdQuotes: TStringGrid;
    Button1: TButton;
    procedure Exit1Click(Sender: TObject);
    procedure Connect1Click(Sender: TObject);
    procedure mnFileConnectClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure mnFileDisconnectClick(Sender: TObject);
    procedure mnFileExitClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);

private

public

end ;

type
  TMyThread = class( TThread )
  private
    { Private declarations }
  protected
    procedure Execute ; override ;
  end ;

////////////////////////////////////////////////////////////////////////////////
// Global variables
////////////////////////////////////////////////////////////////////////////////
var
    frmMain: TfrmMain;
    NISession : TNISession ;
    tblQuotes : TNITable ;
    iPosQuotes, iSeccodeCol : Integer ;

////////////////////////////////////////////////////////////////////////////////
// Additional procs prototypes
////////////////////////////////////////////////////////////////////////////////
procedure niapi_OnLogin ;
procedure niapi_QuotesOnInsert( NiDataRow : IDispatch ) ;
procedure niapi_QuotesOnData( NiDataRowSet : IDispatch ) ;
procedure niapi_QuotesGetStructure ;

implementation

uses Connect ;

{$R *.dfm}

procedure TMyThread.Execute ;
begin

end ;

//******************************************************************************
// constructor TNISession.Create
//******************************************************************************
constructor TNISession.Create ;
begin
  S         := TSrvrSession.Create( nil ) ;
  S.OnLogin := self.OnLogin ;
  S.OnConnectionLost := self.OnConnectionLost ;
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 ;
      S.Journal:='journal';
      if szCatalog <> '' then
          S.CatalogName := szCatalog ;
      S.Connect1 ;
end;

procedure TNISession.Disconnect ;
begin
  S.Disconnect ;
  fConnected := FALSE ;
end ;

procedure TNISession.OnLogin( ASender : TObject ; LoginResult : Integer ) ;
begin
    fConnected := TRUE ;
    MessageBox( 0, 'Соединение установлено', 'NiApi.dll test', MB_OK or MB_ICONINFORMATION ) ;
    niapi_OnLogin( ) ;
end ;

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

constructor TNITable.Create ;
begin
    __Table := TTable.Create( nil ) ;
    __Table.OnInsert := self.OnInsert ;
    __Table.OnData := self.OnData ;
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
    if szTableName = 'QUOTES' then
        niapi_QuotesOnData( DataRowSet ) ;
end ;

procedure TNITable.OnDataComplete( ASender : TObject ; iCode : Integer ; const szTableName : WideString ) ;
begin
    MessageBox( frmMain.Handle, 'OnDataComplete', '', MB_OK ) ;
end ;

procedure TNITable.OnInsert( ASender: TObject ; const NiDataRow : IDispatch ; const szTableName : WideString ) ;
begin
    niapi_QuotesOnInsert( NiDataRow ) ;
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 ;

//procedure RetrieveField(var Field: OleVariant); safecall;
//    function AddUpdateFilter(ParentId: Integer; Operation: ELogicalOperation;
//                             var Field: OleVariant; Condition: ECondition; var Value: OleVariant): Integer; safecall;

procedure TNITable.RetrieveUpdateField( var pIndexVar : OleVariant ) ; safecall ;
begin
    __Table.RetrieveUpdateField( pIndexVar ) ;
end ;

procedure TNITable.RetrieveField( var Field : OleVariant ) ; safecall ;
begin
    __Table.RetrieveField( Field ) ; 
end ;

function TNITable.AddUpdateFilter( ParentId : Integer;
                                           Operation : ELogicalOperation ;
                                           var Field : OleVariant ;
                                           Condition : ECondition ;
                                           var Value : OleVariant ) : Integer ; safecall ;
begin
    __Table.AddUpdateFilter( ParentId, Operation, Field, Condition, Value ) ; 
end ;

constructor TNIDataRow.Create ;
begin
    __DataRow := TDataRow.Create( nil ) ;
end ;

destructor TNIDataRow.Destroy ;
begin
    FreeAndNil( __DataRow ) ;
end ;

constructor TNITransaction.Create ;
begin
    Trans := TTransaction.Create( nil ) ;
end ;

destructor TNITransaction.Destroy ;
begin
   FreeAndNil( Trans ) ;
end ;

procedure TNITransaction.Open( const SrvrSession : IDispatch ; const Name : WideString ; Type_ : ETableType ) ;
begin
    Trans.Open( SrvrSession, Name, Type_ ) ;
    self.Structure := Trans.Structure ;
end ;

procedure TNITransaction.Execute( const NiDataRow : IDispatch ) ; safecall ;
begin
    Trans.Execute( NiDataRow ) ;
end ;

constructor TNIStructure.Create ;
begin
    __Struct := TStructure.Create( nil ) ;
end ;

destructor TNIStructure.Destroy ;
begin
    FreeAndNil( __Struct ) ;
end ;

function TNIStructure.FieldAcronym( iIndex : Integer ) : WideString ; safecall ;
begin
    FieldAcronym := __Struct.FieldAcronym( iIndex ) ;
end ;

//******************************************************************************
//  Additional procs
//******************************************************************************
procedure niapi_OnLogin ;
var
    Filter : IFilter ;
    ov : OleVariant ;

begin
    // Open QUOTES
    tblQuotes.Open( NISession.S.DefaultInterface, 'QUOTES', tabNoneAddr ) ;
    niapi_QuotesGetStructure ;

//    tblQuotes.GetData( Filter ) ;
    ov := 'I_NAME' ;
    tblQuotes.RetrieveUpdateField( ov ) ;
    tblQuotes.GetSlice( Filter ) ;

   tblQuotes.SetOnlineUpdates( subEnabled ) ;

end ;

procedure TfrmMain.Exit1Click(Sender: TObject);
begin
  Application.Terminate ;
end;

procedure TfrmMain.Connect1Click(Sender: TObject);
begin
  frmConnect.ShowModal ;
end;

procedure TfrmMain.mnFileConnectClick(Sender: TObject);
begin
  frmConnect.ShowModal( ) ;
end;

procedure TfrmMain.FormCreate( Sender : TObject ) ;
begin
    // OLE initialization
    CoInitializeEx( nil, COINIT_APARTMENTTHREADED ) ;

    iPosQuotes := 1 ;

    // Create NI objects :
    // SrvrSession :
    NISession := TNISession.Create ;

    // Tables
    tblQuotes := TNITable.Create ;  // QUOTES
end;

procedure TfrmMain.mnFileDisconnectClick( Sender : TObject ) ;
begin
    NISession.Disconnect( ) ;
end;

procedure TfrmMain.mnFileExitClick(Sender: TObject);
begin
  NISession.Disconnect();
    Application.Terminate ;
end;

procedure niapi_QuotesOnInsert( NiDataRow : IDispatch ) ;
var
    Row : IDataRow ;
    ov : OleVariant ;
    i, j : Integer ;
    ovCmp : OleVariant ;

begin
    ov := 'I_SHORTNAME' ;
    ovCmp := '' ;
    Row := NiDataRow as IDataRow ;

    for i := 0 to Row.Count - 1 do
    begin
        if frmMain.StrGrdQuotes.Cells[ iSeccodeCol, i ] = Row.Item[ ov ] then
        begin
            for j := 1 to frmMain.StrGrdQuotes.ColCount do
            begin
                ov := j ;
                if String( Row.Item[ ov ] ) <> '' then
                    frmMain.StrGrdQuotes.Cells[ j, i ] := Row.Item[ ov ] ;
            end ;
            exit ;
        end ;
    end ;
end ;

procedure niapi_QuotesOnData( NiDataRowSet : IDispatch ) ;
var
    Row : IDataRow ;
    RowSet : IDataRowSet ;
    i, j : integer ;
    ovItem : OleVariant ;

begin
    // Adjust grid properties
    RowSet := NiDataRowSet as IDataRowSet ;
    Row := RowSet.GetRow( 1 ) as IDataRow ;
    frmMain.StrGrdQuotes.RowCount := frmMain.StrGrdQuotes.RowCount + RowSet.Count ;
    frmMain.StrGrdQuotes.ColCount := Row.Count - 1 ;

    for i := 0 to RowSet.Count - 1 do
        begin
            Row := RowSet.GetRow( i ) as IDataRow ;
            for j := 1 to Row.Count - 1 do
            begin
                ovItem := j ;
                frmMain.StrGrdQuotes.Cells[ j, iPosQuotes + i ] := Row.Item[ ovItem ] ;
            end ;
        end ;
    iPosQuotes := iPosQuotes + i ;
end ;

procedure niapi_QuotesGetStructure ;
var
    struct : IStructure ;
    i : Integer ;
    s : String ;

begin
    struct := tblQuotes.__Table.Structure as IStructure ;
    frmMain.StrGrdQuotes.RowCount := 2 ;
    frmMain.StrGrdQuotes.ColCount := 2 ;
    frmMain.StrGrdQuotes.FixedRows := 1 ;

    for i := 1 to struct.Count - 1 do
    begin
        s := struct.FieldDispName( i ) ;
        frmMain.StrGrdQuotes.Cells[ i - 1, 0 ] := s ;
        s := struct.FieldAcronym( i ) ;
        if CompareStr( s, 'I_SHORTNAME' ) = 0 then
            iSeccodeCol := i ;
    end ;
end ;

procedure NewOrder(nap,kolvo,price:integer);
  var
    tt:TNITransaction;
    rw:TDataRow;
    ov:OleVariant;
  begin
    tt:=TNITransaction.Create();
    tt.Open(NISession.S.DefaultInterface,'FUTADDORDER',tabAdrr);
    rw:=TDataRow.Create(nil);
    rw.Structure := tt.Structure;

    ov:=2; rw.Item[ov]:='EERU-3.08';
    ov:=3; if nap>0 then rw.Item[ov]:='B' else rw.Item[ov]:='S';
    ov:=4; rw.Item[ov]:=inttostr(kolvo);
    ov:=5; rw.Item[ov]:=inttostr(price);
    ov:=6; rw.Item[ov]:='M';
    ov:=7; rw.Item[ov]:='060';
    ov:=8; rw.Item[ov]:='PSFU';
    ov:=11; rw.Item[ov]:='AC1';
    tt.Execute(rw.DefaultInterface);
    tt.free;
  end;


procedure TfrmMain.Button1Click(Sender: TObject);
var
//    trans : TTransaction ;
    tt:TNITransaction;
    rw : TDataRow ;
    ov : OleVariant ;
    num,price,direction:integer;
begin
//  NewOrder(1,1,27100);
    num:=1; //Кол-во
    price:=27100;        //Цена
    direction:=1; //Направление (покупка/продажа)
    tt:=TNITransaction.Create();
    tt.Open(NISession.S.DefaultInterface,'FUTADDORDER',tabAdrr);
    rw:=TDataRow.Create(nil);
    rw.Structure := tt.Structure;

    ov:=2; rw.Item[ov]:='EERU-3.08';
    ov:=3; if direction>0 then rw.Item[ov]:='B' else rw.Item[ov]:='S';
    ov:=4; rw.Item[ov]:=inttostr(num);
    ov:=5; rw.Item[ov]:=inttostr(price);
    ov:=6; rw.Item[ov]:='M';
    ov:=7; rw.Item[ov]:='060';
    ov:=8; rw.Item[ov]:='PSFU';
    ov:=11; rw.Item[ov]:='AC1';
    tt.Execute(rw.DefaultInterface);
    tt.free;

{    trans := TTransaction.Create( nil ) ;
    row := TDataRow.Create( nil ) ;
    trans.Open( NISession.S.DefaultInterface, 'ORDER', tabAdrr ) ;
    row.Structure := trans.Structure ;
    ov := 'I_ACCOUNT'   ; row.Item[ ov ] := 'S01-00000F00' ;
    ov := 'I_BUYSELL'   ; row.Item[ ov ] := 'B' ; // or 'S'
    ov := 'I_MKTLIMIT'  ; row.Item[ ov ] := 'M' ; // M - market, L - limit
    ov := 'I_SPLITFLAG' ; row.Item[ ov ] := 'S' ;
    ov := 'I_PRICEYIELDENTERTYPE' ; row.Item[ ov ] := 'P' ;
    ov := 'I_IMMCANCEL' ; row.Item[ ov ] := ' ' ;
    ov := 'I_SECBOARD'  ; row.Item[ ov ] := 'EQBR' ;
    ov := 'I_SECCODE'   ; row.Item[ ov ] := 'EESR' ;
//    ov := 'I_PRICE' ; row.Item[ ov ] := ........ ;
    ov := 'I_QUANTITY' ; row.Item[ ov ] := 1 ;
    ov := 'I_BROKERREF' ; row.Item[ ov ] := 'igor/' ;
    ov := 'I_USE_MARGIN' ; row.Item[ ov ] := 118 ;

    trans.Execute( row.DefaultInterface ) ;
    FreeAndNil( row ) ;
    FreeAndNil( trans ) ;}
end;

end .

