2009-03-05 27 views
12

È possibile utilizzare record come parametro di metodo e chiamarlo senza dichiarare implicitamente un'istanza di detto record?Costruttori di record anonimi in delphi

Mi piacerebbe essere in grado di scrivere codice come questo.

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

procedure Foo(AClasses : array of TRRec); 

quindi chiamare il metodo come questo o qualcosa di simile.

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

Sono ancora bloccato su Delphi 5 tra l'altro.

+1

Intendi dire senza ESPLICITAMENTE dichiarare un'istanza di detto record, non è vero? ;) – jpfollenius

+0

Potrebbe anche essere meglio dire "record anonimo _initialisers_" –

risposta

17

Sì. Quasi.

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

Soluzione elegante, grazie. –

6

E 'inoltre possibile lavorare con una matrice const, ma non è così flessibile come la soluzione data dalla "gangph": (in particolare che si deve dare la dimensione ([0..1 ]) dell'array nella dichiarazione dell'array: i record sono anomali, l'array non lo è).

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.