| Autor |
Beitrag |
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 07.02.03 15:46
also, ich habe eine Listbox mit Objekten dahinter.
Einfügen der Objekte tu ich über ne Prozedur ungefähr so:
Quelltext 1: 2: 3: 4: 5:
| newperson:=person.create; newperson.alter:=32; newperson.name:='otto' {...} personenliste.additem('Otto',newperson); |
Dann steht in der Liste ein Otto und dem zugeordnet sind weitere Informationen über Otto. soweit klar.
Wenn ich jetzt Otto wieder löschen will, mach ich das mit
Quelltext 1:
| personenliste.deleteselected; |
Und jetzt zum Problem: Damit kommen die anderen Daten durcheinander, denn wenn ich mir nach dem löschen eines Eintrages so die namen der anderen personen in der liste ausgeben lasse, dann kommt teilweise nicht das raus, was rauskommen sollte:
Quelltext 1: 2: 3: 4: 5:
| for i:=0 to personenliste.count-1 do begin tmpperson:=personenliste.items.objects[i] as person; name:=tmpperson.name; {ausgabe von "name" in Memo-Box} end; |
was mache ich falsch?
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Fr 07.02.03 15:55
google mal nach memproof ich bin mir nicht sicher ob du mit
deleteselected auch das Objekt wieder mit freigibst ansonsten hast du da ein Speicherloch (spontan nachgedacht wird es nicht freigegebne).
erzeugt du pro eintrag auch eine Instanz von Person?
was kommt denn raus?
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Fr 07.02.03 16:09
Hallo Gausi,
ist die Variable personenliste wirklich vom Type tListBox. Ich frage weil meine tListbox keine Methoden kennt wie additem und deleteselected. Ich habe D5.
Gruß
TINO
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Fr 07.02.03 16:12
ich hab jetzt auch nur D5 hier, zuhause d6 pro, und wenn mich mein Gedächtnis nicht täuscht, gibt es Additem um einen String und ein Objekt in einem Rutsch hinzuzufügen.
Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 07.02.03 16:13
Hi!
Ich benutze D6 Personal und da sind beide Methoden bei der ListBox mit drin.
@Gausi: endlich mal einer aus Düsseldorf und noch dazu Student!
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 07.02.03 16:27
Habe gerade mal ausprobiert, ob der Fehler bei mir auch auftritt. Dieser Quelltext scheint prima zu funktionieren:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.Button1Click(Sender: TObject); VAR myperson : Tperson; begin inc(count); myperson:=TPerson.Create; myperson.vorname:='Peter'+IntToStr(count); myperson.nachname:='Lustig'+IntToStr(count); ListBox1.AddItem('Peter'+IntToStr(count),myperson); end;
procedure TForm1.FormCreate(Sender: TObject); begin count:=0; end;
procedure TForm1.Button2Click(Sender: TObject); begin ListBox1.DeleteSelected; end;
procedure TForm1.Button3Click(Sender: TObject); VAR myperson : TPerson; i : INTEGER; begin memo1.clear; for i:=0 TO ListBox1.Count-1 DO begin myperson:=ListBox1.items.objects[i] as tperson; memo1.Lines.Add(myperson.vorname+' '+myperson.nachname); end; end; |
Button1 fügt hinzu, Button2 löscht und Button3 schreibt Vor- und Nachname in ein Memo. Bis auf die ListBox ist auch nicht mehr auf der Form drauf. TPerson ist ein Objekt, welches nichts enthält außer zwei Properties: "vorname" und "nachname", beides Strings.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Fr 07.02.03 16:35
@ Peter, hast du das mal mit memproof gecheckt ?
1. ich glaube nicht das deleteselected das Objekt auch freigibt
| Onlinehilfe hat folgendes geschrieben: |
Ist dem String ein Objekt zugeordnet, so wird auch diese Referenz entfernt.
|
(ist von delete-methode, deleteselected gibts ni in D5)
2. wo werden die Personen-objekte der Liste wieder freigegeben?
Ich weiß nur von der Objektliste, das diese die Möglichkeit bietet, die Objekte automatisch freigibt.
ich kanns hier nicht ausprobieren, will aber nicht warten, bis ich zu hause bin
Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Fr 07.02.03 16:41
hi, wenn ihr nur deleteSelected macht entsteht ein speicher loch. da im delphi code nix weiter passiert als die items zu löschen. seht her: Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TCustomListBox.DeleteSelected; var I: Integer; begin if MultiSelect then begin for I := Items.Count - 1 downto 0 do if Selected[I] then Items.Delete(I); end else if ItemIndex <> -1 then Items.Delete(ItemIndex); end; |
also ... ListBox1.objects[ListBox1.ItemIndex].free; manuel machen.
grüsse. mäximus
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 07.02.03 16:55
Ups, das mit dem Freigeben habe ich total verpeilt.
Aber irgendwie hätte man sich auch denken können, dass die ListBox nicht automatisch das Objekt freigibt. Eigentlich übergebe ich ja sowieso nur eine Referenz an die ListBox und wenn ich diese aus der ListBox lösche, kann es ja sein, dass ich das Objekt ansich woanders noch weiter verwenden will. Wäre ziemlich dumm, wenn es dann weg wäre.
Aber in den Beispielen, die Gausi und ich gepostet haben, macht es natürlich keinen Sinn, die Objekte nicht freizugeben.
Wo allerdings der Fehler bei Gausi liegt, wissen wir immer noch nicht, denn bei mir funktioniert es ja so. Wenn auch extrem speicherunfreundlich.
MfG
Peter
P.S.: Hat Delphi eigentlich keine Garbage Collection wie Java?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Gausi 
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 07.02.03 17:04
Danke für die vielen Antworten, war also endlich mal ne frage von mir, die nicht soooo trivial ist.
Das Problem lag scheinbar an einer anderen Stelle, aber mit hilfe des Quelltextes von Peter hab ich das Problem behoben.
Zu dem "Speicherloch":
Wenn ich aus der Liste das Element entferne, aber nicht das Objekt dahinter (ich glaube auch, dass man das extra freigeben muss) dann habe ich doch kein Loch im Speicher, sondern der Speicher ist nur mit Daten angefüllt, an die ich nicht mehr rankomme, oder? D.h. bei wiederholtem einfügen/entfernen packe ich mir den Speicher voll bis nix mehr da ist. Aber laufen sollte das Programm doch erstmal trotzdem, oder?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 07.02.03 17:41
| Zitat: |
Wenn ich aus der Liste das Element entferne, aber nicht das Objekt dahinter (ich glaube auch, dass man das extra freigeben muss) dann habe ich doch kein Loch im Speicher, sondern der Speicher ist nur mit Daten angefüllt, an die ich nicht mehr rankomme, oder? D.h. bei wiederholtem einfügen/entfernen packe ich mir den Speicher voll bis nix mehr da ist. Aber laufen sollte das Programm doch erstmal trotzdem, oder?
|
Ja, genau!
Ich habe das, weil ich mir nicht sicher war, mal ausprobiert: wenn ich in meinem Quelltext, nach der Zeile mit "AddItem ..." noch einfüge "MyPerson.Free;" kann die ListBox hinterher nicht mehr auf die Items zugreifen.
Übrigens ist die Funktion der Garbage Collection in Java, dass sie die "Objektleichen" auf die keine Referenz mehr besteht, findet und freigibt. Daher meine Frage, ob es das in Delphi auch gibt.
MfG,
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Fr 07.02.03 17:52
Nö gibst nicht
vielleicht in delphi.NET gelöt.
|
|
Gausi 
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 07.02.03 18:32
@Peter Lustig:
Und genau da lag auch der grund für das "komische Verhalten" bei mir. Ich hatte nämlich ein "MyPerson.Free" noch im Quelltext stehen und hab dann versucht auf das entsprechende Objekt zuzugreifen. Dabei kam natürlich entweder Schrott oder ein Absturz bei rum 
|
|