Announcement

Collapse
No announcement yet.

Modales Form in OnShow beenden??

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

  • Modales Form in OnShow beenden??

    Hallo Leute,

    wie kann man ein mit Form->ShowModal() angezeigtes (anzuzeigendes) Form in der OnShow() des Forms bereits wieder schließen?

    Close() aufzurufen oder ModalResult zu setzen funtionieren nicht.

    Im Moment behelfe ich mir mit einem Timer, den ich als letztes in der OnShow() aktiviere, und in der Timer1Timer prüfe ob das Formular angezeigt werden soll.

    Aber da muß es doch ein einfacheren und eleganteren Weg geben, nur finde ich den einfach nicht...

    Danke schon mal

    Jochen

  • #2
    Vielleicht in OnCreate, dass man dort die Erstellung abbrechen kann??

    Vielleicht funktioniert Close() in OnActivate ??(schließlich ist da das Fenster schon da
    Christian

    Comment


    • #3
      Hi Christian,

      werde ich sofort ausprobieren (hätte ich ja auch selbst drauf kommen könne, aber gestern war LAN-Party... )

      Grüße Joche

      Comment


      • #4
        Hallo nochmal,

        in OnActivate() funtkioniert's auch nicht. Dafür aber seltsamerweise in OnCreate() und im Konstruktor.

        In OnCreate würde es mir nur dann etwas nützen, wenn ich das Form zur Laufzeit selbst erzeuge.

        Grüße

        Joche

        Comment


        • #5
          Probiere mal Release.<p>
          Schöne Grüße, Mario Noac
          Schöne Grüße, Mario

          Comment


          • #6
            Counter oder Terrorist??
            :-))

            Du kannst OnPaint vielleicht benutzen. Habe das gerade probiert. Schließlich muss ja nach dem Show was reingezeichnet werden
            Christian

            Comment


            • #7
              @Christian: Das wechselt bei uns häufig durch alle Sparten. Gestern war's Starlancer (nach langer Zeit nochmal) und WillRock. Das mit dem OnPaint werde ich ausprobieren.

              @Mario: Ja, da bin ich eben auch schon drüber gestolpert, aber wird damit das Form nicht tatsächlich komplett aus dem Speicher entfernt? Habe ich zumindest so verstanden.

              Grüße

              Joche

              Comment


              • #8
                Hallo,

                ich verstehe nicht ganz was das für einen Sinn haben soll. Wäre es nicht besser vor dem aufruf von Form->ShowModal() zu prüfen, ob das Fenster angezeigt werden soll oder nicht ?

                Gruß
                Sebastia

                Comment


                • #9
                  Hallo Sebastian,

                  ja, aber dann ist das Form nicht 'eigenständig'. Ich muß vorher eine Funktion des Forms aufrufen. Das möchte ich vermeiden (können). Und bei 'Hauptformularen' funktioniert das auch nicht. Und daß das im OnCreate() funktioniert, wußte ich zum Zeitpunkt des Postings noch nicht. Um ehrlich zu sein, hätte ich das von selbst auch nie ausprobiert. Warum sollte es in OnCreate() funktionieren, wenn es im (später stattfindenden) OnShow() nicht funktioniert... Hab' ich gedacht...

                  Grüße

                  Joche

                  Comment


                  • #10
                    Jochen,

                    was macht denn die Funktion? Vielleicht kannst Du ja auch eine statische methode daraus machen. Dann müßtest Du das Fenster gar nicht erst erzeugen.

                    Gruß,<br>
                    Ja

                    Comment


                    • #11
                      Jochen,

                      ich habe hier eine andere Möglichkeit gefunden. Allerdings gefällt sie mir nicht besonders, da ich nicht genau weiß, was ich da eigentlich tue - ist halt eine Holzhammer-Methode:
                      <pre>
                      __fastcall TForm2::TForm2(TComponent* Owner)
                      : TForm(Owner)
                      {
                      CloseForm = false;
                      }
                      //---------------------------------------------------------------------------
                      void __fastcall TForm2::FormShow(TObject *Sender)
                      {
                      CloseForm = true;
                      }
                      //---------------------------------------------------------------------------
                      void __fastcall TForm2::WndProc(Messages::TMessage &Message)
                      {
                      if (CloseForm == true)
                      {
                      Close();
                      }
                      TForm::WndProc(Message);
                      }
                      //---------------------------------------------------------------------------
                      </pre>

                      Der Trick ist, den MessageHandler des Forms zu implementieren und die neue Member-Variable "CloseForm" ständig abzufragen, solange bis das Close() schließlich Wirkung zeigt.

                      Gruß,<br>
                      Ja

                      Comment


                      • #12
                        Hallo Jan,

                        ja, das ist auch eine Möglichkeit. Sollte ungefähr die gleichen Vor- und Nachteile bieten, wie Christians Vorschlag das in der OnPaint zu machen...

                        Im Moment mache ich es tatsächlich über eine Methode des aufzurufenden Forms, nur wenn diese true zurückgibt, wird das Form angezeigt. Ich habe also die Überprüfung aus der OnShow in eine eigene Methode verschoben.

                        Trotzdem weiß ich nicht, wie ich das einem Hauptformular machen soll. Insbesondere, wenn das Starten der Anwendung von z.B. einem TDatamodule abhängig ist. Das das Create() der des TDatamodule erst aufgerufen wird, nachdem das Create() des Hauptformulars komplett beendet ist... Einzige Möglichkeit, die ich hier sehe, ist, diese 'kritischen' Formulare manuell in der OnCreate() des Hauptformulars zu erzeugen.

                        Danke und Grüße

                        Joche

                        Comment


                        • #13
                          Jochen,

                          Du könntest das Erzeugen des Datenmoduls in den Konstruktor des Hauptformulars bzw. dessen OnCreate-Methode verlagern oder halt mit in die spezielle Prüf-Methode. Dazu mußt Du im CBuilder die automatische Erzeugung des Datenmoduls deaktivieren und die entsprechende Zeile "Application->CreateForm(..." selbst einfügen.

                          Gruß,<br>
                          Ja

                          Comment


                          • #14
                            <PRE>
                            Hi Jochen!

                            Die einfachste Lösung ist :

                            in OnPaint

                            if( Visible && ( dein Flag ) )
                            SendMessage( Handle, WM_CLOSE, 0, 0 );

                            In FormShow kannst Du nur gewalt anwenden.
                            Schau mal in den Source von Form.pas, dann wird
                            dir klar das es dort nicht geht.

                            gruß Fred

                            </PRE&gt

                            Comment


                            • #15
                              Hallo Leute,

                              zuerst einmal Dank an Alle! Als ich diese Diskussion eröffnet habe, habe ich auf eine einfache Lösung gehofft...

                              Das Problem ist dann wohl eher ein Designfehler meinerseits . Dann werde ich hier mal ein bißchen manuelles Erzeugen von Formularen üben. Lustigerweise erzeuge ich zum Beispiel in Programmen, ab einer gewissen Ladetzeit, das Info-Fenster meist selbst - damit ich es während des Programmstarts bereits anzeigen kann.

                              Aber bin ich denn der Einzige, der seine Formulare automatisch erzeugen läßt? Allerdings scheine ich die Formuale auch falsch zu erzeugen. Ich verwende dazu nicht Application->CreateForm(), sondern TFormX* FormX = new TFormX(). Da muß ich die Formulare dann natürlich am Ende auch freigeben.

                              Wie erzeugt ihr denn zur Laufzeit Formulare?

                              Grüße

                              Joche

                              Comment

                              Working...
                              X