关于MDI多窗体创建的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 shaken
  • 开始时间 开始时间
S

shaken

Unregistered / Unconfirmed
GUEST, unregistred user!
1、创建了Class TFormA,[MDImain]。是一个基础窗体,作为其他窗体的父类。
在其Onclose:
FormA :=nil;
FormA.Free;
2、创建FormB=Class(TFormA) [MDIChildForm],请注意这是一个子窗体
3、主窗体是mainform,在菜单中用下面以下语句创建FormB:
if not assigned(FormB) then
begin
FormB:= TFormB.Create(Self);
FormB.Show;
end
else
if FormB.WindowState=wsMinimized then
begin
FormB.WindowState := wsMaximized;
end;
4、按下窗体右上角的关闭按钮只能最小化。
5、在onclose里面增加以下语句后,关闭没有任何错误,但重新打开该窗口时,提示内存出错,窗口未能弹出。
Action := cafree;
为什么?
 
1、创建了Class TFormA,[MDImain]。是一个基础窗体,作为其他窗体的父类。
在其Onclose:
FormA :=nil;
FormA.Free;
2、创建FormB=Class(TFormA) [MDIChildForm],请注意这是一个子窗体
3、主窗体是mainform,在菜单中用下面以下语句创建FormB:
if not assigned(FormB) then
begin
FormB:= TFormB.Create(Self);
FormB.Show;
end
else
if FormB.WindowState=wsMinimized then
begin
FormB.WindowState := wsMaximized;
end;
4、按下窗体右上角的关闭按钮只能最小化。
5、在onclose里面增加以下语句后,关闭没有任何错误,但重新打开该窗口时,提示内存出错,窗口未能弹出。
Action := cafree;
为什么?
 
一种解决方法是:
onclose里面增加以下语句 Action := caHide
 
MDIChild是不能hide。连visible都不能置为 False
 
将第5步中的加上:
formb := nil;
不用 Action := caFree;
因为B继承自A, 所以Action := cafree;一定会执行,不必再处理了.
但Formb是一个实例指针,而你并未将其赋空,这时 ASSIGNED(FORMB) 就会是TRUE,
导致TFORMB并未创建实例,使用就会出错: Access violation at ......
 
不如将你的要求说出来还好,是不是不要创建重复的窗口实例呀,如果是这样,你的思路方式并不好。用 if not assigned(xxx) then
的方法不是个好方法, 但很多人这样用。
这样的方法怪怪的,因为必须在 Free之前 将 实例 xxx:=nil;

用单例类吧。 我有
 
两种办法:
1、使用子窗体全局变量:
if not Assigned(ChildForm1) then

ChildForm1 := TChildForm1.Create(Application);
ChildForm1.Show;
这种方法智能创建一个实例,需要在每个子窗体的Close事件中释放窗体变量:
ChildForm1 := nil;
2、使用子窗体局部变量:
var
AForm: TChildForm1;//局部变量
begin
AForm := TChildForm1.Create(Application);
AForm.Show;
.....
第二种方法可同时创建子窗体类的多个实例。
 
我的意思是在子窗体内加
onclose里面增加以下语句 Action := caHide
 
to:yostgxf正是你说的那样加了,不行的,我在提这个问题之前,不知道已经试了多少遍了。[:(]
 
如果不是从FormA派生生成的话,我只要在onclose中增加
action := cafree;
frmA := nil;
但是由a派生出来的话,就会出现如上的问题。
 
自己搞定了。^_^
以上的回答都是错误的。
 
你是怎么解决的呀?可否赐教!谢谢先!我也遇到了这样的问题!
 
唉,基本常识啊。
在 TFormA 的 OnClose 中写 Action := caFree;
在 TFormA 的 OnDestroy 中 写 FormA := nil;
另外子窗体的创建过程不用 Show,多余的。
 
vvyang
先 搞清楚了再回答问题,你按照我说的那样做了一次了吗?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
553
import
I
后退
顶部