Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ComboBox mit unterschiedlichen Objekten - sauber abraeumen? (https://www.delphipraxis.net/87088-combobox-mit-unterschiedlichen-objekten-sauber-abraeumen.html)

raiguen 23. Feb 2007 09:14

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
 
Zitat:

Zitat von OldGrumpy
Abgeraeumt soll das ganze natürlich in TMyForm.FormDestroy (gebunden ans OnDestroy-Event):

Delphi-Quellcode:
procedure TMyForm.FormDestroy(Sender: TObject);
var i: integer;
Begin
[...]
for i:=0 to MyComboBox.Items.Count-1 do MyComboBox.Items.Objects[i].Free;
[...]
End;
So, und nun bin ich mal gespannt, was ich da übersehen hab :)

Nur ne Kleinigkeit ( das wurde aber bereits schon erwähn): vor dem Freigeben des Objekts ist keine Prüfung auf nil oder Assigned; d.h. bei einem nicht vorhandenen Objekt kann das Free durchaus ne AV produzieren ;)
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;

OldGrumpy 23. Feb 2007 09:27

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
 
Zitat:

Zitat von raiguen
Nur ne Kleinigkeit ( das wurde aber bereits schon erwähn): vor dem Freigeben des Objekts ist keine Prüfung auf nil oder Assigned; d.h. bei einem nicht vorhandenen Objekt kann das Free durchaus ne AV produzieren ;)

Danke raiguen,

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:
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;
Da setzt es bei mir dann wirklich langsam aus :mrgreen:

Achja, das fehlt noch:

Delphi-Quellcode:
type
  TSingleEffect= class(TPanelEffect)
  [...]
  end;
  TSingleEffectClass= class of TSingleEffect;
Kommt das nur mir ziemlich wurstig vor? :gruebel:

IngoD7 23. Feb 2007 09:50

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
 
Von welchem Typ ist eigentlich MyComboBox? TComboBox oder etwas selbstgeschriebenes?

marabu 23. Feb 2007 10:12

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
 
Hallo,

Delphi-Quellcode:
procedure TMyForm.FormCreate(Sender: TObject);
Begin
[...]
  MyComboBox.items.addObject(menutext, TObject(integer(TMyEffect)));
  MyComboBox.items.addObject(menutext2, TObject(integer(TMyEffect2)));
[...]
End;
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...

Freundliche Grüße

OldGrumpy 23. Feb 2007 10:28

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
 
Zitat:

Zitat von IngoD7
Von welchem Typ ist eigentlich MyComboBox? TComboBox oder etwas selbstgeschriebenes?

Weder noch, TTntComboBox - die ComboBox aus den TNTWare Unicode Controls.

Zitat:

Zitat von marabu
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...

Freundliche Grüße

Ich habe aber auf jeden Fall Memoryleaks die aus dem AddObject resultieren, und die sind zu gross als dass es einfach nur Pointer sein könnten. Dieses Projekt ist echt der Wahnsinn... Der Editor ist zum Beispiel keine "echte" grafische Komponente mit eigenen Controls, sondern der wird vom Mainform aus mit den Controls die auf dem Mainform liegen "verdrahtet". Macht sowas Sinn? :gruebel: Gibt auf jeden Fall derbe Probleme beim korrekten Abräumen da immer wieder die Frage auftaucht "wem gehört dies oder jenes, und wer raeumt es ab"...

IngoD7 23. Feb 2007 10:33

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
 
Zitat:

Zitat von marabu
Hallo,

Delphi-Quellcode:
procedure TMyForm.FormCreate(Sender: TObject);
Begin
[...]
  MyComboBox.items.addObject(menutext, TObject(integer(TMyEffect)));
  MyComboBox.items.addObject(menutext2, TObject(integer(TMyEffect2)));
[...]
End;
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...

Naja, TComboBox.Items.Objects[] enthält immer nur Referenzen. Die Frage ist, ob diese Referenz auf ein real existierendes Objekt zeigt, das man auch freigeben könnte. Das scheint hier eben nicht der Fall zu sein.

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:

IngoD7 23. Feb 2007 10:51

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
 
Zitat:

Zitat von OldGrumpy
Zitat:

Zitat von IngoD7
Von welchem Typ ist eigentlich MyComboBox? TComboBox oder etwas selbstgeschriebenes?

Weder noch, TTntComboBox - die ComboBox aus den TNTWare Unicode Controls.

