Application mainform ändern ?



  • Wenn ich eine neue Anwendung erzeuge, dann wird normalerweise das Fenster Form1 zum Hauptfenster.
    Das heisst, wenn ich das Form1 schließe beende ich auch die Anwendung.
    Wenn ich nun aber noch andere Formulare habe, wie kann ich dann diese zum Hauptformular machen ?
    Geht das ?

    Danke im voraus.



  • Hallo

    Nein das geht nicht. TApplication::MainForm ist readonly, kann also zur Laufzeit nicht geändert werden. Vermutlich solltest du lieber dein Bedienkonzept überdenken und lieber alles in ein MainForm packen, unterstützt von (modalen) Nebenfenstern.

    bis bald
    akari



  • Und zwar wollte ich vor dem eigentlichen Hauptform ein LoginForm platzieren.
    Das heisst nach dem Start soll erst nur das LoginForm sichtbar sein.
    Danach soll erst das Mainform aufgerufen werden.
    Wie kann man das dann realisieren ?

    Danke



  • indem du das Loginform innerhalb des Konstruktors des Hauptforms aufrufts (ShowModal)



  • Hallo

    Wie du es schon sagst. Dein MainForm ist das eigentliche MainForm. Du must das Login-Form einfach manuell aufrufen. Hier am Beispiel eines Splashscreens.

    bis bald
    akari



  • Linnea schrieb:

    indem du das Loginform innerhalb des Konstruktors des Hauptforms aufrufts (ShowModal)

    Das bringt leider eine Exception (EAccessViolation). 😞

    Muss ich mir mal das Beispiel mit dem Splash Screen anschauen.



  • was hast du denn versucht?

    hier mal ein Beispiel:

    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    if (Form2->ShowModal() == mrOk)
      ShowMessage("Hallo!");
    else
      {
      ShowMessage("Geht so nicht!");
      Application->Terminate();
      }
    }
    

    Außerdem muß dazu noch in der Projekt-CPP die Reihenfolge der Formerstellung angepasst werden:

    Application->CreateForm(__classid([b]TForm2[/b]), &[b]Form2[/b]);
    Application->CreateForm(__classid([b]TForm1[/b]), &[b]Form1[/b]);
    


  • Application->CreateForm(__classid(TForm2), &Form2);
    Application->CreateForm(__classid(TForm1), &Form1);

    Ja an der Erstellungsfolge hat es gelegen.
    Nur wenn ich die ändere wird Form1 nach dem Schließen von Form2 garnicht mehr angezeigt.
    Muss man dann extra Show von Form1 aufrufen.



  • Hallo

    Naja dieses Vorgehen kann ja auch nicht funktionieren. Denn normalerweise wird das erste erstellte Form auch als MainForm gesetzt.

    Du must schon so vorgehen wie in meinem Link.

    bis bald
    akari



  • Hierfür ist dieser Artikel lesenswert:
    Programming in Delphi sins #1

    Roland Beenhakker hat ganz recht: es ist sowohl schlechter Stil (globale Variablen) als auch ein Performancenachteil, sämtliche Formulare automatisch beim Start erstellen zu lassen. Vielmehr sollten diese nur bei Bedarf erstellt werden. Daher immer die automatische Erstellung der Formulare, natürlich bis auf das Hauptformular, deaktivieren.

    Falls es von einem Formular nur eine Instanz gibt, kann man sich das Leben aber trotzdem einfach machen:

    // splashscreen_unit.h
    ...
    class TFrmSplashScreen : public TForm
    {
    ...
    public:		// Benutzer Deklarationen
        static TFrmSplashScreen* get (void); // gibt _die_ Instanz des Formulares zurück
    };
    
    // splashscreen_unit.cpp
    ...
    TFrmSplashScreen* TFrmSplashScreen::get (void)
    {
        static TFrmSplashScreen* form = NULL;
    
        if (!form) // das Formular wird nur bei Bedarf erstellt
            form = new TFrmSplashScreen (Application);
    
        return form;
    }
    

    Sollen von dem Formular mehrere Instanzen existieren können, sollte es besser mit new erstellt und mit delete freigegeben werden. Diese Variante, die speziell auf ein Exemplar des Formulares zugeschnitten ist, hat den Vorteil, daß TApplication den Besitz des Formulares und damit auch dessen Freigabe beim Beenden der Anwendung übernimmt. Dafür kann man das Formular nicht mehr nach Belieben freigeben (man kann natürlich schon, z.B., indem man Release() aufruft, aber dann gibt get() bei allen weiteren Aufrufen einen ungültigen Zeiger zurück).

    In deinem Fall, also für einen Login-Dialog, der ja vielleicht später noch einmal benötigt wird, könntest du für TForm2 eine statische Methode wie die obige schreiben, dann kannst du das TForm2 aus dem Konstruktor von TForm1 heraus benutzen:

    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        TForm2::get ()->ShowModal ();
    }
    

    Wenn es sich aber um einen Splash-Screen handelt, der danach nicht mehr benötigt wird, ist es besser, diesen dynamisch innerhalb der Funktion zu erstellen und wieder freizugeben:

    #include <memory>
    ...
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        std::auto_ptr <TForm2> form (new TForm2 (Application));
        form->ShowModal ();
    }
    

Anmelden zum Antworten