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]); |
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. :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!