Einzelnen Beitrag anzeigen

Leanahtan

Registriert seit: 5. Jun 2009
62 Beiträge
 
Turbo Delphi für Win32
 
#1

Alternative zu Array of Const?

  Alt 15. Dez 2009, 23:10
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 <> '-1then
  begin
    pvar := CreateHeapVariant(RunTime.GetTypeNo(StrToInt(res)));
    result.Add(pvar);
  end;
end;
  Mit Zitat antworten Zitat