Thema: Delphi AddObject

Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AddObject

  Alt 1. Nov 2003, 10: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.
  Mit Zitat antworten Zitat