怎样使一个窗口变成另一个窗口中panel的子窗口?(10分)

C

cjh_xf

Unregistered / Unconfirmed
GUEST, unregistred user!
本人想将窗口(form1)作为另一窗口(form2)的子窗口,在(form2)的panel
中显示form1。
本先我准备重载form1的create方法,代码如下:
constructor form1.create(Aower:Tcomponent;panel:Twinctrol);
begin
inherited create(aowner,panel);
end;
然后再在form2中调用此方法:
form1:=tform1.create(application,panel1);
但这样总是不行,总是提醒:Too many actual parameters
怎么回事?
望大侠们指点一二!
 
这样写:
create(aowner);
parenthandle:=panel.handle;
 
重载函数后面,是不是要加Override哦
 
to:zqw0117
你说的是在form1中方法重载时的代码吗?我照试了,可是不行呀,
提示说“ Undeclared identifier: 'parenthandle'”,小弟是弱手,
望详细指点:)
 
指定Parent行不行?
 
procedure ShowForm(FormClass: TFormClass
Form: TForm
FPal: TPanel)
//窗口融合
begin
if Form = nil then
Form := FormClass.Create(nil);
FPal.DockSite := True;
with Form do
begin
DockSite := True;
DragKind := DkDock;
Align := alClient;
HostDockSite := FPal;
Show;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ShowForm(TForm2, Form2, Panel3)
//建立Form2
ShowForm(TForm3, Form3, Panel4)
//建立Form3
end;
 
看看这样行不行?
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.RES}
begin
Application.Initialize;
// Application.CreateForm(TForm1, Form1)
//在DPR文件中去掉创建FORM1的语句。
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
//在Form2的OnShow事件中加入对Form1的创建,同时指定Form1的parent.并且对
//left,Top,Height,Width赋值,防止其显示超出范围
procedure TForm2.FormShow(Sender: TObject);
begin
Application.CreateForm(TForm1, Form1);
Form1.Parent:=Panel1;
Form1.Left:=2;
Form1.Top:=3;
Form1.Height:=100;
Form1.Width:=150;
Form1.Show;
end;

 
本人刚才试过chlf的方法是可行的,但不要在pdf文件中去掉
Application.CreateForm(TForm1, Form1);
如若去掉则回出现读入错误。

试用wind2000的方法,会有如下的错误提示:
Unsatisfied forward or external declaration: 'TForm1.ShowForm'
不知何故,还望继续指教!
 
如果按照chlf的办法,不是会显示一次就创建一次?呵呵,肯定不可取。
看看这个讨论:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1046558
 
建议使用frame
 
我的代码是在Form1上的不同Panel中显示其它Form(如Form2、Form3...)上的内容,如果
你想在Form2的Panel中显示Form1上的内容可能得改一点点东西,如:
procedure TForm2.FormCreate(Sender: TObject);
begin
ShowForm(TForm1, Form1, Panel1)
//建立Form1
end;
我的代码在Win2000+D6下运行通过。
 
这么麻烦,直接使用frame不是很好吗?而且比较安全和稳定.
 
to ydjjld and donkey:
使用frame和form是有区别的,建议去看看dreamtiger提供的讨论页!讲的比较详细!!
 
to wind2000:
按照你的方法,在form1中的panel1和panel2中显示form2和form3,还是会出现showform的声明
错误:
Unsatisfied forward or external declaration: 'TForm1.ShowForm'
完全代码如下:

unit weichenggong1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Bevel1: TBevel;
Button1: TButton;
Panel1: TPanel;
Panel2: TPanel;
procedure ShowForm(FormClass: TFormClass
Form: TForm
FPal: TPanel);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses unit2,unit3;

{$R *.DFM}


procedure ShowForm(FormClass: TFormClass
Form: TForm
FPal: TPanel)
//窗口融合
begin
if Form = nil then
Form := FormClass.Create(nil);
FPal.DockSite := True;
with Form do
begin
DockSite := True;
DragKind := DkDock;
Align := alClient;
HostDockSite := FPal;
Show;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
ShowForm(TForm2, Form2, Panel1)

ShowForm(TForm3, Form3, Panel2)

end;

end.

我知道只是个很小的错误,小弟不才,还望不吝赐教!
 
看看<delphi5 开发大全>,steve teixeira xavier pacheeo著,有代码的。
另外,dreamtiger的连接是什么?
 
我有一个相对简单的方法:
创建两个窗体:Form1,Form2
Form2中:
Align属性设为alClient
BorderStyle属性设为bsNone
unit1为:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Unit2;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
form2 := TForm2.Create(Panel1);
form2.Parent := self.Panel1;
form2.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
form2.free;
end;

end.

Form2 可以是任意的窗体,但是name属性应为Form2(注意大小写)
但是如何防止Button1或Button2被连续点击,
因该加入怎样的判断条件,还望各位大侠赐教!
 
有没有搞错,都写得那么麻烦

procedure tform2.button1click(sender: tobject);
begin
form1 := tform1.create(application);
form1.ManualDock(panel1);
form1.Visible := True;
end;

That's All!
 
强烈建议不要使用control.parent:=parentcontrol;的方法!
wind2000的方法较好
 
使用form1.ManualDock(panel1);之后会出现dock的条栏。
 
这样写就可以了的
constructor Create(AOwner:TComponent;Panel:TWinControl);overload;

constructor Create(AOwner:TComponent;Panel:TWinControl);
begin
Inherited Create(AOwner);
Parent:=Panel;
end;

然后再在form2中调用此方法:
form1:=tform1.create(application,panel1);
我的系统中有如下代码
Constructor Create(AOwner:TComponent;Data:Variant);overload;virtual;
constructor TBaseFmt.Create(AOwner: TComponent
Data: Variant);
begin
Connect:=TDispatchConnection(integer(Data[0]));
App_id:=Data[1];
Uid:=Data[2];
DBType:=Data[3];
AppType:=TModuleType(Data[5]);
Container:=Data[6];
inherited Create(AOwner);
CtlHWND:=Data[7];
SendMessage(CtlHwnd,WM_User+$5,integer(self),handle);
Rights:=Data[4];
ActiveData:=MainData;
end;

和你的差不多
 
顶部