Ne Listbox-Frage oben drauf



  • Werden über Listbox->Clear auch alle Objects gelöscht, die mit den Items verbunden waren (damit es keine Speicherleichen im Keller gibt)?



  • So weit ich weiss ->Nein.



  • Ausschintte aus der BCB-Hilfe

    TStrings::Clear()
    Mit Clear wird eine virtuelle Methode eingeführt, die alle String-Einträge und eventuell damit verbundene Objekte aus der Liste löscht.

    virtual void __fastcall Clear(void) = 0;

    Beschreibung

    Nachkommen von TStrings implementieren eine Clear-Methode, mit der sich alle String-Einträge der Liste löschen lassen. Hierbei werden auch eventuell vorhandene Objekt-Referenzen der Strings entfernt.

    TCustomListBox::Clear()
    Die Methode Clear löscht alle Enträge aus dem Listenfeld.

    void __fastcall Clear(void);

    Beschreibung

    Mit Clear können Sie alle Einträge des Listenfeldes in einem Schritt löschen. Obwohl die Einträge eines Listenfeldes standardmäßig vom Typ TStrings sind, verwenden Sie die Methode Clear der Liste anstelle der Methode Clear der Eigenschaft Items. Dadurch können Nachkommen von TCustomListBox alle weiteren erforderlichen Löschvorgänge zusätzlich zum Löschen der Einträge aus der Eigenschaft Items in der Methode Clear ausführen. Daher sollten Anwendungen

    ListBox1->Clear();

    anstelle von

    ListBox1->Items->Clear();

    verwenden.

    [ Dieser Beitrag wurde am 15.08.2002 um 01:40 Uhr von WebFritzi editiert. ]



  • hups 🙄



  • Errare Humanum est



  • 😉



  • Hallo,

    noch mal ne Frage hierzu.

    Hat schon mal jemand bei der Ausführung den CodeGuard gestartet ?
    Das gibt ne "schöne" Überraschung. Die mit TListBox->Items->AddObject(...)
    angelegten Einträge, bzw. deren Objecte werden NICHT gelöscht !

    Nun zu meiner Frage :

    Ich habe mir eine Komponente gemacht, abgeleitet von TCustomListBox,
    und die Methode "void __fastcall Clear(void);" überschrieben.
    In der Anwendung gehts super, es bleiben keine Speicherreste übrig.
    Jedoch wenn die ListBox beim schließen der Anwendung noch Einträge
    (mit zugehörigen Objekten) hat, entstehen Speicherreste.

    a) Warum wird denn die Methode Clear nicht vom Destruktor aufgerufen?

    b) Warum kann ich Clear(); nicht im Destruktor aufrufen ?

    Bringt einen Fehler, wenn die Anwendung geschloßen wird und wenn ich die
    Komponente vom From lösche.
    EInvalidOperation Meldung Element 'LB_Datein' hat kein übergeordnetes Fenster

    Gruß Mario 😕

    [ Dieser Beitrag wurde am 17.01.2003 um 09:07 Uhr von Mario Rosenbohm editiert. ]



  • My dears!
    Es ist vielleicht auch nicht immer sinnvoll, beim Löschen der Listbox-Einträge mit Clear() auch zugeordnete Objekte zu löschen, weil man diese vielleicht auch an anderer Stelle braucht. Deshalb sollte man sich die Mühe machen, diese manuell zu zerstören.

    @Mario: Im Destruktor der Komponente ist es vermutlich schon zu spät, Clear() aufzurufen.



  • Hi @xel,

    wenn es im Destruktor schon zu spät ist, wo denn dann ?

    Die Komponente ist eine ListBox zum Anzeigen und Sortieren von Dateien,
    sie fuktioniert schon voll in der IDE.

    ???

    Mario



  • huhu,

    hat denn keiner eine Idee ?

    Ich habe ein paar Varianten ausprobiert, aber ich musste immer die Funktion

    TCustomListBox::Clear() überschreiben, sonst meckert der CodeGuard über

    Speicherreste bei den zur Tlist gehörenden Objekten.

    ABER anscheinend wird beim schließen, löschen der TListbox nicht Clear() aufgerufen.

    Haaallloooo WebFritzi ????

    Mario 😕



  • mhhh

    kann es evt daran liegen das :
    du die methode clear überschrieben hast wird ja erstmal das alte Clear net mehr gemacht weil is ja neu definiert

    aber wieso wenn du schon deine klasse von TCustomList ableitest machts du das mit Clear() net och so ?

    lass doch dein eneues Clear() von dem alten erben dann wirds doch automatisch mit ausgeführt

    ich denke mal das ja dein neurer dekonstruktor ja auch von dem alten erbt

    hoffentlich hilfts

    Gagget

    P.S: Sorry anfänger. Ich wollz au ma wat sagen LOl


Anmelden zum Antworten