unit MainForm; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.DateUtils, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, FMX.Objects, Myc.Futures, Myc.Trade.DataStream, Myc.Trade.DataPoint, Myc.Signals, Myc.Signals.FMX, FMX.ListBox; type TForm1 = class(TForm) LogMemo: TMemo; Panel1: TPanel; RandomButton: TButton; Path1: TPath; SymbolsComboBox: TComboBox; LoadButton: TButton; procedure RandomButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure LoadButtonClick(Sender: TObject); private FOnEvent: TNotifyEvent; { Private declarations } FServer: IDataServer; FSymbolsValid: TFMXValidationState; FStreamUpdate: TFMXValidationState; FSymbols: TFuture>; FStream: IDataStream; FRandomStream: array[0..19] of IDataStream; FStreamIdx: Integer; procedure DoIdle(Sender: TObject; var Done: Boolean); public { Public declarations } published property OnEvent: TNotifyEvent read FOnEvent write FOnEvent; end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin // Create an instance of the TAuraTABFileServer. The server can be reused for multiple stream creations. [364] FServer := TAuraTABFileServer.Create('\\COFFEE\TickData\Pepperstone'); SymbolsComboBox.Enabled := false; FSymbols := FServer.EnumerateSymbols; FSymbolsValid := TFMXValidationState.Create( SymbolsComboBox, FSymbols.Done, procedure begin SymbolsComboBox.BeginUpdate; try SymbolsComboBox.Items.Clear; SymbolsComboBox.Items.AddStrings(FSymbols.WaitFor); if SymbolsComboBox.Items.Count > 0 then begin if SymbolsComboBox.ItemIndex < 0 then SymbolsComboBox.ItemIndex := SymbolsComboBox.Items.IndexOf('GER40'); SymbolsComboBox.Enabled := true; end; finally SymbolsComboBox.EndUpdate; end; end ); Application.OnIdle := DoIdle; end; procedure TForm1.FormDestroy(Sender: TObject); begin Application.OnIdle := nil; FSymbolsValid.Free; end; procedure TForm1.LoadButtonClick(Sender: TObject); begin FStream := FServer.CreateStream(FSymbols.WaitFor[SymbolsComboBox.ItemIndex]); FStreamUpdate := TFMXValidationState.Create(Path1, FStream.HasData, procedure var Data: array [0..5] of TDataPoint; begin var cnt := FStream.GetChunk(Data); if cnt = 0 then exit; for var i:=0 to cnt-1 do Path1.Data.LineTo( PointF(Path1.Data.Count, Data[i].Data.Ask) ); end); end; procedure TForm1.RandomButtonClick(Sender: TObject); begin var ass := FSymbols.WaitFor; FRandomStream[FStreamIdx] := FServer.CreateStream(ass[Random(Length(ass))]); for var i := 0 to High(FRandomStream) do if LogMemo.Lines.Count = i then LogMemo.Lines.Add(''); LogMemo.Lines[FStreamIdx] := FRandomStream[FStreamIdx].Symbol + ' loading...'; FStreamIdx := (FStreamIdx + 1) mod Length(FRandomStream); end; procedure TForm1.DoIdle(Sender: TObject; var Done: Boolean); var Items: TArray>; begin SetLength(Items, 200); LogMemo.BeginUpdate; try for var i := 0 to High(FRandomStream) do begin var str := ''; if LogMemo.Lines.Count > i then str := LogMemo.Lines[i] else LogMemo.Lines.Add(''); if Assigned(FRandomStream[i]) then begin var cnt := FRandomStream[i].GetChunk(Items); if cnt > 0 then begin var d := Items[cnt - 1]; str := FRandomStream[i].Symbol + ' ' + cnt.ToString + ' ' + d.Time.ToString + ': ' + d.Data.Ask.ToString; end; end; LogMemo.Lines[i] := str; end; finally LogMemo.EndUpdate; end; end; end.