Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - [TForm] - Was kommt vor OnCreate


Der Jan - Di 15.11.05 11:10
Titel: [TForm] - Was kommt vor OnCreate
Hallo,

gibt es eine Möglichkeit, in den Programmablauf einzugreifen, bevor TForm::OnCreate aufgerufen wird? Also im Pronzip direkt im Konstruktor des Formulars?


Narses - Di 15.11.05 11:31

Moin!

Das FormCreate() ist der Constructor des Formulars, noch konstruktiver geht´s also nicht mehr. :wink:

Du kannst in der Applikation selbst, also im .dpr natürlich noch eingreifen, da wird das FormCreate doch auch ausgelöst.

cu
Narses


chrisw - Di 15.11.05 11:35

im Source code des Projectes !


Delphi-Quelltext
1:
2:
3:
4:
  Application.Initialize;
  //also hier
  Application.CreateForm(TForm1, Form1);
  Application.Run;


Robert.Wachtel - Di 15.11.05 11:39
Titel: Re: [TForm] - Was kommt vor OnCreate
user profile iconDer Jan hat folgendes geschrieben:
[...] gibt es eine Möglichkeit, in den Programmablauf einzugreifen, bevor TForm::OnCreate aufgerufen wird? Also im Pronzip direkt im Konstruktor des Formulars?

Naja, Du könntest dem Formular einen eigenen Konstruktor verpassen und Deinen Code vor einem inherited einbringen. Noch früher geht wohl kaum ;-)


Der Jan - Di 15.11.05 12:33

user profile iconNarses hat folgendes geschrieben:
Moin!

Das FormCreate() ist der Constructor des Formulars, noch konstruktiver geht´s also nicht mehr.

Du kannst in der Applikation selbst, also im .dpr natürlich noch eingreifen, da wird das FormCreate doch auch ausgelöst.

cu
Narses


FormCreate ist IMO nicht direkt der Konstruktor... Es wird aufgerufen, nachdem der ganze Kram bereits erzeugt wurde. Beispiel: ich erzeuge eine Klasse, die verschiedene Checks z.b. beim Ändern von Editfelder durchführt. Solche "Änderungen" treten auch auf, wenn die Editfelder als Childs des Formulars erzeugt werden. Da ich meine Klasse aber erst bei OnCreate des Formulars erzeuge, gibt dies u.U. Zugriffsverletzungen.

user profile iconchrisw hat folgendes geschrieben:
im Source code des Projectes !


Delphi-Quelltext
1:
2:
3:
4:
  Application.Initialize;
  //also hier
  Application.CreateForm(TForm1, Form1);
  Application.Run;


Ähm, das ist nicht ganz, was ich meine :wink: Das ist zu früh.

Im C-Builder lässt sich das schön trennen. Man hat einmal den Konstruktor, wo man solche Sachen, wie oben als Beispiel genannt, tun kann, und dann noch FormCreate, falls man es noch braucht.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{

}
//---------------------------------------------------------------------------


Ist nicht ganz einfach zu erklären :)


jaenicke - Di 15.11.05 12:40

user profile iconDer Jan hat folgendes geschrieben:
Im C-Builder lässt sich das schön trennen. Man hat einmal den Konstruktor, wo man solche Sachen, wie oben als Beispiel genannt, tun kann, und dann noch FormCreate, falls man es noch braucht.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{

}
//---------------------------------------------------------------------------


Ist nicht ganz einfach zu erklären :)

Das ist doch aber genau das, was Robert.Wachtel gemeint hat! Du überschreibst einfach den Konstruktor (constructor Create(uOwner: TComponent); override;), dann kannst du da alles machen. Mit inherited; musst du aber auch den originalen Konstruktor aufrufen, entweder vor oder nach deinem Code.
Wichtig: Das Formular und alles was drin ist, ist beim Eintritt in den überschriebenen Konstruktor noch nicht vorhanden, erst mit inherited ist überhaupt was da.

Aber das ist ja genau dasselbe wie in deinem Code-Snippet von C++ bzw. C#...


Der Jan - Di 15.11.05 12:50

Äh... ja ok

genau das hab ich gesucht.... Hab das vorhin nur nicht ganz gerafft :roll:

Danke...