AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

AddObject

Ein Thema von Luckie · begonnen am 1. Nov 2003
Antwort Antwort
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.613 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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf