2012-02-05 5 views
6

Attualmente sto aggiungendo oggetto creandola piace:Posso aggiungere direttamente un record come oggetto nella lista di stringhe?

type  
    TRecord = class 
    private 
    str: string; 
    num: Integer; 
    public 
    constructor Create; 
    end; 

... 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    i: Integer; 
    rec: TRecord; 
    Alist: TStringList; 
begin 
    Alist := TStringList.create; 
    Alist.Clear; 
    for i := 0 to 9 do 
    begin 
    rec := Trecord.Create; //create instance of class 
    rec.str := 'rec' + IntToStr(i); 
    rec.num := i * 2; 
    Alist.AddObject(IntToStr(i), rec); 
    end; 
end; 

È questo il metodo corretto o inefficienti? Oppure Posso aggiungere direttamente l'oggetto non creandolo come usando il record?

type  
    PRec = ^TRec; 
    TRec = record 
    str: string; 
    num: Integer; 
    end; 

... 
var 
    rec: TRec; 
... 

for i := 0 to 9 do 
begin 
    //how to write here to have a new record, 
    //can i directly Create record in delphi 7 ? 
    rec.str := 'rec' + IntToStr(i); 
    rec.num := i*2; 
    Alist.AddObject(IntToStr(i), ???); // how to write here? 
end; 

O altro modo semplice e veloce?

Sto usando Delphi 7.

Grazie in anticipo.

+0

Non sono sicuro che una lista di stringhe sia la migliore. Probabilmente andrei su TObjectList, impostare Ownsbjects su true e spostare la stringa nella classe utilizzata come voce di elenco. –

+0

@DavidHefferman: Affinché funzioni correttamente, il tipo di record deve essere modificato in una classe derivata da 'TObject'. –

+0

@Remy Il primo estratto del codice è esattamente quello –

risposta

8

Il modo in cui lo stai facendo ora va bene.

Non è possibile farlo con un record senza allocare memoria quando si aggiunge un nuovo record allo TStringList.Objects e sarà necessario liberarlo in seguito. Stai anche meglio usando una classe come sei ora; devi liberare gli oggetti prima di liberare la lista delle stringhe. (Nelle versioni più recenti di Delphi, TStringList ha un OwnsObjects proprietà che li auto-libererà per voi quando lo stringlist è free'd, ma non è in Delphi 7.)

Se si vuole veramente fare questo con un record, è possibile:

type  
    PRec = ^TRec; 
    TRec = record 
    str: string; 
    num: Integer; 
    end; 

var 
    rec: PRec; 
begin 
    for i := 0 to 9 do 
    begin 
    System.New(Rec); 
    rec.str := 'rec' + IntToStr(i); 
    rec.num := i*2; 
    Alist.AddObject(IntToStr(i), TObject(Rec)); // how to write here? 
    end; 
end; 

Avrete bisogno di usare System.Dispose(PRec(AList.Objects[i])) per rilasciare la memoria prima di liberare lo stringlist. Come ho detto, il modo in cui lo stai facendo ora è in realtà molto più semplice; non devi eseguire il typecast durante l'aggiunta e l'eliminazione dall'elenco di stringhe.

Non è necessario il AList.Clear, a proposito. Poiché stai creando la lista di stringhe, non ci può essere nulla da rimuovere.

+0

+1 per i consigli di pulizia. Anche se so che potrebbe essere un codice di esempio, non posso fare a meno di notare che AList non viene rilasciato. – Hemant

+0

@KenWhite Grazie mille per il tuo consiglio – Warren

+0

@Heman Grazie per il tuo post, ma perché è stato cancellato? – Warren

Problemi correlati