Prüfen ob Fenster bereits existiert bzw. Visible-> true buggt :(



  • das problem ist das das ganze in einer mdi-anwendung läuft.
    sprich die mdiform soll z.b. bei klick auf personal das personalformular erzeugen [wenn es noch nicht existiert]:

    if(frmPersonal == NULL) 
    { 
        // Formular erstellen und anzeigen 
        frmPersonal = new TfrmPersonal(this); 
    }
    

    ok, ich hoffe das ist soweit mal richtig 🙂

    wenn das mdi formular geschlossen wird, existiert es doch immernoch und ist nur visible false, oder ?
    aus dieser annahme:

    else 
       { 
          if(frmPersonal->Visible == false) 
          { 
            // existierendes MDI Formular sichtbar machen
            frmPersonal->Visible = true; 
          } 
       }
    

    weist du jetzt ungefähr was ich meine ???



  • binary trust schrieb:

    wenn das mdi formular geschlossen wird, existiert es doch immernoch und ist nur visible false, oder ?

    Hi,
    ich schätze du setzt bei OnClose die Action auf caFree?

    Wenn du das machst wird das Fenster wieder gelöscht! Exsistiert also nicht mehr!

    Wenn du das so machen willst, musst die die CloseAction auf caHide setzten!

    MFG

    Alexander Sulfrian



  • achso,

    das caFree heißt praktisch das das formular wieder gelöscht wird!
    aber warum geht dann folgender code nach dem schließen auchnichtmehr ???

    if(frmRevier == NULL)
       {
            frmRevier = new TfrmRevier(this);
            frmRevier->Show();
       }
    

    if(frmRevier == NULL) heißt doch wenn kein aktuelles frmRevier Formular existiert dann, oder ????



  • Hi,
    nein

    Bei caFree wird nur das Forumlar (an einer bestimmten Adresse im Speicher) gelöscht! Das heißt nicht das der Zeiger auf NULL zugewiesen wird! Der Zeiger zeigt weiter auf die Adresse!

    Wenn du jetzt auf die Adresse zugreifen würdest, erhälst du eine Zugriffsverletzung!

    MFG

    Alexander Sulfrian



  • ach du scheiße, mit zeigern kenne ich mich noch garnicht aus 😞
    heißt das ich sollte am schluss denn zeiger frmRevier* = NULL machen oder wäre es sinnfoller es einfach auf caHide zu setzen und dann später wieder mit visible true zu aktivieren ???

    was ist denn die bessere methode ?



  • Den Pointer auf NULL zu setzen würde nicht funktionieren, wo willst Du es auch machen. In der OnClose()-Funktion etwa? Mache besser mit Hide()



  • shit, ich depp was frag ich überhaupt?
    geht net, ist ja ne mdi anwendung 😞

    und nu ?
    wie kann ich es denn abfragen ob es existiert ?
    ivh will einfach verhindern das ein und dasselbe fensters öfters offen ist ...



  • Probier's doch mal im OnClose-Ereignis mit:

    void __fastcall TForm::FormClose(TObject *Sender, TCloseAction &Action)
    {
       delete this;
    }
    

    oder setze FormStyle auf fsNormal und rufe danach Hide() auf.
    Beim Anzeigen dann wieder umgekehrt. Dann darfst natürlich nicht
    die Action auf caFree setzen.

    Gruß,

    Alexander



  • ok danke aber damit erreiche ich doch immernoch nicht das was ich brauche, oder ?

    ich will prüfen ob das fenster existiert wenn nicht soll es angelegt und angezeigt werden:

    //------------ in form1
            if(Form2 == NULL)
            {
                    Form2 = new TForm2(this);
                    Form2->Show();
            }
    
    // ----------- in form2
    
    void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
    {
       delete this;        
    }
    

    weiter oben wurde mir ja gesagt:

    "Bei caFree wird nur das Forumlar (an einer bestimmten Adresse im Speicher) gelöscht! Das heißt nicht das der Zeiger auf NULL zugewiesen wird! Der Zeiger zeigt weiter auf die Adresse! ".

    aber wie kann ich denn nun dann prüfen ob ein fenster existiert oder nicht ???
    das darf doch eigentlich nicht so schwer sein, oder ????



  • Folgender Code gilt fuer MDI Fenster:

    try { 
            for (int i = 0; i < MDIChildCount; i++) 
                if (dynamic_cast<TForm2*>(MDIChildren[i])) 
            { 
                    MDIChildren[i]->WindowState = wsNormal; 
                    return; 
            } 
            Form2 = new TForm2(Application); 
            Form2 ->Show(); 
        }  
        catch(Exception &ex) 
        { 
          ShowMessage("Error: " + ex.Message); 
        }
    

    Der dynamic_cast gibt true zurueck falls das MDI-Fenster existiert.
    Ansonsten wird es neu erzeugt.

    Du solltest das Beispiel leicht an deine Beduerfnisse anpassen koennen.
    Das Prinzip bleibt das gleiche.


Anmelden zum Antworten