不知您有没这样做过?(80分)

  • 主题发起人 主题发起人 011101
  • 开始时间 开始时间
0

011101

Unregistered / Unconfirmed
GUEST, unregistred user!
在数据库程序中初始化子窗体时,经常需要在form初始化时传一个参数以便对form初始化后进行更多的控制.以下是我举的一个简单例子和要提的问题:

1>mdi子窗体中定义一方法:
product form_show(i:byte);
begin
pagecontrol1.activepage=i

end;

2>mdi主窗体中:
为了实现代码最大限度的重用,偶定义了一函数,如下:
function form1.form_create(form_class: Tcomponentclass;
form_name: Tform
name: string): boolean;
begin
try
if Application.FindComponent(name)<>nil then
else begin
Application.CreateForm(form_class,form_name);
[red] ////form_name.form_show(1) ///这功能不知怎么实现[/red]
form_name.Show;
result:=true;
end;
except
MessageDlg('初始化失败.',mterror,[mbok],0);
result:=false;
end;
end;
上面的函数会对子窗体进行初始化的动作.
3>在菜单click事件写如下代码:
form_create(Tform1,form1,'form1'):
执行上面代码仅仅只能初始化,不能调用mdi子窗体中自定义的事件.
------------------------问题--------------------------------
我要执行mdi子窗体中自定义的事件该怎么做?
函数传出Form1也不行.
 
一般是 在 mdi子窗体 定义属性, CREATE 后修改该属性,SHOW 的时候就可以根据该属性干活
 
function form1.form_create(form_class: Tcomponentclass;
form_name: Tform
name: string): boolean
form_name前要加var Form_name
不然如果不是指针类型的话是不能改变它的值的.
你在Mdi子窗体的事件作处理不就行啦!
 
我给你一段代码,你看看:
function FindExistingForm(FFormName: string): TForm;
var
i: integer;
begin
Result := nil;
try
if FFormName = '' then raise Exception.Create('需要类名!');
with Application do
for i := 0 to ComponentCount - 1 do
if Components.ClassName = ('T' + FFormName) then begin
Result := TForm(Components);
Break;
end;
except
on E: Exception do
ShowMessage(E.Message)
else raise;
end;
end;
function CreateForm(FFormName: string
AOwner: TComponent): TForm;
type
TFormClass = class of TForm;
var
AFormClass: TFormClass;
begin
Result := nil;
try
if FFormName = '' then raise Exception.Create('需要类名!');
AFormClass := TFormClass(FindClass('T' + FFormName));
Result := AFormClass.Create(AOwner);
except
on E: Exception do
ShowMessage(E.Message)
else raise;
end;
end;
procedure form_create(FFormName: string
youParam: integer
AOwner: TComponent);
var
AForm :TForm;
begin
AForm:= FindExistingForm(FFormName);
if AForm=nil then
begin
AForm:=CreateForm(FFormName, AOwner);
AForm.Tag:=youParam;
AForm.Show;
end;
end;

子窗体中
procedure TForm2.FormShow(Sender: TObject);
begin
pagecontrol1.activepage=Self.Tag;
end;
initialization
RegisterClass(TForm2);
 
一般是 在 mdi子窗体 定义属性, CREATE 后修改该属性,SHOW 的时候就可以根据该属性干活
>>定義屬性也不行的
-------------------------------
不然如果不是指针类型的话是不能改变它的值的.
你在Mdi子窗体的事件作处理不就行啦!
>>不明白
-------------
看看先
 
yostgxf 同志
你的意思是給tag屬性一個值,然后子窗体在初始化時根据tag的值......
我不想這樣做,我想在主窗体初始化代碼時調用子窗体的自定義方法,根据自定義方法的參數決定子窗体初始化時要執行哪些代碼.
 
经过我的调试,
function FindExistingForm(FFormName: string): TForm;
var
i: integer;
begin
Result := nil;
try
if FFormName = '' then raise Exception.Create('&amp;ETH;è&amp;Ograve;&amp;ordf;&amp;Agrave;à&amp;Atilde;&amp;ucirc;&amp;pound;&amp;iexcl;');
with Application do
for i := 0 to ComponentCount - 1 do
if Components.ClassName = ('T' + FFormName) then begin
showmessage(components.classname);
Result := TForm(Components);
Break;
end;
except
on E: Exception do
ShowMessage(E.Message)
else raise;
end;
end;

function CreateForm(FFormName: string
AOwner: TComponent): TForm;
type
TFormClass = class of TForm;
var
AFormClass: TFormClass;
begin
Result := nil;
try
if FFormName = '' then raise Exception.Create('&amp;ETH;è&amp;Ograve;&amp;ordf;&amp;Agrave;à&amp;Atilde;&amp;ucirc;&amp;pound;&amp;iexcl;');
Aformclass:=nil;
Aformclass:=TFormclass(FindClass('TForm2'));
if Aformclass<>nil then
begin
aformclass:=(Aformclass);
Result:=Tformclass(Aformclass).Create(aowner);
end;
// AFormClass := TFormClass();
// Result := AFormClass.Create(self);// .Create(AOwner);
except
on E: Exception do
ShowMessage(E.Message)
else raise;
end;
end;

procedure form_create(FFormName: string
youParam: integer
AOwner: TComponent);
var
AForm :TForm;
begin
AForm:= FindExistingForm(FFormName);
if AForm=nil then
begin
AForm:=CreateForm(FFormName, AOwner);
AForm.Tag:=youParam;
AForm.Show;
end;
end;

//×&amp;Oacute;&amp;acute;°&amp;Igrave;&amp;aring;&amp;Ouml;&amp;ETH;

procedure TForm1.Button1Click(Sender: TObject);
begin
form_create('Form2',1,self);
end;

initialization
RegisterClass(TForm2);

Form2中加入以下代码
procedure TForm2.FormShow(Sender: TObject);
begin
pagecontrol1.ActivePageIndex:=tag;
end;
完全是可以的,你自己去改吧
 
begin
AForm:=CreateForm(FFormName, AOwner);
AForm.Tag:=youParam
//這沒問題的
AForm.Show;
end;
-----------------
我知道這樣可以,可是我不想這樣做
我的想法是這樣的:
Application.CreateForm(form_class,form_name);
////form_name.form_show(1) ///这功能不知怎么实现
form_name.Show;
result:=true;
 
可以呀!!
Result := nil;
try
if FFormName = '' then raise Exception.Create('&amp;ETH;è&amp;Ograve;&amp;ordf;&amp;Agrave;à&amp;Atilde;&amp;ucirc;&amp;pound;&amp;iexcl;');
Aformclass:=nil;
Aformclass:=TFormclass(FindClass('TForm2'));
if Aformclass<>nil then
begin
aformclass:=(Aformclass);
application.CreateForm(Tformclass(aformclass),Tform(Result));
// Result:=Tformclass(Aformclass).Create(aowner);
end;
// AFormClass := TFormClass();
// Result := AFormClass.Create(self);// .Create(AOwner);
except
on E: Exception do
ShowMessage(E.Message)
else raise;
end;
我试过的
 
算了,還是動下手吧,用tag屬性來做.[:D][:D]
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部