用字符串做为窗体名传参ShowModal窗体引发的后续问题(急!!!)

人鱼传说 2009-12-21 10:00:45
超郁闷,真困惑.....请各位帮忙解决......谢谢...

//form1的代码
uses Unit2;

{$R *.dfm}

procedure TForm1.ClickOpenForm(formname:string); 自定义的用字符串打开form的过程
var
myformclass:TFormClass;
aform:TForm;
begin
myformclass:=TFormClass(FindClass(formname));
aform:=Tform(TFormClass(FindClass(formname)));
if GetClass(TFormClass.ClassName)<>nil then
begin
aform:=myformclass.Create(Application);
try
aform.ShowModal;
finally
aform.Free;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClickOpenForm('Tform2'); //将想要ShowModal的窗体名称传给自定义过程
end;

initialization
RegisterClass(Tform2);
end.

//form2的代码
procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Edit1.Text:='hello'; //这样给edit1.text赋值,没反应.
//Self.Edit1.Text:='hello'; //这样给edit1.text赋值,可以.
//Edit1.Text:='hello'; //这样给edit1.text赋值,也没问题.
//在form2内需要打开窗体form3 在form3内的button1的click事件内写代码 Form2.Edit1.Text:='hello'; 也是不行的....
end;

请问如何解决呢?万分感谢!!!!!!!!
...全文
163 18 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
人鱼传说 2009-12-23
用最简单,最直接的代码实现自己想要的功能才是最重要的。。。
  • 打赏
  • 举报
回复
ok1411 2009-12-23
[Quote=引用 16 楼 baronyang 的回复:]
找到最简单的解决办法了。。。。在每个窗体的建体时执行一下窗体名:=self.
例如:
procedure TForm_Apply_Money_To_OA.FormCreate(Sender: TObject);
begin
  Form_Apply_Money_To_OA:=Self;
end;
这样之后,就没有任何问题了。。。
[/Quote]
真有创意。。。。直接换成self就行了
  • 打赏
  • 举报
回复
人鱼传说 2009-12-23
找到最简单的解决办法了。。。。在每个窗体的建体时执行一下窗体名:=self.
例如:
procedure TForm_Apply_Money_To_OA.FormCreate(Sender: TObject);
begin
Form_Apply_Money_To_OA:=Self;
end;
这样之后,就没有任何问题了。。。
  • 打赏
  • 举报
回复
火龙岛主 2009-12-22
uses Unit2;

{$R *.dfm}

procedure TForm1.ClickOpenForm(formname:string); 自定义的用字符串打开form的过程
var
myformclass:TFormClass;
aform:TForm;
begin
myformclass:=TFormClass(FindClass(formname));
aform:=Tform(TFormClass(FindClass(formname)));
if myformclass <> nil then
begin
aform:=myformclass.Create(nil);
try
aform.ShowModal;
finally
aform.Free;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClickOpenForm('Tform2'); //将想要ShowModal的窗体名称传给自定义过程
end;

initialization
RegisterClass(Tform2);
finalization
UnRegisterClass(Tform2);

end.

//form2的代码
procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Edit1.Text:='hello'; //这样给edit1.text赋值,没反应.
//Self.Edit1.Text:='hello'; //这样给edit1.text赋值,可以.
//Edit1.Text:='hello'; //这样给edit1.text赋值,也没问题.
//在form2内需要打开窗体form3 在form3内的button1的click事件内写代码 Form2.Edit1.Text:='hello'; 也是不行的....
//更改为,因为Form2是变量。类中不要设计用变量的名称
self.Edit1.Text:='hello';

end;
  • 打赏
  • 举报
回复
亮剑_ 2009-12-22
[Quote=引用 6 楼 baronyang 的回复:]
引用 5 楼 tjianliang 的回复:

请看我的这一句.......

//在form2内需要打开窗体form3 在form3内的button1的click事件内写代码    Form2.Edit1.Text:='hello';  也是不行的....

[/Quote]
在form3中引用的Form2并不是ShowModal出的那个Form2实例!
ShowModal出那个Form叫aform,是定义在TForm1.ClickOpenForm方法中的局部变量
而Form2如果你没有删掉IDE默认加上的,则是TForm2所在单元的全局变量

简而言之,就是搞错对象
对象(也称为实例)名只在代码中是有意义的,是给程序员看的
执行时计算机是不认名字的,对象都是内存地址
  • 打赏
  • 举报
回复
dinoalex 2009-12-21
都知道是要 as TForm2 了,那当时还用字符串创建干嘛哩..


问题1:我看你是自己把你自己搞晕了, 你不对TFORM2的实例操作,你对什么操作吖?? 你本意是对什么操作?? 还反过来问,晕了....
问题2:看过 TEDIT(xxx).xxx了吧. 竟然你都还能找类了,那为什么不能用这个类来强制转换吖??
问题3:看样子,你是想通用字符来操作吧,那么,当你找到字符对应的类后,但是你的程序里又写死了某类的某控件的TEXT:='HELLO'. 你怎么知道这个类里的这个控件吖,就算有,你怎么知道有这个控件就叫这个名吖.

