关于关闭子窗口的问题?急!(200分)

J

jiefeij

Unregistered / Unconfirmed
GUEST, unregistred user!
var CurrentForm:Tform;//全局变量,当前活动FORM
procedure closeform;
begin
if FrmMain.MDIChildCount>1 then
begin
CurrentForm.Close;
CurrentForm.Free;
CurrentForm :=frmMain.ActiveMDIChild ;
CurrentForm.WindowState := wsMaximized;
end
else
end;
CURRENTFORM是当前活动窗体。frmMain是主窗口。
当打开多个窗口时,用以上过程关闭子窗口时,有时会出现
access violation at address 00000021.read of address 00000021错误。有时又很正常。
 
没有必要记录,frmMain.ActiveMDIChild 就是当前活动FORM
 
在子窗体的onClose事件中加入:Action:=caFree;
 
for i := 0 to frmMain.MDIChildCount - 1 do
frmMain.MDIChildren.Close;
 
TO:MTJ 你说的有理,但这不是问题。
TO:独酷求败 你的方法我试过,不能解决问题。
TO:xyl999 我不是关闭所有的窗口,我只是关闭当前的窗口,而且你那样做也是不对的。
应该for i := 0 to frmMain.MDIChildCount - 1 do
frmMain.MDIChildren[0].Close;
我发现好象是在运行完这个过程后,有转向另一个过程procedure TrpColumnBar.Notification(AComponent: TComponent; Operation: TOperation);

procedure RemoveColumnsDataSet(AColumns: TrpColumns);
var
I: Integer;
begin
with AColumns do
for I := 0 to Count - 1 do
begin
if Items.DataSet = AComponent then Items.DataSet := nil;
if Items.HasChild then RemoveColumnsDataSet(Items.ChildColumns);
end;
end;

begin
inherited;
if Operation = opRemove then
if AComponent is TDataSet then RemoveColumnsDataSet(FColumns);
end;

好象是在这儿出的问题。有谁能告诉为什么会这样。
 
MDI子窗口关闭后下一个子窗口自动成为活动窗口,如果没有下一个窗口则活动窗口为空,
你的
CurrentForm :=frmMain.ActiveMDIChild ;
CurrentForm.WindowState := wsMaximized;//如果没有活动窗口怎么办?
一定会出错!
 


CurrentForm :=frmMain.ActiveMDIChild ;
CurrentForm.WindowState := wsMaximized

改为:
if frmMain.ActiveMDIChild <> nill
begin

CurrentForm :=frmMain.ActiveMDIChild ;
CurrentForm.WindowState := wsMaximized
end;
 
to:ysai and chenxz
其实我在FrmMain.MDIChildCount>1 中就已经判断了至少有两个子窗口,关闭一个,至少还有
一个了。所以你们说的还是没有说到问题的根本处。
请各位帮帮忙,我被这个问题折腾了很久了。我想还是在另一个过程中,但到底是什么原因我
就弄不清楚了。
 
你是不是动态创建了控件, 还是安装了控件
procedure RemoveColumnsDataSet(AColumns: TrpColumns);是什么意思,可否屏蔽掉
 
那你把CurrentForm.WindowState := wsMaximized屏蔽掉看看会不会出错。
 
to mtj:
是的,我安装了一个报表打印的控件。不好意思,我上面的程序少粘了,应该是
procedure TrpColumnBar.Notification(AComponent: TComponent; Operation: TOperation);
procedure RemoveColumnsDataSet(AColumns: TrpColumns);
var
I: Integer;
begin
with AColumns do
for I := 0 to Count - 1 do
begin
if Items.DataSet = AComponent then Items.DataSet := nil;
if Items.HasChild then RemoveColumnsDataSet(Items.ChildColumns);
end;
end;

begin
inherited;
if Operation = opRemove then
if AComponent is TDataSet then RemoveColumnsDataSet(FColumns);
end;
我觉得不好屏蔽掉那段代码?有没有好的办法呢?
 
to chenxz:
如果那样做的话,我的界面将会很难看了。怎么样能够运行TrpColumnBarNotification
这个过程可能就可以解决问题了。可是他就是要去运行这个过程
 
我觉得问题就是那句话,你先测试一下,找到问题后再处理好了。
 
我都不知道怎么测试了。我是在一个BUTTON的ONCLICK中调用关闭子窗口过程的,具体
procedure TfrmC.SpdExitClick(Sender: TObject);
begin
try
CloseMyForm;
except
raise;
end;
end;
但是错误出在最后一个END上。
 
那你在OnClose事件中有没有代码?
 
to ysai:
没有
 
OnCreate中呢?
如果有个QQ就好了
 
to ysay:
ONCREATE 中也没有写任何代码,我特意把ONSHOW中的代码去掉。不好意思,
我没有QQ。
我有测了很长时间,我把包含上面NOTIFICATION的过程的单元去掉,还是会出现同样
问题,看来还是窗体本身的问题了。
 
如果方便能不能发代码过来?
 
我觉得应该是你报表控件的问题。
看上面的代码,我觉得好象应该是Form.free 的时候已经释放掉,但你的控件在被释放
的时候有调用RemoveColumnsDataSet ,但实际上它的一些属性这个时候已经不存在了,
所以就产生了错误。
你可以顺着这个思路往下找一下问题!
 
顶部