Folgender Code funktioniert bei mir einwandfrei (getestet unter D7).
Delphi-Quellcode:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls;
type
TMainForm =
class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
procedure InsertForms;
public
{ Public-Deklarationen }
procedure BeforeRun;
end;
var
MainForm: TMainForm;
implementation
uses Child1, Child2;
{$R *.dfm}
procedure TMainForm.InsertForms;
begin
// ChildFormRed := TChildFormRed.Create(self);
ChildFormRed.Parent := TabSheet1;
ChildFormRed.Align := alClient;
ChildFormRed.Show;
// ChildFormBlue := TChildFormBlue.Create(self);
ChildFormBlue.Parent := TabSheet2;
ChildFormBlue.Align := alClient;
ChildFormBlue.Show;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
// InsertForms;
// NEIN: Das gibt eine Zugriffsverletzung, da die Formulare noch
// gar nicht existieren!
// Stattdessen die neue öffentliche Methode "BeforeRun" verwenden
end;
procedure TMainForm.BeforeRun;
// Wird im Projekt-File vor Application.Run aufgerufen.
begin
InsertForms;
end;
end.
Delphi-Quellcode:
program FormsInPageControl;
uses
Forms,
Main in 'Main.pas' {MainForm},
Child1 in 'Child1.pas' {ChildFormRed},
Child2 in 'Child2.pas' {ChildFormBlue};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TChildFormRed, ChildFormRed);
Application.CreateForm(TChildFormBlue, ChildFormBlue);
MainForm.BeforeRun; // neu!
Application.Run;
end.
Ich verwende ein MainForm mit einem zweiseitigen PageControl, sowie zwei Kind-Formulare, jeweils eine eigene Klasse, die sich nur in der Formularfarbe unterscheiden. In der beigefügten Version werden die Kind-Formulare automatisch erzeugt. Wichtig ist, diese Formulare nicht im OnCreate des MainForm ins PageControl einzufügen, da sie zu diesem Zeitpunkt ja noch gar nicht existieren. Im Prinzip kann man das OnShow-Ereignis nehmen, aber da das Hauptformular ja gerade angezeigt wird, kann sich bei komplexen Formularen ein unruhiger Bildaufbau ergeben. Stattdessen habe ich für solche Zwecke immer eine "BeforeRun"-Methode des Hauptformulars vorbereitet, die ich im Project-File explizit vor "Application.Run" aufrufe.
Wichtig ist auch der explizite Aufruf von "Show" für die Kind-Formulare, die sonst versteckt bleiben.