唉~ 不说了.
  • 打赏
  • 举报
回复
金卯刀 2009-12-21
上面的人不是解释原因了?
你的form2根本没有指向TForm2的实例

你可以定义一个基类窗,里面定义一个虚方法
procedure AssignObject(aObj : TObject); virtual;
子类窗 override AssignObject
begin
子类窗变量:= aObj;
end;
然后创建时:
procedure TForm1.ClickOpenForm(formname:string); 自定义的用字符串打开form的过程
var
myformclass:TMyFormClass;
aform:TForm;
begin
myformclass:=TMyFormClass(FindClass(formname));
aform:=Tform(TMyFormClass(FindClass(formname)));
if GetClass(TMyFormClass.ClassName)<>nil then
begin
aform:=myformclass.Create(Application);
aform.AssignObject(aForm)
try
aform.ShowModal;
finally
aform.Free;
end;
end;
end;

  • 打赏
  • 举报
回复
人鱼传说 2009-12-21
[Quote=引用 9 楼 dinoalex 的回复:]
那你不会在建FORM3时传指针吖
[/Quote]
没听懂....请举个例...谢谢....
  • 打赏
  • 举报
回复
dinoalex 2009-12-21
那你不会在建FORM3时传指针吖
  • 打赏
  • 举报
回复
人鱼传说 2009-12-21
[Quote=引用 7 楼 dinoalex 的回复:]
引用 4 楼 tjianliang 的回复:
引用 1 楼 dinoalex 的回复:
因为你没有建FORM2这个实例吖,晕

实例可能是有的
1、如果没有手动删除,窗体单元中默认都是有一个全局实例的
2、如果没有实例,编译就会报错了


他只创建一个TFORM2类的一个实例,叫aform. 并没有FORM2这个实例

不有一点,亮剑兄说的,应该就是全局的问题了. 如果把aform:TForm;放到全局那里,是可以的
但TFORM2里的事件是则要改成  (AForm as TForm2).Edit1.Text:= 'Hello';
[/Quote]
这样明显不行.........
如果改成 (AForm as TForm2).Edit1.Text:= 'Hello'; 都知道是要 as TForm2 了,那当时还用字符串创建干嘛哩?
  • 打赏
  • 举报
回复
dinoalex 2009-12-21
[Quote=引用 4 楼 tjianliang 的回复:]
引用 1 楼 dinoalex 的回复:
因为你没有建FORM2这个实例吖,晕

实例可能是有的
1、如果没有手动删除,窗体单元中默认都是有一个全局实例的
2、如果没有实例,编译就会报错了
[/Quote]

他只创建一个TFORM2类的一个实例,叫aform. 并没有FORM2这个实例

不有一点,亮剑兄说的,应该就是全局的问题了. 如果把aform:TForm;放到全局那里,是可以的
但TFORM2里的事件是则要改成 (AForm as TForm2).Edit1.Text:= 'Hello';
  • 打赏
  • 举报
回复
人鱼传说 2009-12-21
[Quote=引用 5 楼 tjianliang 的回复:]
引用楼主 baronyang 的回复:
请问如何解决呢?万分感谢!!!!!!!!

解决什么呢,你都写出来了
用Self,Self也可省略
[/Quote]
请看我的这一句.......

//在form2内需要打开窗体form3 在form3内的button1的click事件内写代码 Form2.Edit1.Text:='hello'; 也是不行的....
  • 打赏
  • 举报
回复
亮剑_ 2009-12-21
[Quote=引用楼主 baronyang 的回复:]
请问如何解决呢?万分感谢!!!!!!!!
[/Quote]
解决什么呢,你都写出来了
用Self,Self也可省略
  • 打赏
  • 举报
回复
亮剑_ 2009-12-21
[Quote=引用 1 楼 dinoalex 的回复:]
因为你没有建FORM2这个实例吖,晕
[/Quote]
实例可能是有的
1、如果没有手动删除,窗体单元中默认都是有一个全局实例的
2、如果没有实例,编译就会报错了
  • 打赏
  • 举报
回复
亮剑_ 2009-12-21
1、Form2.Edit1.Text:='hello'; //这样给edit1.text赋值,没反应.
这个Form2是全局变量(可能叫实例准确一些)

2、aform:=myformclass.Create(Application);
这个aform是TForm1.ClickOpenForm方法中定义的局部变量

看出来了吧,这两个并不是一回事,此Form非彼Form,所以当然没反应
  • 打赏
  • 举报
回复
dinoalex 2009-12-21
if Assigned(Form2) then Form2.Edit1.Text:='hello'; 这样你就知道了,你没实例,怎么去操作..
  • 打赏
  • 举报
回复
dinoalex 2009-12-21
因为你没有建FORM2这个实例吖,晕
  • 打赏
  • 举报
回复
相关推荐
发帖
Delphi

5124

社区成员

Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
帖子事件
创建了帖子
2009-12-21 10:00
社区公告
暂无公告