unit MainForm; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.DateUtils, System.Generics.Collections, 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.Trade.DataProvider, Myc.Signals, Myc.Lazy, Myc.Signals.FMX, FMX.ListBox, FMX.Layouts; type TForm1 = class(TForm) LogMemo: TMemo; Panel1: TPanel; RandomButton: TButton; Path1: TPath; SymbolsComboBox: TComboBox; LoadButton: TButton; FlowLayout: TFlowLayout; procedure RandomButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure LoadButtonClick(Sender: TObject); private const cnt = 20; type TRndItem = record Stream: IDataStream; Data: TMutable>; Labl: TLabel; end; private FOnEvent: TNotifyEvent; { Private declarations } FServer: IDataServer; FSymbolsValid: TFMXValidationState; FStreamUpdate: TFMXValidationState; FSymbols: TFuture>; FStream: IDataStream; FRandom: TList; public { Public declarations } published property OnEvent: TNotifyEvent read FOnEvent write FOnEvent; end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin FRandom := TList.Create; // 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.Signal, 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 ); end; procedure TForm1.FormDestroy(Sender: TObject); begin Application.OnIdle := nil; FSymbolsValid.Free; FRandom.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..200] 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 rnd: TRndItem; var ass := FSymbols.WaitFor; rnd.Stream := FServer.CreateStream(ass[Random(Length(FSymbols.WaitFor))]); rnd.Data := TDataStreamProvider.Create(3000, 1000, rnd.Stream); rnd.Labl := TLabel.Create(Self); rnd.Labl.Parent := FlowLayout; rnd.Labl.Align := TAlignLayout.None; rnd.Labl.WordWrap := false; rnd.Labl.Width := 300; rnd.Labl.Text := rnd.Stream.Symbol + ' loading...'; FRandom.Add(rnd); var Proc := procedure(idx: Integer) begin TFMXValidationState.Create( FRandom[idx].Labl, FRandom[idx].Stream.HasData, procedure begin var data := FRandom[idx].Data.Value; if data.Count > 0 then begin var dp := data[0]; FRandom[idx].Labl.Text := FRandom[idx].Stream.Symbol + ' ' + dp.Time.ToString + ' ' + data.TotalCount.ToString + ' ' + dp.Data.Ask.ToString; end; end ); end; Proc(FRandom.Count - 1); end; end.