2009-03-05 12 views
12

Ist es möglich, Datensätze als Methodenparameter zu verwenden und sie aufzurufen, ohne eine Instanz des Datensatzes implizit zu deklarieren?Anonyme Datensatzkonstruktoren in Delphi

Ich möchte in der Lage sein, Code wie folgt zu schreiben.

type 
    TRRec = record 
    ident : string; 
    classtype : TClass; 
    end; 

procedure Foo(AClasses : array of TRRec); 

dann Aufruf der Methode wie diese oder etwas ähnliches.

Foo([('Button1', TButton), ('Lable1', TLabel)]); 

Ich bin immer noch auf Delphi 5 fest.

+1

Sie meinen, ohne EXPLICITLY eine Instanz des besagten Datensatzes zu deklarieren, nicht wahr? ;) – jpfollenius

+0

Es könnte auch besser sein zu sagen "anonymous record _initialisers_" –

Antwort

17

Ja. Fast.

type 
    TRRec = record 
    ident : string; 
    classtype : TClass; 
    end; 

function r(i: string; c: TClass): TRRec; 
begin 
    result.ident  := i; 
    result.classtype := c; 
end; 

procedure Foo(AClasses : array of TRRec); 
begin 
    ; 
end; 

// ... 
Foo([r('Button1', TButton), r('Lable1', TLabel)]); 
+0

Elegante Lösung, danke. –

6

Es ist auch möglich, mit einem const-Array zu arbeiten, aber es ist nicht so flexibel wie die Lösung von „gangph“ gegeben: (vor allem, dass Sie die Größe geben ([0..1 ]) des Arrays in der Array-Deklaration Die Datensätze sind anonym, das Array ist nicht).

type 
    TRRec = record 
    ident : string; 
    classtype : TClass; 
    end; 

procedure Foo(AClasses : array of TRRec); 
begin 
end; 

const tt: array [0..1] of TRRec = ((ident:'Button1'; classtype:TButton), 
            (ident:'Lable1'; classtype:TLabel)); 

Begin 
    Foo(tt); 
end.