![]() |
Dynamischer Methoden Aufruf mit Record Referenzen
Hallo,
ich habe eine Wrapper Bibliothek erstellt, mit der man aus der Programmiersprache D auf Firemonkey zugreifen kann [1]. Ein einfaches Beispiel in D sieht dann so aus:
Code:
Die Project1.dll ist in Delphi geschrieben und bietet Funktionen um dynamisch Delphi Class Instances anzulegen und deren
import delta.core;
import System.Classes, System.UITypes, FMX.Forms, FMX.Types, FMX.Memo; void main() { deltaLibrary.load(`.\views\Win32\Debug\Project1.dll`); Application.Initialize; Application.MainForm = TCustomForm.CreateNew(Application); Application.MainForm.Caption = "Sample"; auto memo = TMemo.Create(Application.MainForm); memo.Lines.Add("Hello World!"); memo.Align = TAlignLayout.Client; memo.Parent = Application.MainForm; Application.MainForm.Show(); Application.Run(); } Methoden aufzurufen. Das funktioniert soweit gut. Wo ich gerade nicht weiterkomme, ist wenn eine Methode ein Record Argument hat. Beispiel TCanvas.DrawLine hat zweimal den Record Type TPointF:
Delphi-Quellcode:
procedure DrawLine(const APt1, APt2: TPointF; const AOpacity: Single); overload;
In meiner DLL habe ich eine generische Funktion, um Instance Methoden aufzurufen, die als Argumente (Record, Record, Single) erwarten:
Delphi-Quellcode:
(Das Argument Reference hat die Klassen Referenz zu TCanvas, AName beinhaltet den Methoden Namen DrawLine, danach kommen die eigentlichen
procedure executeInstanceMethodReturnNoneArgsStructStructFloat(const Reference: Integer;
const AName: PAnsiChar; Reference2, Reference3: Integer; s: Single); stdcall; begin // Was muss ich hier machen? executeInstanceMethod(Reference, string(AName), [???]); end; function executeInstanceMethod(const Reference: Integer; const AName: string; const Args: array of TValue): TValue; var context: TRttiContext; instType: TRttiInstanceType; obj: TObject; begin context := TRttiContext.Create; try try obj := TObject(Reference); instType := (context.GetType(obj.ClassType) as TRttiInstanceType); result := instType.GetMethod(AName).Invoke(obj, Args); except on E: Exception do writeln(E.ClassName + ' error raised, with message : ' + E.Message); end; finally context.Free; end; end; Argument für die DrawLine Methode) Aus meinem Programm möchte ich dann beim Aufruf von "executeInstanceMethodReturnNoneArgsStructStructFl oat" Referenzen auf Records (D Strukturen die binär kompatibel sind) übergeben. In der Funktion "executeInstanceMethodReturnNoneArgsStructStructFl oat" sollen dann diese Record Referenzen umgewandelt werden, in etwas mit der dann am Ende die TRttiMethod.Invoke Methode etwas anfangen kann. Ist das technisch überhaupt machbar und wenn es gehen sollte, wie könnte das Coding dafür ungefähr aussehen? Viele Grüße André [1] ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz