AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi MemoryLeak bei Frame und TComboBox.Items.AddObject()
Thema durchsuchen
Ansicht
Themen-Optionen

MemoryLeak bei Frame und TComboBox.Items.AddObject()

Ein Thema von Aviator · begonnen am 30. Nov 2020 · letzter Beitrag vom 1. Dez 2020
Antwort Antwort
Poelser

Registriert seit: 21. Apr 2008
Ort: Europa
145 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: MemoryLeak bei Frame und TComboBox.Items.AddObject()

  Alt 30. Nov 2020, 17:36
Als Lösung würde ich das auch nicht bezeichnen, eher als Würgaround.

Klar sollte der Eigentümer des Frames ein Form oder ein Control á la TPanel sein und nicht die Applikation selbst. Ich hab' schon seit einiger Zeit nichts mehr mit Frames gemacht, kann mich aber aus D7-Zeiten noch daran erinnern, dass die Dinger sich oft irgendwie komisch verhalten haben

LG aus dem hohen Norden, Edmund
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.562 Beiträge
 
Delphi 12 Athens
 
#2

AW: MemoryLeak bei Frame und TComboBox.Items.AddObject()

  Alt 30. Nov 2020, 20:04
Zitat:
Ein OnCreate() und OnDestroy() gibt es bei Frames ja leider nicht. Ich muss das Frame aber dynamisch erzeugen und es mit Werten füllen.
Dann aber mit override.
Am Speicherleck ändert es aber nichts. Beim Aufruf des Create über einen Vorfahrentypen würde dann die ComboBox einfach leer sein weil dem Vorfahren dein Create nicht bekannt ist über dessen "virtual". (z.B. wenn der Frame im Formdesigner auf die Form gepappt und in der DFM gespeichert wurde)

Haltepunkt in TFrame1.Destroy und schauen ob das Event aufgerufen wird und wenn ja, ob dort die Items der Combobox "noch" gefüllt sind.

Alternative:
Delphi-Quellcode:
  TTestObject = class(TComponent)
  ...

  TestObject := TTestObject.Create(cbb1); // oder self oder wo immer es passt
  TestObject.TestProperty := 'Item 1';
  cbb1.Items.AddObject('Item 1', TestObject);

  // und das Free im Destroy kann entfallen
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (30. Nov 2020 um 20:07 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: MemoryLeak bei Frame und TComboBox.Items.AddObject()

  Alt 30. Nov 2020, 20:09
Danke für deine Anteilnahme himitsu, aber du solltest meinen ersten Beitrag und auch die nachfolgenden Posts lesen. Dann wirst du merken, dass deine Vorschläge so alle nicht umsetzbar sind bzw. alles schon so durchgeführt wurde.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.562 Beiträge
 
Delphi 12 Athens
 
#4

AW: MemoryLeak bei Frame und TComboBox.Items.AddObject()

  Alt 30. Nov 2020, 20:27
Wie gesagt:
Zitat:
Haltepunkt in TFrame1.Destroy und schauen ob das Event aufgerufen wird und wenn ja, ob dort die Items der Combobox "noch" gefüllt sind.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: MemoryLeak bei Frame und TComboBox.Items.AddObject()

  Alt 30. Nov 2020, 21:36
Wie gesagt:
Zitat:
Haltepunkt in TFrame1.Destroy und schauen ob das Event aufgerufen wird und wenn ja, ob dort die Items der Combobox "noch" gefüllt sind.
Wie gesagt ... lies bitte meinen Post komplett und auch die der anderen Mitglieder ...
Post.jpg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.562 Beiträge
 
Delphi 12 Athens
 
#6

AW: MemoryLeak bei Frame und TComboBox.Items.AddObject()

  Alt 30. Nov 2020, 23:00
Also entweder waren "diese" Items schon immer leer (z.B. andere oder falsche Frame-Instanz oder dein Create nicht ausgeführt), oder das Leeren wurde vorher schon einmal ausgeführt (durch irgendwas ausgelöst *1).
Letzteres würde man mitbekommen, mit einem weiteren Haltepunkt in einem OnChange der Komponente.
Man könnte auch die VCL debuggen, aber wenn das Löschen nicht über eine Klassenmethode ala Items.Clear, sondern via Message direkt an Windows geht, dann bringt ein Haltepunkt in der VCL/TComboBox nicht viel.

1) Würde ich aber erstmal ausschließen, denn du scheinst ja keinen anderen Code zu haben, der die Items löscht.
Wenn, dann würde ich eher erwarten, dass bereits die komplette ComboBox gelöscht wurde und nicht nur die Items.

OnChange der ComboBox reagiert aber auf Text/ItemIndex.
Für ein Change-Event des Items müsste man wohl irgendeine Message abfangen.
* entweder ein Hook auf die/mehrere Setter-Message, welche die Items zuweist/löscht
* oder eine Notify-Message (falls es sowas gibt)
Findet man im MSDN/PSDK von Windows, wenn man schaut mit welcher Message TComboBox die Items z.B. beim Add an Windows übergibt, und was beim Hersteller dazu steht.



Man könnte auch ein Destroy in seine Datenklasse einfügen, darein einen Haltepunkt und dann schauen von wo die Freigabe her kam.
* entweder in diesem Frame/Combobox gab es nie Items (rausfinden warum nicht)
* oder das wird igentwo "falsch" freigeben (erstmal rausbekommen wo und dann warum)
Aber wenn die Speichelecks deine Klassen-Instanzen sind (sind sie das wirklich? ), dann wurde TTestObject.Destroy ja nicht aufgerufen und ein Haltepunkt dort hilft nichts.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (30. Nov 2020 um 23:12 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: MemoryLeak bei Frame und TComboBox.Items.AddObject()

  Alt 30. Nov 2020, 23:17
Ich habe ja schon an allen erdenklichen Stellen versucht Breakpoints zu setzen und den StackTrace anzuschauen. Was ich glaube ich nicht gemacht habe, ist die Destroy Methode meiner Klasse, die ich als Object hinzufüge, zu überschreiben und da mal einen Breakpoint reinzusetzen.

Das wäre wirklich noch eine Idee und einen Versuch wert. Werde ich morgen/heute mal ausprobieren.

Wenn du das selbst auch mal testen willst, dann kannst du natürlich gerne auch mal das Testprojekt aus meinem ersten Post herunterladen und es versuchen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.758 Beiträge
 
Delphi 12 Athens
 
#8

AW: MemoryLeak bei Frame und TComboBox.Items.AddObject()

  Alt 30. Nov 2020, 23:24
Ich fürchte, mit deinem Ansatz wirst du nicht weit kommen. Die ComboBox verwaltet die ITEMDATA-Einträge selbst und offenbar werden die beim Schließen des Forms schon entfernt. Es gibt meines Wissens keinen Mechanismus um das zu umgehen ohne über OwnerDraw zu gehen. Selbst dann muss man die WM_DELETEITEM Message auch noch selbst abfangen und verarbeiten.

Wenn du die Kontrolle über die Items in der Combobox hast, dann kannst du die TTestObject-Instanzen auch über eine TObjectList<TTestObject> verwalten. Per Default ist dann die Liste für die Freigabe zuständig.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 08:52 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