2009-03-05 7 views
12

¿Es posible utilizar registros como parámetro de método y llamarlos sin declarar implícitamente una instancia de dicho registro?Anónimos Constructores de registros en delphi

Me gustaría poder escribir un código como este.

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

procedure Foo(AClasses : array of TRRec); 

llamando al método de esta manera o algo similar.

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

Todavía estoy atrapado en Delphi 5 por cierto.

+1

quieres decir sin declarar EXPLICITAMENTE una instancia de dicho registro, ¿no? ;) – jpfollenius

+0

También podría ser mejor decir "registro anónimo _initialisers_" –

Respuesta

17

Sí. Casi.

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

Solución elegante, gracias. –

6

También es posible trabajar con una matriz const, pero no es tan flexible como la solución dada por "gangph": (especialmente la que tiene que dar el tamaño ([0..1 ]) de la matriz en la declaración de la matriz. Los registros son anómalos, la matriz no lo es).

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.