Objekte freigeben: Treeview, Listbox, Stringgrid
-
Ich habe bei einem Treeview die Knoten über ein Bookkmark und AddObjekt mit den Datensätzen einer Tabelle verbunden. Wenn ich den Baum neu aufbaue, lösche ich vorher die Bookmarks, damit keine Speicherleichen entstehen. Muss ich die Objekte des Trees auch noch löschen?
Gleiches gilt für die Listbox, nur das ich ein Integerwert hinterlegt habe. Dort habe ich aber die Objekte nicht gelöscht, sondern Listbox->Clear() aufgerufen. Das löscht aber nicht die Objecte!? Wie lösche ich diese?
Beim Stringgrid habe ich ein ähnliches Problem wie bei der Listbox! Beim Stringgrid gibts ja keine Clear-Methode. Muss ich da über ne Schleife alle Zellen durchgehen und die Objekte "per Hand" löschen!?
Gibt es im Bilder überhaupt eine Speicher-Überwachungsmöglichkeit, wo einem aufgezeigt wird, wo man Speichermüll rumliegen hat?
-
Original erstellt von AlTheKingBundy:
**Ich habe bei einem Treeview die Knoten über ein Bookkmark und AddObjekt mit den Datensätzen einer Tabelle verbunden. Wenn ich den Baum neu aufbaue, lösche ich vorher die Bookmarks, damit keine Speicherleichen entstehen. Muss ich die Objekte des Trees auch noch löschen?
**ja
**
Gleiches gilt für die Listbox, nur das ich ein Integerwert hinterlegt habe. Dort habe ich aber die Objekte nicht gelöscht, sondern Listbox->Clear() aufgerufen. Das löscht aber nicht die Objecte!? Wie lösche ich diese?
**Wenn du Objekte mit new erzeugt hast, diese als Objekt der Stringliste hinzugefügt hast musst du diese auch wieder freigeben.
**
Beim Stringgrid habe ich ein ähnliches Problem wie bei der Listbox! Beim Stringgrid gibts ja keine Clear-Methode. Muss ich da über ne Schleife alle Zellen durchgehen und die Objekte "per Hand" löschen!?
**jeder ist für den Speicherbereich, welche er selbst reserviert, selbst verantwortlich. Das ist grundsätzlich immer so. Woher sollte das StringGrid auch wisssen, was du da rein packst.
**
Gibt es im Bilder überhaupt eine Speicher-Überwachungsmöglichkeit, wo einem aufgezeigt wird, wo man Speichermüll rumliegen hat?**CodeGuard
Gehe auf Projekt/Optionen und dann auf "CodeGuard". Aktiviere die Optionen dort.
-
Hi Andreas,
erst mal Danke für die schnelle Antwort. Mir ist bewusst, dass man verantwortlich für seinen Speicher ist. Wenn ich was mit new erzeugt hätte, wärs ja kein Problem. Hab ich aber nicht. Ich habe die Objekte z.B. wie folgt hinterlegt:
StringGrid1->Objects[0][1] = (TObject*)DataModule1->QueryPerson->FieldByName("PERSON_ID")->AsInteger;
Wie kann ich das Objekt dieser Zelle löschen (delete geht nicht!)??? Ähnliches gilt für die Listbox. Beim TreeView habe ich Bookmarks hinterlegt, die ich auch freigebe. Damit ist aber doch noch nicht das Objekt freigegeben!?
-
Ach so und n CodeGuard hab ich nicht gefunden unter Projekte/Optionen. C++-Builder Version 4, hat der das!?
-
Hi,
das Objekt aus der Datenbank hast du nicht selbst erstellt. Deshalb musst und darfst du es auch nicht freigeben.
Du kannst höchstens den Pointer auf NULL setzten:
StringGrid1->Objects[0][1] =NULL;
ist aber nicht zwingend erforderlich.
In welchen Versionen der CodeGuard mit bei ist, weiss ich leider nicht. Ich hab ne 6er- Version Enterprise.