Ich habe folgendes Problem. Per Event wird die Methode TMission.CallEvent(ProcName: String; Params: Array of const) aufgerufen. In CallEvent wird dann die Funktion mit dem Namen ProcName aufgerufen. Alle nötigen Parameter befinden sich in Params. Das ganze funktioniert zwar, hat aber einen Schönheitsfehler - es ist nicht möglich, als Parameter einen Record zu übergeben. Gibt es irgendwie eine Alternative, wie man einen Parameter-Array so definieren kann, dass er neben den Standardtypen auch Records aufnehmen kann? Das ganze sollte beim Aufruf möglichst trotzdem noch in der Form [Parameter1,Parameter2...] funktionieren.
Zusätzlicher Hintergrund: Das Ganze wird für eine ScriptEngine auf Basis von PascalScript benutzt. Dort gibt es bereits den Typ PPSVariant. TMission.CallEvent hat hauptsächlich die Aufgabe, die Übergebenen Parameter in eine PPSVariant-Variable zu schreiben. Ideal wäre natürlich eine Lösung, die gleich eine direkte Zuweisung an PPSVariant erlaubt, aber ich hoffe, dass ich die bei Bedarf auch selber gebastelt bekäme, daher ist dieser Punkt nicht ganz so wichtig. Hier trotzdem mal noch die entsprechende Hilfsfunktion:
Delphi-Quellcode:
function script_utils_constArrayToPSList(RunTime: TPSExec;Proc: TPSInternalProcRec;Params:
Array of const): TPSList;
var
s :
String;
res :
String;
i : Integer;
ct : PIFTypeRec;
pvar : PPSVariant;
Va : Variant;
begin
result:=TPSList.Create;
s := Proc.ExportDecl;
res := grfw(s);
i := High(Params);
while s <> '
'
do
begin
if i < 0
then
raise Exception.Create('
Not enough parameters');
ct := RunTime.GetTypeNo(StrToInt(copy(GRLW(s), 2, MaxInt)));
if ct =
nil then
raise Exception.Create('
Invalid Parameter');
pvar := CreateHeapVariant(ct);
result.Add(pvar);
with Params[I]
do
begin
Va:=Unassigned;
case VType
of
vtInteger: Va := VInteger;
vtBoolean: Va := VBoolean;
vtChar: Va := VChar;
vtExtended: Va := VExtended^;
vtString: Va := VString^;
vtAnsiString: Va :=
string(VAnsiString);
vtCurrency: Va := VCurrency^;
vtVariant: Va := VVariant^;
vtObject:
begin
if ct.BaseType<>btClass
then
raise Exception.Create('
Invalid Parameter');
PPSVariantClass(pVar).Data:=VObject;
end;
else
raise Exception.Create('
Not supported Type');
end;
end;
if not VarIsEmpty(Va)
then
begin
if not VariantToPIFVariant(RunTime, Va, pvar)
then
raise Exception.Create('
Invalid Parameter');
end;
Dec(i);
end;
if I > -1
then raise Exception.Create('
Too many parameters');
if res <> '
-1'
then
begin
pvar := CreateHeapVariant(RunTime.GetTypeNo(StrToInt(res)));
result.Add(pvar);
end;
end;