Formular löschen



  • Hallo zusammen, ich habe ein Problem und hoffe hier kann mir jemand helfen.

    Der Sachverhalt meiner Anwendung ist der, dass ein Formular mit new erzeugt wird. Mich interessiert was mit dem Speicher passiert den ich mit new angelegt habe passiert wenn die Anwendung geschlossen wird? Wird dieser Freigegeben oder muss ich selber diesen Freigeben?

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

    Anlegen von einem Formular:

    if(F)
       {
           delete F;
       }
    
       F = new TF(Owner);
       F->Show();
    

    Kann mir bitte jemand helfen?
    *
    Mit freundlichen Grüßen
    coder24h
    *



  • Das löschen übernimmt in dem Fall der Owner.



  • Mich interessiert speziell was mit dem Speicher passiert wenn ein Formular geschlossen wird!? Wird der Speicher freigegeben oder muss dieser von mir freigegeben werden?

    F = new TF(Owner);
    F->Show();
    

    Jetzt schließt der Anwender das Formular. Ist der Speicher frei oder nicht? Wenn nicht, wie kann ich daführ sorgen, dass der Speicher nach dem Schließen auch frei wird?
    *
    MfG
    coder24h*



  • Der Speicher ist nicht freigegeben, weil das Formular ja noch existiert. Das Schließen des Fensters bedeutet nicht, dass das Formular "zu Abschuss freigegeben" ist. Es könnte ja Bedarf bestehen das Formular erneut anzuzeigen. Unterscheidungen sind Close, Destroy, Show, ShowModal.

    Aber -> siehe Antwort von owner



  • Hallo

    christian schrieb:

    Das Schließen des Fensters bedeutet nicht, dass das Formular "zu Abschuss freigegeben" ist.

    Das ist im allgemeinen richtig, aber coder24h hat ja in OnClose ja Action = caFree;, was das Form nach dem ersten schließen tatsächlich automatisch löscht und damit ungültig macht.

    bis bald
    akari



  • Kann mir vielleicht jemand auf die Finger schauen, denn wenn die Aussage stimmt, dass der Speicher nicht freigegeben wird, verstehe ich nicht warum ich eine Zugriffsverletzung bekomme wenn ich nach dem Schleißen des Formulars diesen noch mal versuche freizugeben.

    Anwendung die DLL nutzt:

    bool TFormDLLLoader::LoadConComDLL(void)
    {
    	if(!this)	return false;    // TFormDLLLoader besitzt keine Instanz
        if(ConComDLL !=0) return true;
    
    	ConComDLL = LoadLibrary("DomkeDLL01.dll"); // Laden
    
        if (ConComDLL !=0)	return true; // Laden erfolgreich
        return false;          // Laden fehlgeschlagen
    }
    
    bool TFormDLLLoader::FreeConComDLL(void)
    {
    	if(!this) return false;	// TFormDLLLoader besitzt keine Instanz
    
        FreeLibrary(ConComDLL); // Entaden
        if(ConComDLL !=0) return true; // Entaden fehlgeschlagen
        return false; // Entaden erfolgreich
    }
    
    bool TFormDLLLoader::OpenConComForm(void)
    {
    	if(!this || ConComDLL ==0) return false;	// TFormDLLLoader besitzt keine Instanz
        if(!pOpenConComForm) //CloseConComForm(); // Bereits geöffnet, also schließen
    
        pOpenConComForm = (TOpenForm*)GetProcAddress(ConComDLL, "_OpenForm");
        if(!pOpenConComForm)	return false; // Öffnen fehlgeschlagen
        pOpenConComForm(this); // Öffnen
        return true; // Öffnen erfolgreich
    }
    
    void __fastcall TFormDLLLoader::miDNConComClick(TObject *Sender)
    {
    	LoadConComDLL();
        OpenConComForm();
    }
    

    in der DLL:

    extern "C" __declspec (dllexport) void OpenForm(TComponent* Owner)
    {
    	if(F)
        {
            delete F;
        }
    
        F = new TF(Owner);
    	F->Show();
    }
    
    void __fastcall TF::FormClose(TObject *Sender, TCloseAction &Action)
    {
       Action = caFree;
       F=NULL;
    }
    


  • Danke akari, du hast mich jetzt aufgeklärt 😉 Was ich nicht verstehe, warum man nicht den gleichen Speicher, im diesen Fall des Formulars, mehrmals freigeben kann? Wenn ich den Speicher bei den anderen Datentypen (int, double,…) mit delete mehrmals freigebe, bekomme ich keine Zugriffsverletzungen!
    *
    Mit freundlichen Grüßen
    coder24h
    *



  • Hallo

    denn wenn die Aussage stimmt, dass der Speicher nicht freigegeben wird

    BCB-Hilfe schrieb:

    caFree : Das Formular wird geschlossen und sein Speicher freigegeben.

    Desweiteren :

    ::LoadConComDLL(void)
    

    das ist veralteter C-Stil, in C++ solltest du da kein void schreiben.

    if(!this)    return false;
    

    Diese Zeile ist überflüssig. Solltest du die tatsächlich aber brauchen (weil du die Mehtode irgendwo für eine NULL-Instanz aufrufst), hast du einen Konzepzfehler, den du beheben solltest und nicht durch solche Symptom-Behandlung überspringst.

    bis bald
    akari



  • Hallo

    warum man nicht den gleichen Speicher, im diesen Fall des Formulars, mehrmals freigeben kann?

    Ich verstehe nicht was du meinst, Speicher darf man immer nur einmal wieder freigeben. Aber je nachdem was das für ein Datentyp ist, kann der Aufruf des Destruktors durch das delete auch zu verschiedenen undefinierten Fehlern führen.

    bis bald
    akari



  • Ich habe mich da falsch ausgedrückt, es ist mir klar, dass man den Speicher 1-mal freigeben kann! Ich habe nur nicht verstanden warum manchmal eine Zugriffsverletzung auftritt und manchmal nicht wenn man das mehrmals macht.
    *
    Vielen Dank
    coder24h
    *



  • Hallo

    diese Frage stellt sich nicht. Das mehrmalige Freigeben kann jeden beliebigen Fehlerverursachen, weil es undefiniert ist. Möglichweise merkt der User nichts davon, möglicherweise stürtzt auch der ganze PC sofort ab...

    bis bald
    akari


Anmelden zum Antworten