2009-03-05 19 views
12

Czy można używać rekordów jako parametru metody i wywoływać go bez pośredniego zadeklarowania wystąpienia tego rekordu?Konstruktory rekordów anonimowych w delphi

Chciałbym móc napisać kod taki jak ten.

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

procedure Foo(AClasses : array of TRRec); 

następnie wywołanie metody podobnej lub podobnej.

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

Nadal utknąłem na Delphi 5 przy okazji.

+1

masz na myśli bez DOWIEDZIALNEGO deklarowania wystąpienia wspomnianej płyty, prawda? ;) – jpfollenius

+0

Może lepiej byłoby powiedzieć "anonimowy rekord _initialisers_" –

Odpowiedz

17

Tak. Prawie.

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

Eleganckie rozwiązanie, dziękuję. –

6

Możliwe jest również do pracy z const tablicy, ale to nie jest tak elastyczny, jako rozwiązanie podane przez „gangph”: (zwłaszcza, że ​​trzeba podać rozmiar ([0..1 ]) tablicy w deklaracji array. Rekordy są anomalie, tablica nie jest.

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.