Announcement

Collapse
No announcement yet.

MainForm zur Laufzeit wechseln

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

  • MainForm zur Laufzeit wechseln

    Hallo,<br>
    ist es möglich, zur Laufzeit ein anderes Fenster zum Hauptfenster zu machen?
    Wenn ja, wie?

    Eine Suche im Forum hat mich leider nicht schlauer gemacht, außer das ich jetzt noch diese Anmerkung mache:<br>
    Es geht nicht um einen Splash-Screen.

    Vielmehr besteht das Programm aus zwei (oder mehr) getrennten Modulen, die jeweils ein (oder mehrere) Fenster haben. Hat der Anwender sich an bestimmten Punkten einmal für ein Modul entschieden, werden die anderen nicht mehr benötigt, der Speicher kann also freigegeben werden. Dazu müßte ich aber das MainForm wechseln..

    Eine andere Möglichkeit wäre vielleicht noch die Trennung in einzelne Programme, die sich gegenseitig starten, aber diese Lösung finde ich auch nicht so richtig toll.

    Wie macht ihr sowas denn?

    Danke,
    Jochen

  • #2
    Gute Frage, ich glaube vom Borland Design her ist das nicht vorgesehen. Es ist aber durchaus möglich das MainForm unsichtbar zu machen, so daß es so aussieht als wäre es garnicht das MainForm.

    Gruß hage

    Comment


    • #3
      Delphi-Hilfe sagt: unmöglich.

      Die Eigenschaft MainForm gibt an, welches Formular das Hauptfenster der Anwendung ist.

      property MainForm: TForm;

      Beschreibung

      Mit MainForm können Sie, abweichend vom Standard, ein Formular als Hauptfenster der Anwendung festlegen. Dieses Formular wird dann als erstes von der Methode CreateForm erzeugt. Wird ein neues Projekt erstellt, erhält die Eigenschaft MainForm automatisch den Wert Form1. Mit der Seite Formulare des Dialogfeldes Projektoptionen können Sie der Eigenschaft MainForm zur Entwurfszeit ein anderes Formular zuweisen. MainForm kann zur Laufzeit nicht geändert, sondern nur gelesen werden.

      Das Hauptformular ist das erste, das im Rumpf der Anwendung erzeugt wird. Sobald das Hauptformular geschlossen wird, wird die Anwendung beendet.

      gruss DB

      Comment


      • #4
        Jochen, was ist für dich denn ein "bestimmter Punkt"? Ich meine, wenn sich die Wahl der Mainform darin erschöpft, dass eine Box aufgeht, die die Frage stellt: "Was jetzt? Form 1 oder 2?", dann wäre ein (Hagen, nicht das Gesicht verziehen) Patchen des Delphi-Projektes (also des Projekt-Quelltextes) eine Lösung. )

        Aber ich schätze, das wäre zu simpel. Oder?

        Mathias

        Comment


        • #5
          <b>Hallo Jochen,</b><p>

          Mit <b>Application.MainForm := Form2;</b> kannst Du das MainForm zur Laufzeit wechseln.<p>

          <b>Gruß Tom ..

          Comment


          • #6
            Hi

            @T.Blacke: Hast Du Deinen Vorschlag schon mal selber getestet ??

            <pre>

            type
            TApplication = class()
            public
            property MainForm: TForm <b>read</b> FMainForm;
            end;

            </pre>

            Obiger Auszug ist die Definition von TApplication die seit D3 bis D6 gültig ist. Ich sehe hinter dem <b>read</b> FMainForm kein <b>write</b>. demnach ist property MainForm <b>readonly</b>

            Gruß Hage

            Comment


            • #7
              <b>Hi Hagen,</B><p>

              natürlich hast Du recht - hatte gearde den korrekten Ausdruck nicht zur Hand !<p>

              Hier nun wie es gehen sollte.<br>
              Ich habe es auch <b>kurz</b> getestet und es funzt !<p>

              procedure SetMainForm( NewMain : TForm );<br>
              var P : Pointer;<br>
              begin<br>
              P := @Application.MainForm;<br>
              Pointer(P^) := NewMain;<br>
              end;<p>

              <b>Gruß Tom ..

              Comment


              • #8
                Jo, Glück gehabt das <b>property MainForm:TForm read FMainForm</b> keine read Methode benutzt sondern gleich direkt auf das private Field zurückgreift. Ansonsten würde Dein Trick nicht funktionieren.

                Gruß Hage

                Comment


                • #9
                  besser spät als nie;o)

                  @T. Balcke: danke, das ist, was ich suchte;o)

                  @Mathias Simmack: nein, ganz so einfach ist es nicht. soll folgendermaßen ablaufen: beim starten der anwendung prüft das erste modul A diverse dinge ab (db vorhanden, anwendung korrekt verknüpft, usw.) dann werden die übergebenen parameter ausgewertet, aus denen sich der weitere ablauf ergibt. es wird also z.b. in ein best. modul B verzweigt, und dieses sollte nun mainform sein. das start-modul A wird nicht mehr gebraucht. nach beenden des neuen moduls B kann optional in ein anderes modul C gewechselt werden. C hätte auch gleich nach A aufgerufen werden können - je nach parameter. in diesem fall wird B nicht mehr gebraucht, C sollte also mainform sein.

                  vielleicht ist das kein gutes design, aber wahrscheinlicher ist dann, das ich schlecht erklärt hab;o)

                  jedenfalls danke für die hilfe,<br>
                  Joche

                  Comment


                  • #10
                    Hi,

                    Ich finde es zumindestens ein wenig putzig sich in Zeiten von 256MB RAM Standardausststattung Gedanken um die Trennung (Preload etc.) von Programmmodulen zu machen.

                    Gruß
                    Gesine

                    P.S.

                    Die drei m's sind übrigens richtig ;-

                    Comment


                    • #11
                      <i>schmunzelnd @Gesine</i>
                      So kann man das natürlich auch sehen. Eigentlich hätte ich ja sogar 512, aber:<br>
                      - bist du sicher, das mein Win98 die auch nutzt?<br>
                      - die Anwendung soll auch mit weniger laufen<br>
                      - ich bin eben sparsam;o)<br>
                      Außerdem ist es eben manchmal eher eine Frage der Neugier als der Notwendigkeit. Sorry, aber das konnte ich mir jetzt nicht verkneifen;o)

                      Gruß
                      Joche

                      Comment


                      • #12
                        Hallo,<br><br>
                        ...ist es möglich, zur Laufzeit ein anderes Fenster zum Hauptfenster zu machen? Wenn ja, wie?...<br><br>
                        Leider bin ich der Glückliche, bei dem dieses Feature eingebaut ist - es aber nicht will!!!<br><br>
                        Ich habe ein Projekt mit dem Hauptformular frm_Admin. Wenn das <br> Formular erzeugt wird (onCreate) erstelle ich weitere Formulare <br>(TFrame und TForm) und lege sie per ManualDock auf das Hauptformular. <br>Wenn ich nur TFrames erstelle verhält sich die <br> Anwendung normal. Wenn ich jedoch eine TForm erstellen z.B. frm_User <br> dann ist plötzlich dieses Formular die MainForm. Das bedeutet natürlich, <br>dass beim Schließen von frm_Admin die Anwendung nicht mehr beendet wird (von den anderen Problemen erst einmal abgesehen).<br> Ich habe auch schon versucht die TForm nur zu erzeugen und nicht anzudocken. Die neu erzeugte Form wird aber wieder zur Mainform.<br> <br> Mache ich etwas verkehrt - wenn ja wo - oder ist das gewollt?<br><br> Andrea

                        Comment

                        Working...
                        X