Autor Beitrag
mindtrap
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 62



BeitragVerfasst: Do 24.03.11 17:00 
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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function MyFunc(AParams: const array of Variant): Boolean;
begin
  // ..
end;


Ein Aufruf könnte so geartet sein:
ausblenden 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:
ausblenden 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
mindtrap Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 62



BeitragVerfasst: Di 29.03.11 13:21 
Ich wage mal einen Push. ;)
Thom
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 70
Erhaltene Danke: 5


Delphi 10 Seattle Prof.
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 62



BeitragVerfasst: 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:

ausblenden 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. :)