Buttons dynamisch zur Laufzeit erstellen und entfernen



  • Hallo

    Ich erstelle je nach RecordCount Buttons in einer Schleife.
    Dabei wird der Name jedes Buttons dynamisch erstellt.
    Das klappt auch soweit.

    TRect R;
    
    i = 0;
    
    while (!ADOQueryGrid->Eof) {
    
    i= i + 1;
    butDay->Name = "bDet" + IntToStr(i);
    butDay->Caption = "Notiz";
    butDay->Left = stringGridMain->Left + R.Left + 2;
    butDay->Top = stringGridMain->Top + R.Top + 2;
    butDay->OnClick = butDayClick;
    butDay->Parent = MainForm; 
    
    ADOQueryGrid->Next();
    }
    

    Wenn die Schleife ein 2.tes Mal ausgeführt wird, müssen die
    Buttons vorher wieder entfernt werden. Wie geht das ?
    Ich hab folgende Funktion dafür.

    void TMainForm::removeButtons() {
        for (i=1; i<=globButCount; i++) {
           MainForm->RemoveComponent("bDet" + IntToStr(i));
        }    
     }
    

    Geht jedoch nicht, weil eine Komponente erwartet wird
    und nicht der Namen als AnsiString 😞

    Gruß und Danke



  • Hallo

    siehe FAQ, Thread Dynamische Arrays von Komponenten oder Objekten

    bis bald
    akari



  • Danke ...

    DynamicArray<TButton*>btnArray; klappt

    Nur beim Löschen des Button geht es nicht:

    void TProjForm::removeButtons() {
           for (i=0; i<=btnArray.Length - 1; i++) {
                ProjForm->RemoveControl(btnArray[i];
           }
     }
    

    Entfernt den Button vom Parent, aber der Button
    muß ja komplett aufgelöst werden, denn er wird ja mit:

    btnArray[i] = new TButton(this);

    permananent neu erzeugt



  • Hallo

    deshalb sollte das ja auch so aussehen

    void TProjForm::removeButtons() {
           for (i=0; i < btnArray.Length; i++) {
                delete btnArray[i];
           }
           btnArray.Length = 0; // Gegenenfalls Array zurücksetzen
    
     }
    

    bis bald
    akari



  • Informier dich mal, was das this hier im Aufruf bedeutet (Stichwort Owner).

    btnArray[i] = new TButton(this);
    


  • Hallo

    @ Braunstein : der Owner bringt dem OP hier (anscheinend) nichts, denn er will ja die Buttons noch zur Lebenszeit des Owners neu erstellen.

    Wenn die Schleife ein 2.tes Mal ausgeführt wird, müssen die
    Buttons vorher wieder entfernt werden. Wie geht das ?

    Und wenn man davon ausgeht das Owner noch mehr Controls außer die Buttons beinhaltet, kann man keine Automatische Bereinigung laufen lassen.

    bis bald
    akari



  • Danke......... 👍
    war grade schon am suchen nach delete ...
    und was btnArray[i]->... anbietet

    buttons werden jetzt dynamisch erzeugt und wieder gelöscht.

    Genau, automatische Bereinigung alle Komponentene gäbe eine blanke Form.

    Generell ist meine Aufgabenstellung, Buttons zu erstellen in
    Gridspalte mit Menge je nach Zeilenanzahl. Momentan mach ichs mit Fake-Buttons.
    Sobald aber eine Spalte resized wird, bleibt der Button sitzen / überlappt in andere Spalte.

    Grüße Euch


Anmelden zum Antworten