1、用MDI窗体 2、在“父窗体”上放一个Panel,把“子窗体”贴在上面。参考代码: function TForm1.ShowForm(AFormClass: TFormClass): TForm; begin if frmChild = nil then begin frmChild:= AFormClass.Create(Panel1); frmChild.BorderStyle := Panel1; frmChild.Align := Panel1; frmChild.Parent := Panel1; end; frmChild.Show; end; 这里TForm1是“父窗体”,frmChild是全局的“子窗体”
try if Form2<>nil then TForm(Form2).Free; if not Assigned(Form2) then begin Application.CreateForm(TForm2,Form2); Form2.Parent:=Self; Form2.Show; end; finally
function TForm1.ShowForm(AFormClass: TFormClass): TForm; begin if frmChild = nil then begin frmChild:= AFormClass.Create(Panel1); frmChild.BorderStyle := Panel1; frmChild.Align := Panel1; frmChild.Parent := Panel1; end; frmChild.Show; end; 可以的我来晚了
子窗口的parent设置成副窗口的一个panel旧可以了,不用设置什么top\left的
不好意思,早上太匆忙了,更正一下在“父窗体”上放一个Panel,把“子窗体”贴在上面。参考代码: function TForm1.ShowForm(AFormClass: TFormClass): TForm; begin if frmChild = nil then begin frmChild:= AFormClass.Create(Panel1); frmChild.BorderStyle := bsNone; frmChild.Align := alClient; frmChild.Parent := Panel1; end; frmChild.Show; Result := frmChild; end; 这里TForm1是“父窗体”,Panel1放在其上,frmChild是全局的“子窗体”。这里用函数返回了子窗体的对象,当然直接改成过程,不返回也行。
请问tjianliang(乡关何处),你上面的那段代码该贴到哪里?是在父窗口的单元文件还是子窗口的单元文件?另外,一般的窗体都有一个OnShow事件,它在单元文件里面是这样定义的:procedure FormShow(Sender: TObject);这和你上面的那个函数有什么区别?我在父窗体单元里面加进了上面的代码,并且改成如下:procedure TForm1.FormShow(Sender: TObject); begin if frmChild = nil then begin frmchild := AFormClass.Create(Panel1); frmChild.BorderStyle := bsNone; frmChild.Align := alClient; frmChild.Parent := Panel1; end; frmChild.Show; end;其中Form1是fsMDIForm父窗体,frmChild是fsMDIChild子窗体,AFormClass我已经加进Form1的全局变量声明区:var Form1: TForm1; frmChild: TForm2 = nil; AFormClass: TFormClass;但是总是编译不过,在frmchild := AFormClass.Create(Panel1);一行出现如下错误:[Error] Unit1.pas(52): Incompatible types: 'TForm2' and 'TForm'就算我把frmchild := AFormClass.Create(Panel1);改成: frmchild := (TForm2)AFormClass.Create(Panel1);也是同样问题。请问这是什么原因?该怎么改?
在Form1里面的按钮事件里面写
Form2.Parent := Form1; //指定区域
Form2.Show;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
uses
unit2 ;
var
fm2:TForm2=nil;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(fm2) then
fm2:=TForm2.Create(Self);
fm2.Parent:=Self.Panel1;
FM2.Top:=Panel1.Top;
fm2.Left:=Panel1.Left;
fm2.Show;
end;
end.
fm2是灰的,但是可以用啊,要不然就FM2.BorderStyle:=bsNone; 然后自己自己模拟一个标题吧
子窗体的FormStyle为fsMDIChild
主窗体的FormStyle为fsMDIForm
子窗体的FormStyle为fsMDIChild
2、在“父窗体”上放一个Panel,把“子窗体”贴在上面。参考代码:
function TForm1.ShowForm(AFormClass: TFormClass): TForm;
begin
if frmChild = nil then
begin
frmChild:= AFormClass.Create(Panel1);
frmChild.BorderStyle := Panel1;
frmChild.Align := Panel1;
frmChild.Parent := Panel1;
end;
frmChild.Show;
end;
这里TForm1是“父窗体”,frmChild是全局的“子窗体”
if Form2<>nil then
TForm(Form2).Free;
if not Assigned(Form2) then
begin
Application.CreateForm(TForm2,Form2);
Form2.Parent:=Self;
Form2.Show;
end;
finally
end;
begin
if frmChild = nil then
begin
frmChild:= AFormClass.Create(Panel1);
frmChild.BorderStyle := Panel1;
frmChild.Align := Panel1;
frmChild.Parent := Panel1;
end;
frmChild.Show;
end;
可以的我来晚了
function TForm1.ShowForm(AFormClass: TFormClass): TForm;
begin
if frmChild = nil then
begin
frmChild:= AFormClass.Create(Panel1);
frmChild.BorderStyle := bsNone;
frmChild.Align := alClient;
frmChild.Parent := Panel1;
end;
frmChild.Show;
Result := frmChild;
end;
这里TForm1是“父窗体”,Panel1放在其上,frmChild是全局的“子窗体”。这里用函数返回了子窗体的对象,当然直接改成过程,不返回也行。
begin
if frmChild = nil then
begin
frmchild := AFormClass.Create(Panel1);
frmChild.BorderStyle := bsNone;
frmChild.Align := alClient;
frmChild.Parent := Panel1;
end;
frmChild.Show;
end;其中Form1是fsMDIForm父窗体,frmChild是fsMDIChild子窗体,AFormClass我已经加进Form1的全局变量声明区:var
Form1: TForm1;
frmChild: TForm2 = nil;
AFormClass: TFormClass;但是总是编译不过,在frmchild := AFormClass.Create(Panel1);一行出现如下错误:[Error] Unit1.pas(52): Incompatible types: 'TForm2' and 'TForm'就算我把frmchild := AFormClass.Create(Panel1);改成:
frmchild := (TForm2)AFormClass.Create(Panel1);也是同样问题。请问这是什么原因?该怎么改?