如何解决mdi子窗口消失的问题?(50分)

  • 主题发起人 主题发起人 alan_yang
  • 开始时间 开始时间
A

alan_yang

Unregistered / Unconfirmed
GUEST, unregistred user!
假如随便在主窗口的客户区里用鼠标一点,那么已打开的子窗口都不见了。
怎么解决呢?
 
子窗口ShowModal么
 
用show()打开的是无模式窗体,用showmodal()打开的是有模式窗体,它们的区别是
你能在无模式窗体和其它窗体之间切换。
 
不会呀!?
除非子窗体的FormStyle没有设成fsMDIChild!

一般来说,一个子窗体在创建后就会自动显示出来。当关闭它时,就把它Free掉,下一次用
时重新创建。
 
呵呵,先澄清一下,所谓不见只是暂时的不见,如果再重新生成的时候上可以判断到
子窗口存在的。我是用show的。子窗口也已经设置成fsmdichild,用完退出的话是用
action:=cafree,form2:=nil;
 
if not Assigned(form2) then
begin
form2 := Tform2.Create(self);
form2.show;
end
else
form2.show;

 
我现在就是这样干的啊,可是如果我用鼠标在主窗口的客户区随便一点,那刚show出来
的窗口就看不到了。
 
高手们都睡觉去了?呵呵,帮帮忙吧!
 
你是怎么建立和关闭子窗口的,把它贴出来。
 
procedure Tmainfrm.N4Click(Sender: TObject); //建立窗口
begin
if ydcx_frm=nil then
ydcx_frm:=Tydcx_frm.create(application);
ydcx_frm.show;
end;
//窗口关闭
procedure Tydcx_frm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
ydcx_frm:=nil;
end;
 
让程序自动建立,把以下去掉:
if ydcx_frm=nil then
ydcx_frm:=Tydcx_frm.create(application);

把关闭里代码全部去掉.
 
对不起,应这样写:
procedure Tmainfrm.N4Click(Sender: TObject); //建立窗口
begin
Tydcx_frm.create(self);
end;

//窗口关闭
procedure Tydcx_frm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
end;
 
哎,楼上的,这样的话一开始子窗口就要全部建立了。
而且我只想让每个子窗口只存在一次,像你那样写是肯定不行的。
 
行的,只要你执行
Tydcx_frm.create(self);
就会新建一个子窗口。
 
给个通用过程,不管是不是MDI窗体都行
procedure OpenForm(FormClass: TFormClass; var AForm;
AOwner:TComponent=nil);
//根据窗口类名建立窗口,如果窗口存在则只激活它
var
i: integer;
Child:TForm;
begin
for i := 0 to Screen.FormCount -1 do
if Screen.Forms.ClassType=FormClass then
begin
Child:=Screen.Forms;
if Child.WindowState=wsMinimized then
Child.WindowState:=wsNormal;
Child.BringToFront;
Child.Setfocus;
TForm(AForm):=Child;
exit;
end;
Child:=TForm(FormClass.NewInstance);
TForm(AForm):=Child;
if not assigned(aowner) then aowner:=application;
Child.Create(AOwner);
end;
建立用
OpenForm(Tydcx_frm,ydcx_frm,self);
窗口关闭还是
procedure Tydcx_frm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
end;
 
你的问题很奇怪,我的子窗口从来没有发生过你的现象,你把你的初始窗口代码改成下面的方式用下看看:

[red]if ydcx_frm=nil then
ydcx_frm:=Tydcx_frm.create(self);
ydcx_frm.show;[/red]
我都是这么用的。
 
to biggo:情况依旧。

to jxsjd:我是说每个子窗口只能存在一次,如果已经存在的话就show出来
 
关闭以后不可能存在,因为你已经把它Free(action:=caFree)了,而且MDIChild是不能Hide的。
 
to jxjsd:
问题是现在都如果用鼠标在子窗口外一点那么子窗口就看不到了,如何关闭?
而按你那样作的话那么就会一直新开子窗口。

我想,你是不是没有明白我的意思呢?
 
我再试试,是不是我用了flash作背景图才会这样呢?
 
后退
顶部