Wie werde ich zur Laufzeit erzeugte Steuerelemente wieder los?



  • Hallo,

    zur Laufzeit erzeuge ich Buttons, speichere deren Adresse in einem Button-Feld (testBtns[][]) und setze diese Buttons auf eine ScrollBox.

    Um die ScrollBox bei Bedarf wieder zu leeren, durchlaufe ich ihre Steuerelemente und setze deren Parent-Eigenschaft auf NULL.

    for (int i = ScrollBox->ControlCount - 1; i >= 0; i--)
    {
        ScrollBox->Controls[i]->Parent = NULL;
    }
    

    Wie stelle ich es aber an, die Buttons, die ja noch im Speicher ruhen, entgültig zu löschen?

    Anbei der Vollständigkeit halber die wesentlichen Code-Fragmente:

    // === Header-Datei (*.h) === //
    
    #define N_ZEILEN 10
    #define N_SPALTEN 20
    
    // (...) //
    
    // Variablendeklaration
    TButton* testBtns[N_ZEILEN][N_SPALTEN];
    
    // (...) //
    
    // === Implementations-Datei (*.cpp) === //
    
    for (int zeile = 0; zeile < N_ZEILEN; zeile++)
    {
        for (int spalte = 0; spalte < N_SPALTEN; spalte++)
        {
            TButton* (&theButton) = testBtns[zeile][spalte];
            theButton = new TButton(this);
    
            // Ausrichtung
            theButton->SetBounds(..., ..., ..., ...);
    
            // Beschriftung
            theButton->Caption = AnsiString("(") + zeile +  " | " + spalte + ")";
    
            // Parent
            theButton->Parent = ScrollBox;
    
        } // for spalte
    } // for zeile
    

    Gruß
    Leo



  • normal löscht mal alles mit new erstellte durch delete
    da du aber this an de konstruktor übergibts glaube ich das die Komponente auf die this zeigt das übernimmt, bin mir aber nicht sicher.

    wenn du also die buttons selber löschen willst übergib NULL und lösch se dann mit delete.



  • Beliah schrieb:

    <Edit: Zitate auf das Notwendigste beschränken. Danke!>

    Die Sache mit 'this' klingt interessant. Kann das jemand noch etwas genauer erklären?

    Auch wundere ich mich über die Art der Zuweisung in der ersten Zeile:

    TButton* (&theButton) = testBtns[zeile][spalte];
    theButton = new TButton(this);
    

    Hier wird doch offensichtlich die Adresse von theButton dem Feld testBtns[][] zugewiesen.
    Wieso wird hier von links nach rechts zugewiesen und nicht wie sonst üblich?

    Gruß
    Leo


Anmelden zum Antworten