A
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 ();
}