Code-Formatting
This commit is contained in:
@@ -3,8 +3,15 @@ unit DynamicFMXControl;
|
||||
interface
|
||||
|
||||
uses
|
||||
System.SysUtils, System.Types, System.UITypes, System.Classes,
|
||||
FMX.Controls, FMX.Graphics, FMX.Forms, FMX.StdCtrls, FMX.Types;
|
||||
System.SysUtils,
|
||||
System.Types,
|
||||
System.UITypes,
|
||||
System.Classes,
|
||||
FMX.Controls,
|
||||
FMX.Graphics,
|
||||
FMX.Forms,
|
||||
FMX.StdCtrls,
|
||||
FMX.Types;
|
||||
|
||||
type
|
||||
// Dezidierte Event-Typen für virtuelle Methoden von TControl
|
||||
@@ -127,7 +134,8 @@ type
|
||||
property OnHasHint: TControlHasHintEvent read FHasHintEvent write FHasHintEvent;
|
||||
property OnCanShowHint: TControlCanShowHintEvent read FCanShowHintEvent write FCanShowHintEvent;
|
||||
property OnGetDefaultSize: TControlGetDefaultSizeEvent read FGetDefaultSizeEvent write FGetDefaultSizeEvent;
|
||||
property OnRecalculateAbsoluteMatrices: TControlNotifyEvent read FRecalculateAbsoluteMatricesEvent write FRecalculateAbsoluteMatricesEvent;
|
||||
property OnRecalculateAbsoluteMatrices: TControlNotifyEvent
|
||||
read FRecalculateAbsoluteMatricesEvent write FRecalculateAbsoluteMatricesEvent;
|
||||
property OnSetVisible: TControlSetVisibleEvent read FSetVisibleEvent write FSetVisibleEvent;
|
||||
property OnSetEnabled: TControlSetEnabledEvent read FSetEnabledEvent write FSetEnabledEvent;
|
||||
property OnDoAbsoluteChanged: TControlDoAbsoluteChangedEvent read FDoAbsoluteChangedEvent write FDoAbsoluteChangedEvent;
|
||||
|
||||
+28
-36
@@ -158,55 +158,45 @@ begin
|
||||
|
||||
var stateText := TWriteable<String>.CreateWriteable.Protect;
|
||||
var stateLabel := TLabel.Create(Self);
|
||||
AlignControl( stateLabel );
|
||||
AlignControl(stateLabel);
|
||||
|
||||
stateLabel.Text := 'Initializing...';
|
||||
|
||||
var chart := TMycChart.Create(Self);
|
||||
AlignControl( chart );
|
||||
chart.Height := Layout.ChildrenRect.Width*9/16;
|
||||
AlignControl(chart);
|
||||
chart.Height := Layout.ChildrenRect.Width * 9 / 16;
|
||||
chart.Lookback.Value := 50000;
|
||||
|
||||
/////
|
||||
|
||||
var OhlcPoint: ITicksToTimeframe := TTicksToTimeframe.Create( H1, stateText );
|
||||
var OhlcPoint: ITicksToTimeframe := TTicksToTimeframe.Create(H1, stateText);
|
||||
|
||||
var Ohlc: IMycConverter<TDataPoint<TOhlcItem>, TOhlcItem> := TMycGenericConverter<TDataPoint<TOhlcItem>, TOhlcItem>.Create(
|
||||
function( const Ohlc: TDataPoint<TOhlcItem> ): TOhlcItem
|
||||
begin
|
||||
Result := Ohlc.Data;
|
||||
end );
|
||||
var Ohlc: IMycConverter<TDataPoint<TOhlcItem>, TOhlcItem> :=
|
||||
TMycGenericConverter<TDataPoint<TOhlcItem>, TOhlcItem>
|
||||
.Create(function(const Ohlc: TDataPoint<TOhlcItem>): TOhlcItem begin Result := Ohlc.Data; end);
|
||||
|
||||
OhlcPoint.Sender.Link(Ohlc);
|
||||
|
||||
var Closes: IMycConverter<TOhlcItem, Double> := TMycGenericConverter<TOhlcItem, Double>.Create(
|
||||
function( const Ohlc: TOhlcItem ): Double
|
||||
begin
|
||||
Result := Ohlc.Close;
|
||||
end );
|
||||
var Closes: IMycConverter<TOhlcItem, Double> :=
|
||||
TMycGenericConverter<TOhlcItem, Double>.Create(function(const Ohlc: TOhlcItem): Double begin Result := Ohlc.Close; end);
|
||||
|
||||
Ohlc.Sender.Link( Closes );
|
||||
Ohlc.Sender.Link(Closes);
|
||||
|
||||
var Hull: IMycConverter<Double, Double> := THullMovingAverage.Create( 250 );
|
||||
var Hull: IMycConverter<Double, Double> := THullMovingAverage.Create(250);
|
||||
|
||||
Closes.Sender.Link( Hull );
|
||||
Closes.Sender.Link(Hull);
|
||||
|
||||
chart.AddDoubleSeries( Hull.Sender );
|
||||
chart.AddDoubleSeries(Hull.Sender);
|
||||
|
||||
var done := ExecuteStrategy( Symbol, OhlcPoint );
|
||||
var done := ExecuteStrategy(Symbol, OhlcPoint);
|
||||
|
||||
/////
|
||||
|
||||
stateLabel.ProcessSignal(
|
||||
stateText.Changed, done,
|
||||
procedure
|
||||
begin
|
||||
stateLabel.Text := stateText.Value;
|
||||
end );
|
||||
stateLabel.ProcessSignal(stateText.Changed, done, procedure begin stateLabel.Text := stateText.Value; end);
|
||||
|
||||
FProcessDone := TState.All([FProcessDone, done]);
|
||||
|
||||
chart.AddOhlcSeries( OhlcPoint.Sender );
|
||||
chart.AddOhlcSeries(OhlcPoint.Sender);
|
||||
end;
|
||||
|
||||
procedure TForm1.TreeViewDblClick(Sender: TObject);
|
||||
@@ -272,7 +262,6 @@ 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;
|
||||
ChartButton.Enabled := false;
|
||||
LoadButton.Enabled := false;
|
||||
@@ -418,7 +407,7 @@ begin
|
||||
|
||||
Control.Parent := Layout;
|
||||
Control.Width := Layout.Width;
|
||||
Control.Position.Y := Layout.ChildrenRect.Bottom+1;
|
||||
Control.Position.Y := Layout.ChildrenRect.Bottom + 1;
|
||||
Control.Anchors := [TAnchorKind.akLeft, TAnchorKind.akRight];
|
||||
Control.Align := TAlignLayout.Top;
|
||||
end;
|
||||
@@ -471,7 +460,8 @@ begin
|
||||
PathData.ClosePath;
|
||||
|
||||
currPathData.Value := TObjectRef<TPathData>.Create(PathData);
|
||||
end )
|
||||
end
|
||||
)
|
||||
);
|
||||
end
|
||||
);
|
||||
@@ -520,21 +510,23 @@ var
|
||||
begin
|
||||
var terminated := TFlag.CreateObserver(FTerminate.Signal).State;
|
||||
|
||||
dataProvider := TMycGenericConverter<TArray<TDataPoint<TAuraAskBidFileItem>>, TArray<TDataPoint<TAskBidItem>>>.Create(
|
||||
function( const Values: TArray<TDataPoint<TAuraAskBidFileItem>> ): TArray<TDataPoint<TAskBidItem>>
|
||||
dataProvider :=
|
||||
TMycGenericConverter<TArray<TDataPoint<TAuraAskBidFileItem>>, TArray<TDataPoint<TAskBidItem>>>.Create(
|
||||
function(const Values: TArray<TDataPoint<TAuraAskBidFileItem>>): TArray<TDataPoint<TAskBidItem>>
|
||||
begin
|
||||
SetLength( Result, Length( Values ) );
|
||||
for var i:=0 to High(Result) do
|
||||
SetLength(Result, Length(Values));
|
||||
for var i := 0 to High(Result) do
|
||||
begin
|
||||
Result[i].Time := Values[i].Time;
|
||||
Result[i].Data.Ask := Values[i].Data.Ask;
|
||||
Result[i].Data.Bid := Values[i].Data.Bid;
|
||||
end;
|
||||
end );
|
||||
end
|
||||
);
|
||||
|
||||
dataProvider.Sender.Link( Processor );
|
||||
dataProvider.Sender.Link(Processor);
|
||||
|
||||
Result := FServer.ProcessData( Symbol, terminated, dataProvider );
|
||||
Result := FServer.ProcessData(Symbol, terminated, dataProvider);
|
||||
end;
|
||||
|
||||
function TForm1.SelectedSymbol: String;
|
||||
|
||||
@@ -6,7 +6,7 @@ uses
|
||||
Myc.Aura.Module;
|
||||
|
||||
type
|
||||
TTestModule = class( TMycAuraNode, IAuraModule )
|
||||
TTestModule = class(TMycAuraNode, IAuraModule)
|
||||
private
|
||||
FId: Integer;
|
||||
public
|
||||
|
||||
@@ -3,18 +3,21 @@ unit LLVM.Runner;
|
||||
interface
|
||||
|
||||
uses
|
||||
System.SysUtils, Winapi.Windows, System.Classes;
|
||||
System.SysUtils,
|
||||
Winapi.Windows,
|
||||
System.Classes;
|
||||
|
||||
type
|
||||
// Callback-Prozedur, die von der DLL aufgerufen wird
|
||||
TLogIntegerCallback = procedure( AValue: Integer ); stdcall;
|
||||
TLogIntegerCallback = procedure(AValue: Integer); stdcall;
|
||||
|
||||
// NEU: Typ für die Host-Additionsfunktion
|
||||
THostAddIntegersCallback = function( ANum1: Integer; ANum2: Integer ): Integer; stdcall;
|
||||
THostAddIntegersCallback = function(ANum1: Integer; ANum2: Integer): Integer; stdcall;
|
||||
|
||||
// NEUE, VEREINFACHTE Signatur der exportierten DLL-Funktion
|
||||
// Jetzt nur noch der Log-Callback und der neue Integer-Input-Parameter
|
||||
TStarteLogikProc = procedure(
|
||||
TStarteLogikProc =
|
||||
procedure(
|
||||
ALogIntProc: TLogIntegerCallback;
|
||||
AHostInputInteger: Integer;
|
||||
AHostAddIntegersProc: THostAddIntegersCallback // <--- Der neue Host-Unterprogramm-Parameter
|
||||
@@ -27,13 +30,13 @@ type
|
||||
FStarteLogik: TStarteLogikProc;
|
||||
class var
|
||||
FLog: TStrings;
|
||||
class procedure LogInteger( AValue: Integer ); static; stdcall;
|
||||
class procedure LogInteger(AValue: Integer); static; stdcall;
|
||||
// NEU: Host-Unterprogramm-Implementierung
|
||||
class function HostAddIntegers( ANum1: Integer; ANum2: Integer ): Integer; static; stdcall;
|
||||
class function HostAddIntegers(ANum1: Integer; ANum2: Integer): Integer; static; stdcall;
|
||||
public
|
||||
constructor Create(const ADLLPath: string);
|
||||
destructor Destroy; override;
|
||||
procedure Execute( AInputInteger: Integer );
|
||||
procedure Execute(AInputInteger: Integer);
|
||||
class property Log: TStrings read FLog write FLog;
|
||||
end;
|
||||
|
||||
@@ -44,24 +47,24 @@ implementation
|
||||
constructor TLLVMRunner.Create(const ADLLPath: string);
|
||||
begin
|
||||
inherited Create;
|
||||
FModule := LoadLibrary( PChar( ADLLPath ) );
|
||||
FModule := LoadLibrary(PChar(ADLLPath));
|
||||
if FModule = 0 then
|
||||
raise Exception.Create( 'Failed to load DLL.' );
|
||||
raise Exception.Create('Failed to load DLL.');
|
||||
|
||||
FStarteLogik := GetProcAddress( FModule, 'StarteLogik' );
|
||||
if not Assigned( FStarteLogik ) then
|
||||
raise Exception.Create( 'Procedure "StarteLogik" not found in DLL.' );
|
||||
FStarteLogik := GetProcAddress(FModule, 'StarteLogik');
|
||||
if not Assigned(FStarteLogik) then
|
||||
raise Exception.Create('Procedure "StarteLogik" not found in DLL.');
|
||||
end;
|
||||
|
||||
destructor TLLVMRunner.Destroy;
|
||||
begin
|
||||
if FModule <> 0 then
|
||||
FreeLibrary( FModule );
|
||||
FreeLibrary(FModule);
|
||||
inherited;
|
||||
end;
|
||||
|
||||
// NEUE Implementierung der Host-Funktion
|
||||
class function TLLVMRunner.HostAddIntegers( ANum1: Integer; ANum2: Integer ): Integer;
|
||||
class function TLLVMRunner.HostAddIntegers(ANum1: Integer; ANum2: Integer): Integer;
|
||||
begin
|
||||
Result := ANum1 + ANum2; // Die eigentliche Logik
|
||||
if Assigned(FLog) then
|
||||
@@ -69,9 +72,9 @@ begin
|
||||
end;
|
||||
|
||||
// Die Execute-Methode muss angepasst werden, um den neuen Funktionszeiger zu übergeben
|
||||
procedure TLLVMRunner.Execute( AInputInteger: Integer );
|
||||
procedure TLLVMRunner.Execute(AInputInteger: Integer);
|
||||
begin
|
||||
if Assigned( FStarteLogik ) then
|
||||
if Assigned(FStarteLogik) then
|
||||
FStarteLogik(
|
||||
LogInteger,
|
||||
AInputInteger,
|
||||
@@ -80,10 +83,10 @@ begin
|
||||
end;
|
||||
|
||||
// Dies ist die Methode, die die DLL für LogInteger aufruft.
|
||||
class procedure TLLVMRunner.LogInteger( AValue: Integer );
|
||||
class procedure TLLVMRunner.LogInteger(AValue: Integer);
|
||||
begin
|
||||
if Assigned( FLog ) then
|
||||
FLog.Add( Format( 'DLL logged integer: %d', [AValue] ) );
|
||||
if Assigned(FLog) then
|
||||
FLog.Add(Format('DLL logged integer: %d', [AValue]));
|
||||
end;
|
||||
|
||||
// Die Implementierungen von GetCurrentDateTimeUTCHost und GetComponentInZoneHost
|
||||
|
||||
+118
-139
@@ -3,12 +3,32 @@ unit MainUnit;
|
||||
interface
|
||||
|
||||
uses
|
||||
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
|
||||
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.WebBrowser,
|
||||
Winapi.WebView2, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, FMX.Edit, FMX.StdActns,
|
||||
System.SysUtils,
|
||||
System.Types,
|
||||
System.UITypes,
|
||||
System.Classes,
|
||||
System.Variants,
|
||||
FMX.Types,
|
||||
FMX.Controls,
|
||||
FMX.Forms,
|
||||
FMX.Graphics,
|
||||
FMX.Dialogs,
|
||||
FMX.Controls.Presentation,
|
||||
FMX.StdCtrls,
|
||||
FMX.WebBrowser,
|
||||
Winapi.WebView2,
|
||||
FMX.Memo.Types,
|
||||
FMX.ScrollBox,
|
||||
FMX.Memo,
|
||||
FMX.Edit,
|
||||
FMX.StdActns,
|
||||
// FMX.Edit für TEdit, FMX.StdActns oft für Standardaktionen
|
||||
// Korrekte und vollständige Units
|
||||
System.IOUtils, System.Threading, System.Diagnostics, Winapi.Windows, LLVM.Runner;
|
||||
System.IOUtils,
|
||||
System.Threading,
|
||||
System.Diagnostics,
|
||||
Winapi.Windows,
|
||||
LLVM.Runner;
|
||||
|
||||
const
|
||||
// Pfad zur HTML-Datei (BITTE HIER ANPASSEN!)
|
||||
@@ -19,25 +39,25 @@ const
|
||||
LLD_PATH = 'lld-link.exe'; // <--- PRÜFEN UND ANPASSEN!
|
||||
|
||||
type
|
||||
TMainForm = class( TForm )
|
||||
TMainForm = class(TForm)
|
||||
WebBrowser1: TWebBrowser;
|
||||
SaveWorkspaceButton: TSpeedButton;
|
||||
GenerateCodeButton: TSpeedButton;
|
||||
Memo: TMemo;
|
||||
InputEdit: TEdit; // <--- Hinzugefügt (Optional für Beschriftung des InputEdit)
|
||||
procedure FormCreate( Sender: TObject );
|
||||
procedure FormDestroy( Sender: TObject );
|
||||
procedure RefreshButtonClick( Sender: TObject );
|
||||
procedure SaveWorkspaceButtonClick( Sender: TObject );
|
||||
procedure GenerateCodeButtonClick( Sender: TObject );
|
||||
procedure WebBrowser1DidFinishLoad( ASender: TObject );
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure FormDestroy(Sender: TObject);
|
||||
procedure RefreshButtonClick(Sender: TObject);
|
||||
procedure SaveWorkspaceButtonClick(Sender: TObject);
|
||||
procedure GenerateCodeButtonClick(Sender: TObject);
|
||||
procedure WebBrowser1DidFinishLoad(ASender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
FWebView: ICoreWebView2;
|
||||
FWebMessageReceiver: ICoreWebView2WebMessageReceivedEventHandler;
|
||||
FWebMessageReceivedToken: EventRegistrationToken;
|
||||
procedure HandleWebMessage( const AMessage: string );
|
||||
function ExecuteProcess( const ACommand: string; const AParameters: string ): string;
|
||||
procedure HandleWebMessage(const AMessage: string);
|
||||
function ExecuteProcess(const ACommand: string; const AParameters: string): string;
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
@@ -49,55 +69,50 @@ implementation
|
||||
|
||||
{$R *.fmx}
|
||||
|
||||
|
||||
type
|
||||
TWebMessageReceiver = class( TInterfacedObject, ICoreWebView2WebMessageReceivedEventHandler )
|
||||
TWebMessageReceiver = class(TInterfacedObject, ICoreWebView2WebMessageReceivedEventHandler)
|
||||
private
|
||||
FOwner: TMainForm;
|
||||
public
|
||||
constructor Create( AOwner: TMainForm );
|
||||
function Invoke( const Sender: ICoreWebView2; const args: ICoreWebView2WebMessageReceivedEventArgs ): HResult; stdcall;
|
||||
constructor Create(AOwner: TMainForm);
|
||||
function Invoke(const Sender: ICoreWebView2; const args: ICoreWebView2WebMessageReceivedEventArgs): HResult; stdcall;
|
||||
end;
|
||||
|
||||
constructor TWebMessageReceiver.Create( AOwner: TMainForm );
|
||||
constructor TWebMessageReceiver.Create(AOwner: TMainForm);
|
||||
begin
|
||||
inherited Create;
|
||||
FOwner := AOwner;
|
||||
end;
|
||||
|
||||
function TWebMessageReceiver.Invoke( const Sender: ICoreWebView2; const args: ICoreWebView2WebMessageReceivedEventArgs ): HResult;
|
||||
function TWebMessageReceiver.Invoke(const Sender: ICoreWebView2; const args: ICoreWebView2WebMessageReceivedEventArgs): HResult;
|
||||
var
|
||||
message: PWideChar;
|
||||
begin
|
||||
Result := args.TryGetWebMessageAsString( message );
|
||||
if Succeeded( Result ) then
|
||||
Result := args.TryGetWebMessageAsString(message);
|
||||
if Succeeded(Result) then
|
||||
begin
|
||||
TThread.Queue( nil,
|
||||
procedure
|
||||
begin
|
||||
FOwner.HandleWebMessage( string( message ) );
|
||||
end );
|
||||
TThread.Queue(nil, procedure begin FOwner.HandleWebMessage(string(message)); end);
|
||||
end;
|
||||
Result := S_OK;
|
||||
end;
|
||||
|
||||
procedure TMainForm.FormCreate( Sender: TObject );
|
||||
procedure TMainForm.FormCreate(Sender: TObject);
|
||||
begin
|
||||
TLLVMRunner.Log := Memo.Lines;
|
||||
// Optional: Standardwert für InputEdit
|
||||
InputEdit.Text := '123';
|
||||
end;
|
||||
|
||||
procedure TMainForm.FormDestroy( Sender: TObject );
|
||||
procedure TMainForm.FormDestroy(Sender: TObject);
|
||||
begin
|
||||
TLLVMRunner.Log := nil;
|
||||
if ( FWebView <> nil ) and ( FWebMessageReceivedToken.value <> 0 ) then
|
||||
if (FWebView <> nil) and (FWebMessageReceivedToken.value <> 0) then
|
||||
begin
|
||||
FWebView.remove_WebMessageReceived( FWebMessageReceivedToken );
|
||||
FWebView.remove_WebMessageReceived(FWebMessageReceivedToken);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TMainForm.ExecuteProcess( const ACommand: string; const AParameters: string ): string;
|
||||
function TMainForm.ExecuteProcess(const ACommand: string; const AParameters: string): string;
|
||||
var
|
||||
sa: TSecurityAttributes;
|
||||
si: TStartupInfo;
|
||||
@@ -110,63 +125,52 @@ var
|
||||
output, errors: string;
|
||||
begin
|
||||
// Pipe für StdOut und StdErr erstellen
|
||||
sa.nLength := SizeOf( TSecurityAttributes );
|
||||
sa.nLength := SizeOf(TSecurityAttributes);
|
||||
sa.lpSecurityDescriptor := nil;
|
||||
sa.bInheritHandle := True;
|
||||
|
||||
// Für stdout und stderr wird dieselbe Pipe verwendet, da clang Fehler auf stdout ausgibt
|
||||
if not CreatePipe( stdOutRead, stdOutWrite, @sa, 0 ) then
|
||||
Exit( 'Error creating pipe.' );
|
||||
if not CreatePipe(stdOutRead, stdOutWrite, @sa, 0) then
|
||||
Exit('Error creating pipe.');
|
||||
|
||||
try
|
||||
// StartupInfo vorbereiten
|
||||
FillChar( si, SizeOf( TStartupInfo ), 0 );
|
||||
si.cb := SizeOf( TStartupInfo );
|
||||
FillChar(si, SizeOf(TStartupInfo), 0);
|
||||
si.cb := SizeOf(TStartupInfo);
|
||||
si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
|
||||
si.wShowWindow := SW_HIDE; // Fenster explizit verstecken
|
||||
si.hStdInput := GetStdHandle( STD_INPUT_HANDLE );
|
||||
si.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
|
||||
si.hStdOutput := stdOutWrite;
|
||||
si.hStdError := stdOutWrite; // Leite stderr auf dieselbe Pipe wie stdout
|
||||
|
||||
cmdLine := Format( '"%s" %s', [ACommand, AParameters] );
|
||||
cmdLine := Format('"%s" %s', [ACommand, AParameters]);
|
||||
|
||||
success := CreateProcess(
|
||||
nil,
|
||||
PChar( cmdLine ),
|
||||
nil,
|
||||
nil,
|
||||
True,
|
||||
CREATE_NO_WINDOW,
|
||||
nil,
|
||||
nil,
|
||||
si,
|
||||
pi
|
||||
);
|
||||
success := CreateProcess(nil, PChar(cmdLine), nil, nil, True, CREATE_NO_WINDOW, nil, nil, si, pi);
|
||||
|
||||
// Schreib-Handle der Pipe sofort schließen
|
||||
CloseHandle( stdOutWrite );
|
||||
CloseHandle(stdOutWrite);
|
||||
|
||||
if not success then
|
||||
Exit( Format( 'CreateProcess failed. Code: %d', [GetLastError] ) );
|
||||
Exit(Format('CreateProcess failed. Code: %d', [GetLastError]));
|
||||
|
||||
try
|
||||
output := '';
|
||||
// Warten, bis der Prozess fertig ist und alle Daten in die Pipe geschrieben hat
|
||||
if WaitForSingleObject( pi.hProcess, 5000 ) = WAIT_TIMEOUT then // 5s Timeout
|
||||
if WaitForSingleObject(pi.hProcess, 5000) = WAIT_TIMEOUT then // 5s Timeout
|
||||
begin
|
||||
TerminateProcess( pi.hProcess, 1 );
|
||||
Exit( 'Process timed out.' );
|
||||
TerminateProcess(pi.hProcess, 1);
|
||||
Exit('Process timed out.');
|
||||
end;
|
||||
|
||||
// Bytes aus der Pipe lesen
|
||||
repeat
|
||||
SetLength( buffer, 1024 );
|
||||
SetLength(buffer, 1024);
|
||||
bytesRead := 0;
|
||||
if ReadFile( stdOutRead, buffer[0], Length( buffer ), bytesRead, nil ) and ( bytesRead > 0 ) then
|
||||
if ReadFile(stdOutRead, buffer[0], Length(buffer), bytesRead, nil) and (bytesRead > 0) then
|
||||
begin
|
||||
SetLength( buffer, bytesRead );
|
||||
SetLength(buffer, bytesRead);
|
||||
// Gelesene Bytes mit dem Default-System-Encoding in einen String umwandeln
|
||||
output := output + TEncoding.Default.GetString( buffer );
|
||||
output := output + TEncoding.Default.GetString(buffer);
|
||||
end
|
||||
else
|
||||
begin
|
||||
@@ -175,33 +179,33 @@ begin
|
||||
until False;
|
||||
|
||||
finally
|
||||
CloseHandle( pi.hProcess );
|
||||
CloseHandle( pi.hThread );
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(pi.hThread);
|
||||
end;
|
||||
|
||||
Result := output;
|
||||
|
||||
finally
|
||||
CloseHandle( stdOutRead );
|
||||
CloseHandle(stdOutRead);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TMainForm.RefreshButtonClick( Sender: TObject );
|
||||
procedure TMainForm.RefreshButtonClick(Sender: TObject);
|
||||
begin
|
||||
WebBrowser1.Navigate( PATH_BLOCKLY );
|
||||
WebBrowser1.Navigate(PATH_BLOCKLY);
|
||||
end;
|
||||
|
||||
procedure TMainForm.SaveWorkspaceButtonClick( Sender: TObject );
|
||||
procedure TMainForm.SaveWorkspaceButtonClick(Sender: TObject);
|
||||
begin
|
||||
WebBrowser1.EvaluateJavaScript( 'saveWorkspace()' );
|
||||
WebBrowser1.EvaluateJavaScript('saveWorkspace()');
|
||||
end;
|
||||
|
||||
procedure TMainForm.GenerateCodeButtonClick( Sender: TObject );
|
||||
procedure TMainForm.GenerateCodeButtonClick(Sender: TObject);
|
||||
begin
|
||||
WebBrowser1.EvaluateJavaScript( 'generateAndPostCode()' );
|
||||
WebBrowser1.EvaluateJavaScript('generateAndPostCode()');
|
||||
end;
|
||||
|
||||
procedure TMainForm.HandleWebMessage( const AMessage: string );
|
||||
procedure TMainForm.HandleWebMessage(const AMessage: string);
|
||||
var
|
||||
llFile, objFile, dllFile: string;
|
||||
compilerOutput: string;
|
||||
@@ -209,16 +213,16 @@ var
|
||||
InputInteger: Integer; // <--- Hinzugefügt
|
||||
begin
|
||||
Memo.Lines.Clear;
|
||||
Memo.Lines.Add( 'LLVM-Code empfangen. Starte Kompilierung...' );
|
||||
Memo.Lines.Add( AMessage );
|
||||
Memo.Lines.Add( '--------------------' );
|
||||
Memo.Lines.Add('LLVM-Code empfangen. Starte Kompilierung...');
|
||||
Memo.Lines.Add(AMessage);
|
||||
Memo.Lines.Add('--------------------');
|
||||
|
||||
// Wert aus dem InputEdit-Feld holen
|
||||
try
|
||||
InputInteger := StrToIntDef( InputEdit.Text, 0 ); // Standardwert 0, falls ungültig
|
||||
InputInteger := StrToIntDef(InputEdit.Text, 0); // Standardwert 0, falls ungültig
|
||||
except
|
||||
InputInteger := 0;
|
||||
Memo.Lines.Add( 'WARNUNG: Ungültige Eingabe im InputEdit-Feld. Verwende 0.' );
|
||||
Memo.Lines.Add('WARNUNG: Ungültige Eingabe im InputEdit-Feld. Verwende 0.');
|
||||
end;
|
||||
|
||||
TTask.Run(
|
||||
@@ -228,107 +232,82 @@ begin
|
||||
compilerOutputLocal: string;
|
||||
successLocal: Boolean;
|
||||
begin
|
||||
llFileLocal := TPath.Combine( TPath.GetTempPath, 'poc.ll' );
|
||||
objFileLocal := TPath.ChangeExtension( llFileLocal, '.obj' );
|
||||
dllFileLocal := TPath.ChangeExtension( llFileLocal, '.dll' );
|
||||
llFileLocal := TPath.Combine(TPath.GetTempPath, 'poc.ll');
|
||||
objFileLocal := TPath.ChangeExtension(llFileLocal, '.obj');
|
||||
dllFileLocal := TPath.ChangeExtension(llFileLocal, '.dll');
|
||||
successLocal := False;
|
||||
|
||||
try
|
||||
TFile.WriteAllText( llFileLocal, AMessage );
|
||||
TFile.WriteAllText(llFileLocal, AMessage);
|
||||
|
||||
TThread.Queue( nil,
|
||||
procedure
|
||||
begin
|
||||
Memo.Lines.Add( 'Kompiliere zu Objektdatei...' );
|
||||
end );
|
||||
compilerOutputLocal := ExecuteProcess( CLANG_PATH, Format( '-c "%s" -o "%s"', [llFileLocal, objFileLocal] ) );
|
||||
TThread.Queue( nil,
|
||||
procedure
|
||||
begin
|
||||
Memo.Lines.Add( compilerOutputLocal );
|
||||
end );
|
||||
TThread.Queue(nil, procedure begin Memo.Lines.Add('Kompiliere zu Objektdatei...'); end);
|
||||
compilerOutputLocal := ExecuteProcess(CLANG_PATH, Format('-c "%s" -o "%s"', [llFileLocal, objFileLocal]));
|
||||
TThread.Queue(nil, procedure begin Memo.Lines.Add(compilerOutputLocal); end);
|
||||
|
||||
if not TFile.Exists( objFileLocal ) then
|
||||
if not TFile.Exists(objFileLocal) then
|
||||
begin
|
||||
TThread.Queue( nil,
|
||||
procedure
|
||||
begin
|
||||
Memo.Lines.Add( 'FEHLER: Kompilierung fehlgeschlagen. .obj-Datei nicht erstellt.' );
|
||||
end );
|
||||
TThread
|
||||
.Queue(nil, procedure begin Memo.Lines.Add('FEHLER: Kompilierung fehlgeschlagen. .obj-Datei nicht erstellt.'); end);
|
||||
Exit;
|
||||
end;
|
||||
|
||||
TThread.Queue( nil,
|
||||
procedure
|
||||
begin
|
||||
Memo.Lines.Add( 'Linke zu DLL...' );
|
||||
end );
|
||||
compilerOutputLocal := ExecuteProcess( LLD_PATH, Format( '/dll /noentry "%s" /out:"%s"', [objFileLocal, dllFileLocal] ) );
|
||||
TThread.Queue( nil,
|
||||
procedure
|
||||
begin
|
||||
Memo.Lines.Add( compilerOutputLocal );
|
||||
end );
|
||||
TThread.Queue(nil, procedure begin Memo.Lines.Add('Linke zu DLL...'); end);
|
||||
compilerOutputLocal := ExecuteProcess(LLD_PATH, Format('/dll /noentry "%s" /out:"%s"', [objFileLocal, dllFileLocal]));
|
||||
TThread.Queue(nil, procedure begin Memo.Lines.Add(compilerOutputLocal); end);
|
||||
|
||||
if TFile.Exists( dllFileLocal ) then
|
||||
if TFile.Exists(dllFileLocal) then
|
||||
begin
|
||||
successLocal := True;
|
||||
TThread.Queue( nil,
|
||||
procedure
|
||||
begin
|
||||
Memo.Lines.Add( Format( 'ERFOLG: DLL wurde erstellt: %s', [dllFileLocal] ) );
|
||||
end );
|
||||
TThread.Queue(nil, procedure begin Memo.Lines.Add(Format('ERFOLG: DLL wurde erstellt: %s', [dllFileLocal])); end);
|
||||
end
|
||||
else
|
||||
begin
|
||||
TThread.Queue( nil,
|
||||
procedure
|
||||
begin
|
||||
Memo.Lines.Add( 'FEHLER: Linken fehlgeschlagen. .dll-Datei nicht erstellt.' );
|
||||
end );
|
||||
TThread.Queue(nil, procedure begin Memo.Lines.Add('FEHLER: Linken fehlgeschlagen. .dll-Datei nicht erstellt.'); end);
|
||||
end;
|
||||
|
||||
finally
|
||||
if TFile.Exists( llFileLocal ) then
|
||||
TFile.Delete( llFileLocal );
|
||||
if TFile.Exists( objFileLocal ) then
|
||||
TFile.Delete( objFileLocal );
|
||||
if not successLocal and TFile.Exists( dllFileLocal ) then
|
||||
TFile.Delete( dllFileLocal );
|
||||
if TFile.Exists(llFileLocal) then
|
||||
TFile.Delete(llFileLocal);
|
||||
if TFile.Exists(objFileLocal) then
|
||||
TFile.Delete(objFileLocal);
|
||||
if not successLocal and TFile.Exists(dllFileLocal) then
|
||||
TFile.Delete(dllFileLocal);
|
||||
end;
|
||||
|
||||
TThread.Queue( nil,
|
||||
TThread.Queue(
|
||||
nil,
|
||||
procedure
|
||||
begin
|
||||
Memo.Lines.Add( '---------------------------------------------------------' );
|
||||
Memo.Lines.Add( 'DLL wird aufgerufen:' );
|
||||
Memo.Lines.Add('---------------------------------------------------------');
|
||||
Memo.Lines.Add('DLL wird aufgerufen:');
|
||||
|
||||
if TFile.Exists( dllFileLocal ) then
|
||||
if TFile.Exists(dllFileLocal) then
|
||||
begin
|
||||
var
|
||||
Runner := TLLVMRunner.Create( dllFileLocal );
|
||||
var Runner := TLLVMRunner.Create(dllFileLocal);
|
||||
try
|
||||
Runner.Execute( InputInteger ); // <--- HIER DEN INPUT-PARAMETER ÜBERGEBEN
|
||||
Runner.Execute(InputInteger); // <--- HIER DEN INPUT-PARAMETER ÜBERGEBEN
|
||||
finally
|
||||
Runner.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
Memo.Lines.Add( 'DLL beendet.' );
|
||||
Memo.CaretPosition := TCaretPosition.Create( Memo.Lines.Count-1, 1 );
|
||||
end );
|
||||
end );
|
||||
Memo.Lines.Add('DLL beendet.');
|
||||
Memo.CaretPosition := TCaretPosition.Create(Memo.Lines.Count - 1, 1);
|
||||
end
|
||||
);
|
||||
end
|
||||
);
|
||||
end;
|
||||
|
||||
procedure TMainForm.WebBrowser1DidFinishLoad( ASender: TObject );
|
||||
procedure TMainForm.WebBrowser1DidFinishLoad(ASender: TObject);
|
||||
begin
|
||||
if Assigned( FWebMessageReceiver ) then
|
||||
if Assigned(FWebMessageReceiver) then
|
||||
Exit;
|
||||
|
||||
if Supports( WebBrowser1, ICoreWebView2, FWebView ) then
|
||||
if Supports(WebBrowser1, ICoreWebView2, FWebView) then
|
||||
begin
|
||||
FWebMessageReceiver := TWebMessageReceiver.Create( Self );
|
||||
FWebView.add_WebMessageReceived( FWebMessageReceiver, FWebMessageReceivedToken );
|
||||
FWebMessageReceiver := TWebMessageReceiver.Create(Self);
|
||||
FWebView.add_WebMessageReceived(FWebMessageReceiver, FWebMessageReceivedToken);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@@ -2,7 +2,8 @@ unit ApiKey;
|
||||
|
||||
interface
|
||||
|
||||
const Value = 'AIzaSyALccoMxn0_wcHswavhu5rzdglLeH6gVlI';
|
||||
const
|
||||
Value = 'AIzaSyALccoMxn0_wcHswavhu5rzdglLeH6gVlI';
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
@@ -3,10 +3,24 @@ unit MainUnit;
|
||||
interface
|
||||
|
||||
uses
|
||||
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
|
||||
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
|
||||
System.Net.HttpClient, System.Net.HttpClientComponent, System.JSON, System.Net.Mime, Vcl.AppEvnts,
|
||||
Myc.Futures, System.Generics.Collections, ApiKey;
|
||||
Winapi.Windows,
|
||||
Winapi.Messages,
|
||||
System.SysUtils,
|
||||
System.Variants,
|
||||
System.Classes,
|
||||
Vcl.Graphics,
|
||||
Vcl.Controls,
|
||||
Vcl.Forms,
|
||||
Vcl.Dialogs,
|
||||
Vcl.StdCtrls,
|
||||
System.Net.HttpClient,
|
||||
System.Net.HttpClientComponent,
|
||||
System.JSON,
|
||||
System.Net.Mime,
|
||||
Vcl.AppEvnts,
|
||||
Myc.Futures,
|
||||
System.Generics.Collections,
|
||||
ApiKey;
|
||||
|
||||
type
|
||||
// NEU: Ein Record, um einen einzelnen Redebeitrag in der Konversation zu speichern
|
||||
@@ -127,7 +141,8 @@ begin
|
||||
AnswerMemo.Lines.Add(userPrompt);
|
||||
AnswerMemo.Lines.Add('... sende Anfrage an Gemini ...');
|
||||
|
||||
FAnswer := TFuture<string>.Construct(
|
||||
FAnswer :=
|
||||
TFuture<string>.Construct(
|
||||
function: string
|
||||
var
|
||||
jsonRequest: TJSONObject;
|
||||
@@ -172,18 +187,27 @@ begin
|
||||
begin
|
||||
responseJson := TJSONObject.ParseJSONValue(response.ContentAsString(TEncoding.UTF8));
|
||||
try
|
||||
Result := responseJson.GetValue<TJSONArray>('candidates')
|
||||
.Items[0].GetValue<TJSONObject>('content')
|
||||
Result :=
|
||||
responseJson
|
||||
.GetValue<TJSONArray>('candidates')
|
||||
.Items[0]
|
||||
.GetValue<TJSONObject>('content')
|
||||
.GetValue<TJSONArray>('parts')
|
||||
.Items[0].GetValue<string>('text');
|
||||
.Items[0]
|
||||
.GetValue<string>('text');
|
||||
finally
|
||||
responseJson.Free;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Result := 'Fehler! Status: ' + response.StatusCode.ToString + ' - ' + response.StatusText +
|
||||
sLineBreak + response.ContentAsString;
|
||||
Result :=
|
||||
'Fehler! Status: '
|
||||
+ response.StatusCode.ToString
|
||||
+ ' - '
|
||||
+ response.StatusText
|
||||
+ sLineBreak
|
||||
+ response.ContentAsString;
|
||||
end;
|
||||
finally
|
||||
requestBody.Free;
|
||||
@@ -197,8 +221,8 @@ begin
|
||||
Result := '--- FEHLER IM TASK ---' + sLineBreak + E.Message;
|
||||
end;
|
||||
end;
|
||||
end);
|
||||
end
|
||||
);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
||||
@@ -87,7 +87,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{ TUnitInfo implementation }
|
||||
constructor TUnitInfo.Create(const AFilePath: string);
|
||||
begin
|
||||
@@ -141,7 +140,7 @@ begin
|
||||
if (currentChar = #13) or (currentChar = #10) then
|
||||
begin
|
||||
inLineComment := False;
|
||||
if (Builder.Length > 0) and (Builder[Builder.Length-1] <> ' ') and (Builder[Builder.Length-1] <> ',') then
|
||||
if (Builder.Length > 0) and (Builder[Builder.Length - 1] <> ' ') and (Builder[Builder.Length - 1] <> ',') then
|
||||
Builder.Append(' ');
|
||||
end;
|
||||
Inc(i);
|
||||
@@ -189,7 +188,7 @@ begin
|
||||
end;
|
||||
if (currentChar = #13) or (currentChar = #10) or (currentChar = #9) then
|
||||
begin
|
||||
if (Builder.Length = 0) or ((Builder.Length > 0) and (Builder[Builder.Length-1] <> ' ')) then
|
||||
if (Builder.Length = 0) or ((Builder.Length > 0) and (Builder[Builder.Length - 1] <> ' ')) then
|
||||
Builder.Append(' ');
|
||||
Inc(i);
|
||||
end
|
||||
@@ -588,7 +587,13 @@ begin
|
||||
outputFileName := ParamStr(currentParamIndex + 1);
|
||||
Inc(currentParamIndex, 2);
|
||||
end
|
||||
else begin WriteLn('Error: Missing filename after -o option.'); WriteLn(usageStr); exitcode := 1; exit; end;
|
||||
else
|
||||
begin
|
||||
WriteLn('Error: Missing filename after -o option.');
|
||||
WriteLn(usageStr);
|
||||
exitcode := 1;
|
||||
exit;
|
||||
end;
|
||||
end
|
||||
else if SameText(currentParam, '-dirs') then
|
||||
begin
|
||||
@@ -610,12 +615,23 @@ begin
|
||||
WriteLn('Warning: File specified with -dirs not found: ' + dirsFileName);
|
||||
Inc(currentParamIndex, 2);
|
||||
end
|
||||
else begin WriteLn('Error: Missing filename after -dirs option.'); WriteLn(usageStr); exitcode := 1; exit; end;
|
||||
else
|
||||
begin
|
||||
WriteLn('Error: Missing filename after -dirs option.');
|
||||
WriteLn(usageStr);
|
||||
exitcode := 1;
|
||||
exit;
|
||||
end;
|
||||
end
|
||||
else if SameText(currentParam, '-f') or SameText(currentParam, '-fx') then
|
||||
begin
|
||||
if focusMode then
|
||||
begin WriteLn('Error: -f and -fx options cannot be used together.'); WriteLn(usageStr); exitcode := 1; exit; end;
|
||||
begin
|
||||
WriteLn('Error: -f and -fx options cannot be used together.');
|
||||
WriteLn(usageStr);
|
||||
exitcode := 1;
|
||||
exit;
|
||||
end;
|
||||
|
||||
if currentParamIndex + 1 <= ParamCount then
|
||||
begin
|
||||
@@ -626,12 +642,18 @@ begin
|
||||
filesToExcludeFromOutput.Text := initialFocusFiles.Text;
|
||||
Inc(currentParamIndex, 2);
|
||||
end
|
||||
else begin WriteLn('Error: Missing file list after ' + currentParam + ' option.'); WriteLn(usageStr); exitcode := 1; exit; end;
|
||||
else
|
||||
begin
|
||||
WriteLn('Error: Missing file list after ' + currentParam + ' option.');
|
||||
WriteLn(usageStr);
|
||||
exitcode := 1;
|
||||
exit;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
sourceDirectories.Add(currentParam);
|
||||
inc( currentParamIndex );
|
||||
inc(currentParamIndex);
|
||||
end;
|
||||
end;
|
||||
|
||||
@@ -650,7 +672,6 @@ begin
|
||||
Dec(i);
|
||||
end;
|
||||
|
||||
|
||||
if writeToClipboard and (outputFileName <> '') then
|
||||
begin
|
||||
WriteLn('Error: -o (output to file) and -c (output to clipboard) cannot be used together.');
|
||||
@@ -687,14 +708,20 @@ begin
|
||||
for var focusFile in initialFocusFiles do
|
||||
begin
|
||||
if not TFile.Exists(focusFile) then
|
||||
begin WriteLn('Warning: Focus file not found, skipping: ' + focusFile); Continue; end;
|
||||
begin
|
||||
WriteLn('Warning: Focus file not found, skipping: ' + focusFile);
|
||||
Continue;
|
||||
end;
|
||||
if allFoundPasFilesList.IndexOf(focusFile) = -1 then
|
||||
allFoundPasFilesList.Add(focusFile);
|
||||
end;
|
||||
end;
|
||||
|
||||
if allFoundPasFilesList.Count = 0 then
|
||||
begin WriteLn('No .pas files found in any specified directory (respecting exclusions).'); exit; end;
|
||||
begin
|
||||
WriteLn('No .pas files found in any specified directory (respecting exclusions).');
|
||||
exit;
|
||||
end;
|
||||
|
||||
allUnits := TDictionary<string, TUnitInfo>.Create(TStringComparer.Ordinal);
|
||||
sortedUnits := TList<TUnitInfo>.Create;
|
||||
@@ -719,14 +746,23 @@ begin
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin WriteLn('Warning: Could not determine unit name for file: ' + filePathKey + '. Skipping.'); unitInfo.Free; end;
|
||||
begin
|
||||
WriteLn('Warning: Could not determine unit name for file: ' + filePathKey + '. Skipping.');
|
||||
unitInfo.Free;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin WriteLn('Warning: Failed to parse unit: ' + filePathKey + '. Skipping.'); unitInfo.Free; end;
|
||||
begin
|
||||
WriteLn('Warning: Failed to parse unit: ' + filePathKey + '. Skipping.');
|
||||
unitInfo.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
if allUnits.Count = 0 then
|
||||
begin WriteLn('No units successfully parsed.'); exit; end;
|
||||
begin
|
||||
WriteLn('No units successfully parsed.');
|
||||
exit;
|
||||
end;
|
||||
|
||||
if focusMode then
|
||||
begin
|
||||
@@ -929,12 +965,15 @@ begin
|
||||
|
||||
if item.InterfaceSection.Count > 0 then
|
||||
begin
|
||||
outputContent.Add('//==================================================================================================');
|
||||
outputContent
|
||||
.Add('//==================================================================================================');
|
||||
outputContent.Add('//== UNIT START: ' + item.Name + ' (from ' + ExtractFileName(item.FilePath) + ')');
|
||||
outputContent.Add('//==================================================================================================');
|
||||
outputContent
|
||||
.Add('//==================================================================================================');
|
||||
outputContent.AddStrings(item.InterfaceSection);
|
||||
outputContent.Add('//== UNIT END: ' + item.Name);
|
||||
outputContent.Add('//==================================================================================================');
|
||||
outputContent
|
||||
.Add('//==================================================================================================');
|
||||
outputContent.Add('');
|
||||
end;
|
||||
end;
|
||||
|
||||
@@ -30,7 +30,6 @@ uses
|
||||
Myc.Test.Core.Lazy in '..\Src\Myc.Test.Core.Lazy.pas',
|
||||
Myc.Test.Lazy in '..\Src\Myc.Test.Lazy.pas',
|
||||
Myc.Test.Core.Atomic in '..\Src\Myc.Test.Core.Atomic.pas',
|
||||
Myc.Trade.Ticker in '..\Src\Myc.Trade.Ticker.pas',
|
||||
Myc.Test.Signals.Latch in '..\Src\Myc.Test.Signals.Latch.pas',
|
||||
Myc.Test.Signals.Dirty in '..\Src\Myc.Test.Signals.Dirty.pas',
|
||||
Myc.Trade.DataPoint in '..\Src\Myc.Trade.DataPoint.pas',
|
||||
|
||||
@@ -130,7 +130,6 @@ $(PreBuildEvent)]]></PreBuildEvent>
|
||||
<DCCReference Include="..\Src\Myc.Test.Core.Lazy.pas"/>
|
||||
<DCCReference Include="..\Src\Myc.Test.Lazy.pas"/>
|
||||
<DCCReference Include="..\Src\Myc.Test.Core.Atomic.pas"/>
|
||||
<DCCReference Include="..\Src\Myc.Trade.Ticker.pas"/>
|
||||
<DCCReference Include="..\Src\Myc.Test.Signals.Latch.pas"/>
|
||||
<DCCReference Include="..\Src\Myc.Test.Signals.Dirty.pas"/>
|
||||
<DCCReference Include="..\Src\Myc.Trade.DataPoint.pas"/>
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user