Announcement

Collapse
No announcement yet.

Modale Fenster schließen.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Modale Fenster schließen.

    Hi Leute,<br><br>
    wie kann ich ein modales Fenster Schließen? Folgende Procedure wird von einem Timer aufgerufen. Es werden auch alle Fenster (Außer Form1 und Form3 natürlich ;-)) fein geschlossen, nur leider die Modalen nicht. In der Hilfe steht, mit ModalResult <> 0 kann man ein Models Fenster schließen.<br><br>

    Procedure TForm1.CloseAllWindows;<br>
    var<br>
    i : integer;<br>
    begin<br>
    for i := 0 to Application.ComponentCount -1 do<br>
    begin<br>
    If (TForm(Application.Components[I]).Name <> '') and<br>
    (TForm(Application.Components[I]).Name <> 'Form1') and<br>
    (TForm(Application.Components[I]).Name <> 'Form3') then<br>
    begin<br>
    if TForm(Application.Components[I]).Visible then<br>
    begin<br>
    TForm(Application.Components[I]).ModalResult := 1;<br>
    TForm(Application.Components[I]).Close;<br>
    end;<br>

    end;<br>
    end;<br>

    end;<br>

    Gruß Frank

  • #2
    Hallo Frank,

    bei mir funktioniert Dein Sourcecode (Delphi 5). Hast Du vielleicht im OnClose bzw. OnCloseQuery zusätzlichen Code definiert?

    Gruß

    Torste

    Comment


    • #3
      Ja stimmt, der Code klappt auch. Was ich nicht bedacht habe, das die Modalen Fenster erst geschlossen werden, wenn die Timer-Procedure komplett abgearbeitet ist, und nicht nach dem ModemResult.<br><br>
      Warum ist das eigendlich so? gibt es auch einen Befehl womit Modale Fester unmittelbar geschlossen werden können

      Comment


      • #4
        Hallo Frank,

        vielleicht solltest Du die Vorgehensweise grundsätzlich noch mal überdenken. Was gibt es für Gründe, modale Fenster zwangsweise zu schließen. Ich setze modale Forms nur da ein, wo ich einen Rückgabewert vom Benutzer erzwingen möchte, um in dem übergeordneten Form eine Aktion auszulösen zu können.

        Auf jeden Fall solltest Du die modalen Form zuerst schließen, dann erst die nicht modalen.

        Dies kann man in zwei Schleifen in der Timer-Funktion machen.<BR>
        Modale Forms schließen:
        <PRE>
        for (int i = 0; i < Application->ComponentCount; i++)
        {
        TForm* FormTest = (TForm*) Application->Components[i];
        if (FormTest != Application->MainForm)
        {
        TFormState FormStateTest = FormTest->FormState;
        if (FormTest->FormState.Contains(fsModal) && FormTest->CanFocus())
        {
        FormTest->SetFocus();
        FormTest->ModalResult = mrOk;
        }
        }
        }
        </PRE>
        Nicht modale Forms schließen:
        <PRE>
        for (int i = 0; i < Application->ComponentCount; i++)
        {
        TForm* FormTest = (TForm*) Application->Components[i];
        if (FormTest != Application->MainForm)
        {
        if (!FormTest->FormState.Contains(fsModal) && FormTest->CanFocus())
        {
        FormTest->Close();
        }
        }
        }
        </PRE>
        (Sorry, ich weiß, das ist das Delphi-Forum, kann aber nicht genug Pascal )<BR>
        Außerdem solltest Du als erstes in der Timerfunktion den Timer auf Enabled := false setzen.<BR>
        Das funktioniert auch nicht mehr, sobald aus dem Hauptfenster heraus ein Modales Form geöffnet wird. Zumindest, wenn Du versuchst den Timer zu enablen, nachdem Du das modale Form anzeigst. Außerdem sollte man noch eine Typprüfung mit einbringen, um sicherzustellen, daß es bei der Komponentet um eine Instanz von TForm handelt (bin mir nicht sicher, ob da auch andere sein können).

        Ach ja, hat es einen Grund, daß Du mrOk verwendest. Ich würde es sinnvoller finden, mrCancel zu verwenden...

        Grüße Joche

        Comment


        • #5
          Hi Jochen<br><br>
          mit dem C-Code komme ich schon zurecht ;-)<br><br>
          Der Grund warum ich ein Modals Fenster schließen will, ist das nach einer Gewissen "Ruhezeit" ein Automatsches LogOff machen will. Und da ich alle DB dabei schließe, soll nur der LogOn Bildschirm angezeigt werden, und die offenen Fester sollen geschlossen werden.<br><br>
          Das mit der Typenprüfung ist ne gute Idee, das bastel ich noch mit rein... und das mit dem mrCancel ist auch sauberer... Hier wird auch jeder unsaubere Code gnadenlos offengelegt ;-)<br><br>
          Besten Dank Joche

          Comment


          • #6
            Hallo Frank,

            ich habe mir das noch mal angesehen. Es bleiben mir zu viele ungeklärte Fragen. Ich kann definitiv kein modales Form von 'außerhalb' schließen. Zumindest nicht kontrolliert...<BR>
            Was geschieht in den Forms, die die modalen Forms aufgerufen haben? Was passiert, wenn ein modales Form ein anderes modales Form aufgerufen hat und diese in der falschen Reihenfolge geschlossen werden? Spätestens wenn Code in den Ereignissen OnHide, OnClose, OnCloseQuery... ausgeführt wird, halte ich das Resultat für ungewiss.

            Welchen Hintergrund hat das Schließen in der Timerfunktion denn? Vielleicht fällt mir ja ein anderer Lösungsweg ein.<BR>
            Vielleicht sollten die modalen Forms einen eigenen Timer spendiert bekommen, und sich selbstständig schließen, wenn nach einer gewissen Zeit keine Benutzeraktion durchgeführt wurde und in der Timerfunktion nur die nicht-modalen Forms schließen (natürlich nur, wenn keine modalen Forms mehr vorhanden sind).

            Grüße Joche

            Comment


            • #7
              Synchronizität lacht...

              Dann würde ich den modalen Forms tatsächlich einen eigenen Timer spendieren und in der Haupttimerfunktion nur die nicht-modalen Forms schließen. Das scheint mir die sicherste Methode zu sein...

              Ich lasse mich da aber gerne belehren, vielleicht funktioniert das ja trotzdem alles und ich mache mir unnötige Sorgen. Dafür weiß ich einfach zu nicht genug über TForm.

              Grüße Joche

              Comment


              • #8
                Also bei mir klappt das Schließen ganz gut. Bei mir passiert allerdings nichts bei OnClose usw. Aber das sehe ich auch noch nicht so kritisch, man muß halt nur Cancel mit abfangen.<br><br>
                Gruß Fran

                Comment


                • #9
                  Muß das gleiche Problem lösen, d.h. Logout nache einer bestimmten Zeitspanne von Inaktivität.
                  Probleme sind Modale Fenster oder Dialoge!
                  <BR>
                  @Frank: Problem gelöst?
                  <BR>
                  @Alle: Wie sollte man das machen?
                  <BR>
                  Gruß Guunna

                  Comment


                  • #10
                    Hallo,

                    habe selbige Anforderungen auch und so gelöst: jedes modale Fenster hat einen Timer, der alle 500 ms nachsieht, ob die maximale Anzeigedauer des modalen Fensters erreicht ist, wenn ja - schließen.
                    Zusätzlich habe ich in einer globalen Unit, die in jeder Form mit eingebunden wird, eine Variable, die vom Hauptprogramm vor dem Schließen gesetzt wird. Diese Variable wird vom Timer ebenfalls mit ausgewertet. Das Hauptprogramm setzt also beim Close zuerst diese Variable, wartet dann 1 Sekunde, damit ein modales Fenster sicher schließt, und dann wird terminiert. Man könnte wahrscheinlich im modalen Fenster über diese Timer-Schleife auch auf Application.Terminated checken, aber ich habe nie probiert, ob das funktionieren würde.

                    tschüß,
                    Helmu

                    Comment

                    Working...
                    X