AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi ComboBox mit unterschiedlichen Objekten - sauber abraeumen?
Thema durchsuchen
Ansicht
Themen-Optionen

ComboBox mit unterschiedlichen Objekten - sauber abraeumen?

Offene Frage von "OldGrumpy"
Ein Thema von OldGrumpy · begonnen am 23. Feb 2007 · letzter Beitrag vom 23. Feb 2007
Antwort Antwort
Seite 2 von 3     12 3      
raiguen
(Gast)

n/a Beiträge
 
#11

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum

  Alt 23. Feb 2007, 10:14
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;
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#12

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum

  Alt 23. Feb 2007, 10:27
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

Achja, das fehlt noch:

Delphi-Quellcode:
type
  TSingleEffect= class(TPanelEffect)
  [...]
  end;
  TSingleEffectClass= class of TSingleEffect;
Kommt das nur mir ziemlich wurstig vor?
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum

  Alt 23. Feb 2007, 10:50
Von welchem Typ ist eigentlich MyComboBox? TComboBox oder etwas selbstgeschriebenes?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#14

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum

  Alt 23. Feb 2007, 11:12
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
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#15

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum

  Alt 23. Feb 2007, 11:28
Zitat von IngoD7:
Von welchem Typ ist eigentlich MyComboBox? TComboBox oder etwas selbstgeschriebenes?
Weder noch, TTntComboBox - die ComboBox aus den TNTWare Unicode Controls.

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? 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"...
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum

  Alt 23. Feb 2007, 11:33
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?
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum

  Alt 23. Feb 2007, 11:51
Zitat von OldGrumpy:
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 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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#18

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum

  Alt 23. Feb 2007, 12:07
Hallo Ingo,

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 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
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#19

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum

  Alt 23. Feb 2007, 12:53
Hi marabu,
danke für die Erklärung!

Zitat von marabu:
Hallo Ingo,
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 von marabu:
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.
Sowas in der Art?
Delphi-Quellcode:
var
   ObjVar: TObject;
begin
   ObjVar := MyComboBox.Items.Objects[MyComboBox.ItemIndex].Create;
end;
Das klappt doch nicht, oder?
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#20

Re: ComboBox mit unterschiedlichen Objekten - sauber abraeum

  Alt 23. Feb 2007, 13:00
Zitat von "IngoD7:
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*
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 04:18 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