AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListBox1.Items.AddObject(...) GetObject???

Ein Thema von Luckie · begonnen am 1. Nov 2003 · letzter Beitrag vom 1. Nov 2003
Antwort Antwort
Benutzerbild von Luckie
Luckie

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

ListBox1.Items.AddObject(...) GetObject???

  Alt 1. Nov 2003, 10:05
Ja also, ich füge zur Listbox mit AddObject nicht nur ein String hinzu, sondern auch ein Object. Und zwar so:
Delphi-Quellcode:
type
  TPerson = record
    Name: String[255];
    Vorname: String[255]
  end;
  PPerson = ^TPerson;

procedure TForm1.btnAddClick(Sender: TObject);
var
  Person : Pointer;
begin
  GetMem(Person, sizeof(TPerson));
  try
    PPerson(Person)^.Name := edtName.Text;
    PPerson(Person)^.Vorname := edtVorname.Text;
    Listbox1.Items.AddObject(IntToStr(Listbox1.Items.Count+1), TObject(Person));
  finally
    FreeMem(Person, sizeof(TPerson));
  end;
end;
So, nur wie komme ich jetzt da wieder dran?
Delphi-Quellcode:
procedure TForm1.ListBox1Click(Sender: TObject);
var
  Person: Pointer;
begin
  if Listbox1.ItemIndex > -1 then
  begin
    GetMem(Person, sizeof(TPerson));
    try
      Person := Pointer(Listbox1.Items.Objects[Listbox1.ItemIndex]);
      ShowMessage(PPerson(Person)^.Name + ' - ' + PPerson(Person)^.Vorname);
    finally
      FreeMem(Person, sizeof(TPerson));
    end;
  end;
end;
So steht nur mit in der Messagebox und nach dem dritten mal klicken, fliegt mir alles um die Ohren -> Ungültige Zeiger Operation. Wie also komme ich wieder an meine Objekte?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#2

Re: ListBox1.Items.AddObject(...) GetObject???

  Alt 1. Nov 2003, 10:12
Hai Luckie,

ich muss selber mal in meinem Code nach sehen. Aber ich meinte Du darst den Speicher nicht wieder freigeben!
AddObject verwaltet wohl auch nur einen Pointer auf den Object.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: ListBox1.Items.AddObject(...) GetObject???

  Alt 1. Nov 2003, 10:15
Ja, sowas stand auch in der OH, aber dann ist ja der Sinn doch nicht mehr gegeben, also irgendwie oder so.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#4

Re: ListBox1.Items.AddObject(...) GetObject???

  Alt 1. Nov 2003, 10:18
Zitat von Luckie:
.... aber dann ist ja der Sinn doch nicht mehr gegeben, also irgendwie oder so.
Ich weiss das ich da auch schwer gekämpft hatte.
Eigentlich sollte es heissen "AddPointerToObject". Mann muss also für jedes Item ein Object erzeugen.
Wichtig ist natürlich das man sich auch selber um die freigabe kümmern muss.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: ListBox1.Items.AddObject(...) GetObject???

  Alt 1. Nov 2003, 10:22
Ist eigentlich ganz einfach, aber etwas ungewohnt: Du allozierst den Speicher zu dem Zeitpunkt, an dem du dein Record dem Listview übergibst. Freigeben darfst du den Speicher aber erst, wenn du auf dieses Datenrecord keinen Zugriff mehr brauchst, also spätestens im Listview-Destruktor, da, wie Sharky gesagt hat, ja nur ein Zeiger auf diese Struktur gespeichert wird.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: ListBox1.Items.AddObject(...) GetObject???

  Alt 1. Nov 2003, 10:27
So. Genau so wie Chewie es sagt geht es:
Delphi-Quellcode:
type
  TPerson = record
    Name: string[255];
    Vorname: string[255]
  end;
  PPerson = ^TPerson;

procedure TForm1.btnAddClick(Sender: TObject);
var
  Person: PPerson;
begin
  new(person);
  Person^.Name := edtName.Text;
  Person^.Vorname := edtVorname.Text;
  Listbox1.Items.AddObject(IntToStr(Listbox1.Items.Count + 1), TObject(Person));
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var
  Name, Vorname: string;
begin
  if Listbox1.ItemIndex > -1 then
  begin
    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
  for Loop := 0 downto Listbox1.Items.Count - 1 do
    Dispose(PPerson(Listbox1.Items.Objects[Loop]));
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz