Hallo,
ich habe die Lösung in den tiefen meiner Platte gefunden.
Das Child-Formular hat einen zweiten und erweiterten Constructor bekommen. Damit kann man das Ding wie ein normales Formular aufrufen und man übergibt dem Constructor noch einen Parent. Grundsätzlich habe ich den Code damals bei Hagen abgeschrieben (glaube ich).
Delphi-Quellcode:
unit formchild_frm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TFormChild =
class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
private
{ Private-Deklarationen }
FAsChild: Boolean;
FTempParent: TWinControl;
protected
procedure CreateParams(
var Params: TCreateParams);
override;
procedure Loaded;
override;
public
{ Public-Deklarationen }
constructor Create(AOwner: TComponent);
overload;
override;
// als Formular aufrufen
constructor Create(AOwner: TComponent;AParent: TWinControl);
reintroduce;
overload;
// als Child aufrufen
end;
var
FormChild: TFormChild;
implementation
uses Utils1;
{$R *.DFM}
constructor TFormChild.Create(AOwner: TComponent);
begin
FAsChild := False;
inherited Create(AOwner);
end;
constructor TFormChild.Create(AOwner: TComponent; AParent: TWinControl);
begin
FAsChild := True;
FTempParent := aParent;
IsControl:=True;
inherited Create(AOwner);
end;
procedure TFormChild.CreateParams(
var Params: TCreateParams);
begin
Inherited CreateParams(Params);
if FAsChild
then
Params.Style := Params.Style
or WS_CHILD;
end;
procedure TFormChild.Loaded;
begin
inherited;
if FAsChild
then
begin
Align := alNone;
// BorderStyle := bsNone;
// BorderIcons := [];
Parent := FTempParent;
Position := poDefault;
end;
end;
end.
Hier kommt der das Aufruf des Formulars als Child
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
If Not Assigned(aChildForm) then
aChildForm:=TFormChild.Create(Application, Panel2);
With aChildForm do
begin
Edit1.text:='Delphi';
Edit2.Text:='Praxis';
Show;
end;
// Die Message sorgt dafür, dass man die Controls auf dem Form verwenden
// kann
SendMessage(aChildForm.Handle, WM_NCACTIVATE, Ord(True), 0);
aChildForm.SetBounds(0,0,200,200);
end;