Die kenne ich nicht. Wer weiß, was die alles in AddObjects anstellt.

Zitat:

Zitat von OldGrumpy
Ich habe aber auf jeden Fall Memoryleaks die aus dem AddObject resultieren, und die sind zu gross als dass es einfach nur Pointer sein könnten.

Die Aussage würde ich dir bei TComboBox nicht abnehmen, weil in ihr nur Zeiger gehalten werden, die sich mit dem Freigeben einer Box vom Typ TComboBox erledigen. Da aber eine andere ComboBox-Klasse verwendet wird, wird man (du) wohl diese erstmal analysieren müssen.

marabu 23. Feb 2007 11:07

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
 
Hallo Ingo,

Zitat:

Zitat von IngoD7
... Naja, TComboBox.Items.Objects[] enthält immer nur Referenzen. Die Frage ist, ob diese Referenz auf ein real existierendes Objekt zeigt, das man auch freigeben könnte. Das scheint hier eben nicht der Fall zu sein. ...

Klassenreferenz ist in Object Pascal ein terminus technicus, die Online Hilfe enthält dazu sicher ein Kapitel. Klassen werden nicht freigegeben, Free ist auch keine class method.

Zitat:

Zitat von IngoD7
... 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? ...

Im vorliegenden Fall ist TObject(Integer(TMyEffect)) identisch mit TMyEffect - zuletzt ist alles ein Zeiger in unterschiedlichen Interpretationen. Durch die in Objects[] hinterlegte Klasse kann bei Auswahl eines Items der ComboBox die entsprechende Klasse instanziert werden.

Freundliche Grüße

IngoD7 23. Feb 2007 11:53

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
 
Hi marabu,
danke für die Erklärung! :thumb:

Zitat:

Zitat von marabu
Hallo Ingo,
Zitat:

Zitat von IngoD7
... Naja, TComboBox.Items.Objects[] enthält immer nur Referenzen. Die Frage ist, ob diese Referenz auf ein real existierendes Objekt zeigt, das man auch freigeben könnte. Das scheint hier eben nicht der Fall zu sein. ...

Klassenreferenz ist in Object Pascal ein terminus technicus, die Online Hilfe enthält dazu sicher ein Kapitel. Klassen werden nicht freigegeben, Free ist auch keine class method.

So weit, so (auch schon vorher) klar. Letztlich wollte ich genau das auch nur bestätigen/ergänzen. (Auch wenn ich lange nicht alles zum Thema Klassenreferenzen und Klassenmethoden verstanden habe, was ich jemals drüber gelesen habe. :| )

Viel spannender ist da folgendes:
Zitat:

Zitat von marabu
Zitat:

Zitat von IngoD7
... 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? ...

Im vorliegenden Fall ist TObject(Integer(TMyEffect)) identisch mit TMyEffect - zuletzt ist alles ein Zeiger in unterschiedlichen Interpretationen. Durch die in Objects[] hinterlegte Klasse kann bei Auswahl eines Items der ComboBox die entsprechende Klasse instanziert werden.

:shock: Sowas in der Art?
Delphi-Quellcode:
var
   ObjVar: TObject;
begin
   ObjVar := MyComboBox.Items.Objects[MyComboBox.ItemIndex].Create;
end;
Das klappt doch nicht, oder? :gruebel:

OldGrumpy 23. Feb 2007 12:00

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum
 
Zitat:

Zitat von "IngoD7
Zitat:

Zitat von OldGrumpy
Ich habe aber auf jeden Fall Memoryleaks die aus dem AddObject resultieren, und die sind zu gross als dass es einfach nur Pointer sein könnten.

Die Aussage würde ich dir bei TComboBox nicht abnehmen, weil in ihr nur Zeiger gehalten werden, die sich mit dem Freigeben einer Box vom Typ TComboBox erledigen. Da aber eine andere ComboBox-Klasse verwendet wird, wird man (du) wohl diese erstmal analysieren müssen.

Diese Memoryleaks habe ich auch nach testweiser Umstellung auf TComboBox weiterhin. Ich begreif den Mechanismus dahinter auch nicht, ich sehe nur am Stacktrace von FastMM4 was da passiert - und der letzte Call daraus ist halt das AddObject() - die Calls danach sind mir klar. Also wird da aus welchen Gründen auch immer Speicher belegt den ich nicht wieder freigeben kann *grmpf*


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 Uhr.
Seite 2 von 3     12 3      

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