dynamisch erzeugte Form nach close löschen



  • hi Leute

    ich habe eine MainForm die auf Click eine neue Form erzeugt (dynamisch, direkt mit new ). Von dieser Form können beliebig viele erzeugt werden. Nach Schließen dieser Form soll automatisch die Form destroyed werden und der Speicher durch die MainForm wieder freigegeben werden.

    Die Frage die sich mir nun stellt:

    - Wie kann ich den Löschvorgang am besten triggern. Gibt es ein zentrales Event, welches irgendwie erkennt, dass eine Form geschlossen wurde. Die "schließende" Form müsste irgendwie ein Event außerhalb (z.b. in der MainForm) auslösen welches dann den Delete-Vorgang startet.

    Ich könnte es auch unsauber coden, dass ich den Speicher erst beim Beenden der Applikation freigebe, aber das ist nicht mein Stil. Ich würde die Form gern sofort löschen.



  • Du könntest doch das OnClose abfangen und dem Hauptformular eine Nachricht senden. Muss das Hauptformular eine Referenz auf das geöffnete Form besitzen? Ich bin mir da nicht sicher: Kann ein Form sich selbst löschen, z.B. mit Release()?



  • Um das Senden einer Nachricht an das Hauptformular werd ich wohl nicht herum kommen.
    Ich hatte überlegt eine Art Event zu erzeugen und dann mit einem sekündlichen Timer in der HauptForm praktisch zu pollen ob ein Event vorhanden ist oder nicht.

    Ist zwar nicht sehr elegant, aber würde wohl funzen.

    Das Selbstlöschen mit Release oder anderen Funktionen würde nicht ausreichen, da ich auch noch den Eintrag in einer speziellen Liste entfernen muss.



  • witte schrieb:

    Ich bin mir da nicht sicher: Kann ein Form sich selbst löschen, z.B. mit Release()?

    Ja; genau dafür gibt es TCustomForm::Release().

    It0101 schrieb:

    Um das Senden einer Nachricht an das Hauptformular werd ich wohl nicht herum kommen.
    Ich hatte überlegt eine Art Event zu erzeugen und dann mit einem sekündlichen Timer in der HauptForm praktisch zu pollen ob ein Event vorhanden ist oder nicht.

    Warum einfach, wenns auch umständlich geht? 😉

    Es liegt doch eigentlich nahe, daß diese Konstellation bei der VCL-Programmierung nicht unüblich ist und daher eine saubere Lösung auf VCL-Ebene existieren dürfte. Konkret:

    void __fastcall TFrmMain::Notification (TComponent* AComponent, TOperation Operation)
    {
        if ((AComponent == FMySubComponent) && (Operation == opRemove))
            FMySubComponent = 0;
        TForm::Notification (AComponent, Operation);
    }
    


  • wiso so ineffizient?

    geht doch ganz einfach mit
    http://docs.codegear.com/docs/radstudio/radstudio2007/RS2007_helpupdates/HUpdate4/DE/html/delphivclwin32/Forms_TCustomForm_OnClose.html

    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    	Action = caFree;
    }
    


  • Du hast recht. "caFree" ist explizit in der Hilfe so angegeben. Es gibt den Speicher frei 🙂



  • Das ändert doch aber nichts daran, dass die Hauptform über das Schliessen informiert werden soll.
    Ich mach sowas normalerweise mit Callbackfunktionen, die ich im Konstruktor der Form übergebe.


Anmelden zum Antworten