![]() |
ComboBox mit unterschiedlichen Objekten - sauber abraeumen?
Hallo zusammen,
ich hab mal wieder ein übles Stückchen Software vor mir. Momentan habe ich da eine Combobox, der mittels AddObject() neben den einzelnen Strings auch unterschiedliche zugehörige Objekte (fragt mich nicht warum, dazu komme ich erst später, erstmal muss ich die drei Millionen Speicherlecks beheben...) zugewiesen werden. Wenn die Combobox später abgeräumt wird, muss ich natürlich diese Objekte auch einzeln wieder freigeben, nur wie komme ich da ran? Entweder bin ich zu doof die OH zu verstehen oder ich seh den Wald vor lauter Bäumen nicht. Bei meinen bisherigen Experimenten bin ich noch nicht über diverse Access Violations hinausgekommen... Auch die Suche hier im Forum war nicht wirklich erleuchtend, kann mir mal jemand bitte einen Schubs in die richtige Richtung geben? :) Herzlichen Dank schonmal im Voraus :mrgreen: |
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
.Objects
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
okay, ich haette dazusagen sollen, dass ein myCombobox.Items.Objects[i].Free zu den erwähnten AVs führt.
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Wo ist mein Kaffee... bin noch nicht ganz wach, das Projekt das ich hier übernommen hab ist echt schlimm. Ich hab in den letzten Tagen sicherlich fuenfhundertmal TList.Create gesehen, gefolgt von diversen Zuweisungen von Objekten in die Liste und danach ein einfaches TList.Free - ohne vorher die Objekte abzuraeumen. Das Logfile von FastMM4 war 1,9 MB gross :shock: und inzwischen bin ich auf 450kb runter ;)
Also, befüllt wird die Combobox in MyForm.FormCreate (gebunden ans OnCreate-Event):
Delphi-Quellcode:
menutext und menutext2 sind Strings, und wo ichs jetzt paste wundere ich mich, was das mit dem TMyEffect usw. soll - TMyEffect und Konsorten sind Klassendefinitionen.
procedure TMyForm.FormCreate(Sender: TObject);
Begin [...] MyComboBox.items.addObject(menutext, TObject(integer(TMyEffect))); MyComboBox.items.addObject(menutext2, TObject(integer(TMyEffect2))); [...] End; Abgeraeumt soll das ganze natürlich in TMyForm.FormDestroy (gebunden ans OnDestroy-Event):
Delphi-Quellcode:
So, und nun bin ich mal gespannt, was ich da übersehen hab :)
procedure TMyForm.FormDestroy(Sender: TObject);
var i: integer; Begin [...] for i:=0 to MyComboBox.Items.Count-1 do MyComboBox.Items.Objects[i].Free; [...] End; |
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Hast du auf "<> nil" geprüft? :)
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
Zitat:
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Warum versuchst du eine Referenz(Zeiger) auf ein Objekt zuerst in einene Integer und dann in ein TObject zu casten (jedes Objekt ist schon ein TObject) ?
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
Angepasster Cdode:
Delphi-Quellcode:
for i:= MyComboBox.Items.Count-1 downto 0 do
if Assigned(MyComboBox.Items.Objects[i]) then MyComboBox.Items.Objects[i].Free; |
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
aber zum einen wurde jedem Item ein Objekt zugewiesen, und zum anderen habe ich gerade mal mit dem Debugger geschaut, da ist kein einziges Nil dabei. Die AV gibts trotzdem... Nachtrag: Im OnClick-Event (???) gibts dann folgenden Code:
Delphi-Quellcode:
Da setzt es bei mir dann wirklich langsam aus :mrgreen:
procedure MyForm.MyComboBoxClick(Sender: TObject);
var e: TSingleEffect; i: integer; begin i:= MyComboBox.itemindex; if assigned(nochEineListe) and (i>=0) and (i<MyComboBox.items.count) then begin e:= TSingleEffectClass(MyComboBox.Items.objects[i]).create(nochEineListe); nochEineListe.addeffect(e); end; end; Achja, das fehlt noch:
Delphi-Quellcode:
Kommt das nur mir ziemlich wurstig vor? :gruebel:
type
TSingleEffect= class(TPanelEffect) [...] end; TSingleEffectClass= class of TSingleEffect; |
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Von welchem Typ ist eigentlich MyComboBox? TComboBox oder etwas selbstgeschriebenes?
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Hallo,
Delphi-Quellcode:
wenn sich der "flüchtige" Kollege ein wenig an die Namenskonvention gehalten hat, dann werden hier keine Objekte, sonder Klassenreferenzen angehängt. Die sollten dann aber nicht freigegeben werden...
procedure TMyForm.FormCreate(Sender: TObject);
Begin [...] MyComboBox.items.addObject(menutext, TObject(integer(TMyEffect))); MyComboBox.items.addObject(menutext2, TObject(integer(TMyEffect2))); [...] End; Freundliche Grüße |
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
Zitat:
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
Ich weiß auch gar nicht, welche Zahl das ist, wenn man eine Klasse auf Integer castet. Was kann man mit der Zahl anfangen? Was hat man davon, diese Zahl (also den Integer) dann auf TObject zu casten und den Zeiger dann in eine Objektliste zu hängen? :gruebel: |
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
Zitat:
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Hallo Ingo,
Zitat:
Zitat:
Freundliche Grüße |
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Hi marabu,
danke für die Erklärung! :thumb: Zitat:
Viel spannender ist da folgendes: Zitat:
Delphi-Quellcode:
Das klappt doch nicht, oder? :gruebel:
var
ObjVar: TObject; begin ObjVar := MyComboBox.Items.Objects[MyComboBox.ItemIndex].Create; end; |
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
|
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Hi Ingo,
besser so:
Delphi-Quellcode:
Bei deinem Create würde, wenn denn ein "echtes" Objekt gespeichert wäre, dieses mit Create() lediglich auf den Ausgangszustand zurück gesetzt. Du musst den richtigen TypeCast einsetzen.
procedure TDemoForm.FormCreate(Sender: TObject);
begin with ComboBox.Items do AddObject('demo', TObject(TStringList)); end; procedure TDemoForm.ButtonClick(Sender: TObject); var s: TStrings; begin with ComboBox.Items do s := TClass(Objects[0]).Create as TStrings; s.Add('Ingo'); s.Free; end; Freundliche Grüße |
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Zitat:
Ich hatte TClass(..) as .. völlig unterschlagen, wohl weil ich solche Konstrukte noch nie verwenden musste. So geht's jedenfalls. Danke. Back to Topic: Damit ist aber auch noch nicht geklärt, wieso (angeblich) das AddObject (im "Problemcode" hier im Thread) Speicher verbrät. |
Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
Hallo OldGrumpy,
Zitat:
Zitat:
Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz