2012-02-05 12 views
6

Obecnie dodaję przedmiot tworząc to lubią:Czy mogę bezpośrednio dodać rekord jako obiekt do listy napisów?

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; 

Czy ta metoda prawidłowa lub nieskuteczne? Czy mogę dodać obiekt bezpośrednio, nie tworząc go tak, jak przy użyciu rekordu?

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; 

Lub inny szybki i prosty sposób?

Używam Delphi 7.

Z góry dziękuję.

+0

Nie jestem pewien, czy lista ciągów jest najlepsza. Prawdopodobnie wybrałbym TObjectList, ustaw OwnsObjects na true i przeniesie ciąg do klasy używanej jako element listy. –

+0

@DavidHefferman: Aby to działało poprawnie, typ rekordu musi zostać zmieniony na klasę wywodzącą się z 'TObject'. –

+0

@Remy Pierwszy wyciąg z kodu jest dokładnie taki, jak –

Odpowiedz

8

Sposób, w jaki teraz to robisz, jest w porządku.

Nie można tego zrobić z rekordem bez przydzielania pamięci po dodaniu nowego rekordu do TStringList.Objects, a następnie trzeba go zwolnić. Równie dobrze wykorzystujesz klasę, jak teraz; musisz zwolnić obiekty przed zwolnieniem listy napisów. (W nowszych wersjach Delphi, TStringList ma właściwość OwnsObjects, która automatycznie je zwolni, gdy lista napisów zostanie zwolniona, ale nie jest dostępna w Delphi 7.)

Jeśli naprawdę chcesz to zrobić z rekord można:

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; 

będziesz musiał użyć System.Dispose(PRec(AList.Objects[i])) aby zwolnić pamięć przed uwalniając stringlist. Jak już powiedziałem, sposób, w jaki to robisz, jest teraz znacznie łatwiejszy; nie musisz robić typecast podczas dodawania i usuwania z listy napisów.

Nawiasem mówiąc, nie potrzebujesz AList.Clear. Ponieważ tworzysz listę napisów, nic nie można w niej usunąć.

+0

+1 w celu uzyskania porady dotyczącej czyszczenia. Chociaż wiem, że to może być przykładowy kod, nie mogę nie zauważyć, że ALIST nie jest zwolniony. – Hemant

+0

@KenWhite Dziękuję bardzo za twoją radę – Warren

+0

@Heman Dzięki za twój wpis, ale dlaczego został usunięty? – Warren

Powiązane problemy