Einzelnen Beitrag anzeigen

wp_xxyyzz

Registriert seit: 2. Okt 2006
23 Beiträge
 
#4

Re: Form in auf einer PageControl-Seite darstellen

  Alt 23. Jul 2009, 21:14
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.
  Mit Zitat antworten Zitat