Registriert seit: 29. Mai 2002
37.621 Beiträge
Delphi 2006 Professional
|
AddObject
1. Nov 2003, 11:06
Die Eigenschaft Itens von TStrings bietet die Möglichkeit zusätzlich Informationen von Typ TObject zuspeichern. Dabei handelt es sich eigentlich nur um ein beliebiges Zeiger Object. Gespeichert wird auch nicht das "Objekt" selber, sondern nur eine Referenz auf den Zeiger. Das heißt wird der Speicher für das Objekt freigegeben, ist später kein Zugriff mehr darauf möglich. Hier nun die Demo:
Delphi-Quellcode:
// Data record
type
TPerson = record
Name: string[255];
Vorname: string[255]
end;
// Pointer to data record
PPerson = ^TPerson;
procedure TForm1.btnAddClick(Sender: TObject);
var
Person: PPerson;
begin
// Alloc memory
new(person);
Person^. Name := edtName.Text;
Person^.Vorname := edtVorname.Text;
// Add item and object
Listbox1.Items.AddObject(IntToStr(Listbox1.Items.Count + 1), TObject(Person));
// DO NOT dispose memory. Only a reference to a pointer object is storded with
// the listbox item
end;
procedure TForm1.ListBox1Click(Sender: TObject);
var
Name, Vorname: string;
begin
if Listbox1.ItemIndex > -1 then
begin
// Caste TObject and access the fields of the record
Name := PPerson(Listbox1.Items.Objects[Listbox1.ItemIndex])^. Name;
Vorname := PPerson(Listbox1.Items.Objects[Listbox1.ItemIndex])^.Vorname;
ShowMessage( name + ' , ' + Vorname);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
Loop: Integer;
begin
// Dispose memory
if Listbox1.Items.Count > 0 then
for Loop := Listbox1.Items.Count - 1 downto 0 do
Dispose(PPerson(Listbox1.Items.Objects[Loop]));
end;
[edit=Matze]
Hier noch ein paar Anmerkungen zu Luckie's Code:
Zitat:
Beim Löschen eines Items muss das Objekt wieder freigegeben werden.
Hinweis von Sharky
Zitat:
Der Typecast gaukelt dem Compiler vor, dies sei ein Pointer, der auf eine Speicherstruktur einer Klasseninstanz, eines Objektes halt, zeigt, das tut er aber nicht, und das ist gefährlich.
Bei TList ist das in Ordnung,
TList:
property Items[index :integer] :Pointer
also beliebiger Pointer, z.B. auf eine Record, aber auch auf ein Objekt möglich
aber TStrings
property Objects[index :integer] :TObject
also Zeiger auf ein Objekt, aber kein allgemeiner Zeiger, diese Unterschied hat schon eine Bedeutung.
Zitat von woki
Mfg, Matze
[/edit]
[edit=flomei]Nur nen paar Tags korrigiert... Mfg, flomei[/edit]
[edit=Matze] Mfg, Matze[/edit]
[edit=toms] Mfg, toms[/edit]
Michael Ein Teil meines Codes würde euch verunsichern.
|
|
Zitat
|