Announcement

Collapse
No announcement yet.

Wie kann ich zur Laufzeit ein Formular erzeugen

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

  • Wie kann ich zur Laufzeit ein Formular erzeugen

    Hallo alle zusammen, wie erstelle ich zur Laufzeit ein Formular ?`

    Möchte nur zu sepziellen Ereignissen ein Formular erzeugen und anzeigen. Wird dann ein ereigniss ausgelöst (modalresult) wird das Formular wieder geschlossen.

    Leider sind meine momentane versuche alle Fehlgeschlagen. Vielleicht könnt ihr mir weiterhelfen

  • #2
    Sehe keinen Sinn darin???

    Wo ist der Vorteil zur Laufzeit ein Formular mit Komponenten zu erzeugen, anstatt dieses im Voraus fertig zu machen und dann anzuzeigen, wenn es gebraucht wird?
    Christian

    Comment


    • #3
      Hallo Sascha,

      möchtest Du nur ein fertig erstelltes Formular zur Laufzeit erzeugen und anzeigen, oder auch alle Komponenten auf diesem Formular dynamisch erzeugen ? (bei zweiterem muss ich Christian recht geben, sehe ich ebenfalls keinen Vorteil drin, ist eher ein Rückschritt um ein paar Generationen - und es macht keinen Spaß jede einzelne Komponente zu erzeugen, zu positionieren, mit Ereignisbehandlungsroutinen zu versehen und dafür zu sorgen, daß alles wieder schön freigegeben wird...)

      Grüße Joche

      Comment


      • #4
        Hallo Sascha!

        Also, Formulare dynamisch zu erzeugen macht erheblich Sinn ! Die Eigenschaft vom C++-Builder, alle Formulare sofort zu erzeugen ist m.E. totaler Sch.....inn. Aber es ist ganz einfach:

        Du erstellst ein neues Formular (TForm) und gibst im Projekt an, diese nicht automatisch zu erzeugen. Dann kannst Du z.B. um dieses Formular beim Klicken auf einen Button anzuzeigen, mittels
        TMyForm *myForm = new TMyForm(this);
        eine Instanz des Formulars erzeugen. this ist hier die Vaterkomponente, also müsste z.B. das Hauptformular der Anwendung sein, wenn der Event im Hauptformular ausgelöst wird.

        Dann schaltest Du das Formular mittels myForm->Show() ein (oder verwende Visible...)

        Dann sollte es so erscheinen. Vergiss nicht, nach Beendigung, also wenn Du das Formular nicht mehr brauchts, es mit delete myForm zu löschen....

        Grüß, Andr&#233

        Comment


        • #5
          Hallo Andé,

          niemand streitet ab, daß es sinnvoll sein kann, Formulare dynmamisch. Aber so wie ich es verstehe, will er keine Formularinstanz zur Laufzeit erstellen, sondern ein neues, bisher nicht designtes Formular erzeugen, mit allen Komponenten darauf - und das macht m.E. wenig Sinn. Das wäre ein Rückschritt zur OWL...

          Deine Fassung macht m.E. auch wenig Sinn. Es ist nur bei extremen Speichermangel sinnvoll Formulare wieder zu löschen, nur um sie dann später erneut zu erzeugen. Ich mach' das bei mir so, daß nur die wichtigsten Formulare beim Start erzeugt werden, die weiteren Formulare werden erst erzeugt, wenn sie benötigt werden. Das geht wunderbar über die globale Variable des Formulars, die vorhanden ist, auch wenn das Formular nicht automatisch erzeugt wird.

          Beispielsweise:
          <PRE>
          if (!Form_Dynamisch)
          {
          try
          {
          Application->CreateForm(__classid(TForm_Dynamisch), &Form_Dynamisch);
          }
          catch(...)
          {
          ShowMessage("Fehler bei erzeugen des Formulars .");
          }
          }
          Form_Dynamisch->ShowModal();
          </PRE>
          Hiernach kann das Formular beliebig mit Show oder ShowModal aufgerufen werden UND muß nicht erneut erzeugt werden. Das Formular wird bei Beenden des Programms automatisch von der Application gelöscht.

          Bei deinem Vorschlag fehlen ein paar Dinge. So wie Du es beschrieben hast - wo bitte schön soll das delete hin?? In die Zeile nach dem Show() geht ja nicht, sonst würde das Formular nur kurz aufflackern und wieder gelöscht werden. Bei Verwendung von Show() muß man sich die erzeugten Instanzen des / der Formulare irgendwo speichern, um Sie im Destruktor des MainForms wieder löschen zu können... Mit ShowModal() würde Dein Vorschlag funktionieren.

          Grüße Joche

          Comment


          • #6
            Hi !

            Ok - ich erzeuge mein Hauptformular ja auch nicht dynamisch....;-)

            Ein komplett neues Formular mit den Controls dynamisch zu erzeugen ist wirklich unsinnvoll - es sei denn, man baut seine Anwendung so "benutzerfreundlich", dass man sich die Buttons und Textfelder selbst "zurechtrücken" kann. Ich habe das aber anders verstanden, weil es eine normale Vorgehehensweise zum statischen Kreieren ist...

            Das mit dem delete ist natürlich klar. Wenn das Hauptfenster andere, dynamische Fenster erzeugt, muss es schon einen Member-Pointer geben, der im Destruktor oder nach dem Beenden des Fensters wieder deletet wird... Ich denke aber, dieses Wissen kann ich vorraussetzen.
            Bei MDI geht es ja auch nur dynamisch...
            Auf diese dynamische Weise kann man auch sehr einfach TFrames innerhalb von anderen Forms darstellen und je nach Situaltion wechseln (oder man erzeugt eben sofort statisch alle Frames, legt diese übereinander und schaltet sie entspr.. auf Visible...)

            (so, nun genug blahblah..)
            Gruß,
            Andr&#233

            Comment


            • #7
              Hallo Sascha,

              ich hab' hier ein kleines Beispielprojekt hinterlegt, das die beiden angesprochenen Möglichkeiten zum dynamischen Erzeugen von Formularen zeigt: http://www.jreichenberg.com/DynForm.zip (542 kb)

              Grüße Joche

              Comment


              • #8
                Ups da hatte ich mich ein bischen schlecht ausgedrückt.<br><br>
                Ich wollte ein bereits bestehendes Formular zur Laufzeit erzeugen. Da ich das Formular nur für speziele Zwecke benötige.<br><br>
                hab mir dann so geholfen:<br>

                tfNew = new TtfNew(Application);<br>
                try<br>
                {<br>
                if(tfNew->ShowModal()== mrYes)<br>
                {<br>

                }<br>
                tfNew->Free();<br>
                }// try<br>
                catch(...)<br>
                {<br>
                tfNew->Free();<br>
                }//catch<br>
                }<br>
                <br>
                @ Jochen<br>
                kann das projekt leider nicht starten, da die dagStd60.bpi leider fehlt. Aber danke für die Müh

                Comment


                • #9
                  Hallo Sascha,

                  dann hast Du wohl nicht den BCB 6...

                  Die Zeile tfNew = new TFNew(Application) solltest Du in try... catch setzen, bei dem ShowModal() ist das m.E. nicht notwendig.

                  Die andere Möglichkeit wäre gewesen, das Formular nicht automatisch erzeugen zu lassen, sondern erst zur Laufzeit:
                  <PRE>
                  if (!Form2)
                  Application->CreateForm(__classid(TForm2), &Form2);
                  </PRE>
                  Natürlich ist das auzh in try catch zu setzen. Hierbei ist es nicht nötig das Formular zu 'free'en, das erledigt die App. automatisch.<BR>
                  Diese Vorgehensweise bietet sich aber nur an, wenn das Formular von einer zentralen Stelle aufgerufen wird, oder Du mußt diese Zeilen vor jedem Aufruf des Forms einfügen.

                  Grüße Joche

                  Comment

                  Working...
                  X