Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Offener Parameter-Array mit unterschiedlichen Typen


mindtrap - Do 24.03.11 17:00
Titel: Offener Parameter-Array mit unterschiedlichen Typen
Hallo,

folgendes Problem:
Ich möchte Entwicklern die meine Funktionen verwenden die Möglichkeit bieten
innerhalb eines offenen Parameter-Arrays alle Typen zu übergeben.

Beispiel

Delphi-Quelltext
1:
2:
3:
4:
function MyFunc(AParams: const array of Variant): Boolean;
begin
  // ..
end;


Ein Aufruf könnte so geartet sein:

Delphi-Quelltext
1:
2:
3:
4:
if MyFunc(['Hallo Welt'123]) then
begin
  // ..
end;


Funktioniert wunderbar.

Allerdings soll es den Entwicklern auch möglich sein Objekte (by Ref) zu übergeben.
Bisher ist dies nur möglich indem das Objekt so übergeben wird:

Delphi-Quelltext
1:
MyFunc([Integer(MyObject]); // Zeiger als Integer behandeln                    

Allerdings ist das recht unschön.

Ziel des ganzen Spaßes ist es anonyme Werte an die Funktion bequem und schön zu übergeben.
Wenn jemand einen geschickteren Weg kennt, ich bin für Vorschläge offen.

Was ich allerdings nicht möchte ist, dass der Programmierer gezwungen ist
ein Parameterobjekt zu erzeugen und das dann an die Funktion weitergibt.

Danke

// Edit: Push und Crosslink in der DP [http://www.delphipraxis.net/159462-offener-parameter-array-mit-unterschiedlichen-typen.html]


mindtrap - Di 29.03.11 13:21

Ich wage mal einen Push. ;)


Thom - Di 29.03.11 14:33

Variant und OleVariant unterstützen nicht so ohne weiteres Objektreferenzen (Pointer). Ein Weg wäre die Implementation eines Interfaces bei den zu übergebenden Objekten.

Einfacher geht es aber so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function MyFunc(AParams: array of const): Boolean;
begin
  // ..
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyFunc(['Hallo Welt',123,self]);
end;


mindtrap - Di 29.03.11 15:12

Ich hatte das damals schon mit einem array of const versucht.
Hatte nur die verschiedenen Daten-Typen nicht korrekt auswerten können.
Nun habe ich es erneut versucht und auch den Fehler gefunden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
... AParams: array of const ...

  for LIdx := Low(AParams) to High(AParams) do
  begin
    case AParams[LIdx].VType of
      vtInteger: //;
      vtString,
      vtWideString,
      vtUnicodeString: //;
      vtObject: ShowMessage('Object');
    end;
  end;


Ich hatte mich damals auf die Hilfe verlassen nur der Typ vtUnicodeString ist
in Delphi 2010 in der Hilfe nicht beschrieben.

Danke für den Tipp, jetzt klappt auch alles, was ich vor habe. :)