现在我在关闭我生成的窗口时又遇到了一个问题:
   我在关闭窗口时想先判断窗口是否需要保存来进行处理。我使用的是下面的程序,现在发现这样一个问题:假设打开三个子Form,如果当前Form是不需要保存的,其他两个需要保存,用下面的程序处理时如果在消息确认框中选择取消,那么那个不需保存的Form的Caption会变成所取消关闭的Form的caption,这是为什么?怎么解决?多谢!源程序如下:procedure TForm_Main.FormClose(Sender: TObject; var Action: TCloseAction);
Var
  FormChild: TForm_MainChild;
  Reply:word;
  I: Integer;
begin
  if ( Form_Main.ActiveMDIChild <> nil ) then
  begin
     for I := 0 to MDIChildCount - 1 do
     begin       if (MDIChildren[I] as TForm_MainChild).Save_flag1 = 1 then
       begin
         Form_Main.ActiveMDIChild.Caption := (MDIChildren[I] as TForm_MainChild).Caption;
         Reply:=MessageDlg('是否把当前“'+(MDIChildren[I] as TForm_MainChild).Caption+'”的信息保存到BIN文件中再退出?',mtConfirmation,[mbYes,mbNo,mbCancel], 0);
         if (Reply=mrYes) then
         begin
           Form_Main.TB_SavecardClick(Self) ;
           action:=CaFree;
         end
         else if (Reply=mrNo) then
         begin
           action:=CaFree;
         end
         else begin
            action:=caNone;
            exit;
         end;
       end;
     end;
  end;
end;

解决方案 »

  1.   

    不是很明白你的“那么那个不需保存的Form的Caption会变成所取消关闭的Form的caption”的意思。不过我想是你的程序里Form_Main.ActiveMDIChild.Caption := (MDIChildren[I] as TForm_MainChild).Caption;这个语句靠前了,因为你判断了子窗体符合保存条件之后就执行了这个语句。所以在你没点Cancle前就已经把Form_Main.ActiveMDIChild的Caption变成MDIChildren[I]的Caption了。我想你应该把Form_Main.ActiveMDIChild.Caption := (MDIChildren[I] as TForm_MainChild).Caption;放到if (Reply=mbYes) then条件的复合语句中。不知道我说的符合你的意思不?
      

  2.   

    我的意思就是:假设你打开三个子窗体,互相切换时在父窗体的Caption我设置了同时显示子窗体的Caption。一般的软件例如Ultraedit,新建文件则窗体的标题栏为Ultraedit-〔编辑1〕,Ultraedit-〔编辑2〕,假设你这时新建了两个,Ultraedit-〔编辑1〕,Ultraedit-〔编辑2〕,两个文件随便输入一些字母,再打开一个已经存在的文件test.c,即Ultraedit-〔test.c〕,如果这时关闭窗口,会提示是否保存,如果取消则完全取消。可是我的程序运行时,会将那个test.c变为编辑1或者编辑2。你所说方法我试过了,不行。因为我想做到:如果这时关闭编辑1窗口,出现消息框时,软件的标题栏显示Ultraedit-〔编辑1〕,关闭编辑2时显示Ultraedit-〔编辑2〕,用你说的方法则会实现不了这个功能。
      

  3.   

    你的程序问题多多!即使你选择了确定,当前窗体的 Caption 也会被改变,只是因为你的主窗体被 Free 了,所以你没有看见
       Form_Main.ActiveMDIChild.Caption := (MDIChildren[I] as TForm_MainChild).Caption;
     这句根本没必要!为什么去修改活动子窗体的 Caption 呢?你要在父窗体中同时显示子窗体的 Caption ,应该是
     Form_Main.Caption:= MainFormCaption+' - ['Form_Main.ActiveMDIChild.Caption+']';
    MainFormCaption 是一常量
    而不是去修改活动子窗体的 Caption。
      

  4.   

    SORRY!Form_Main.Caption:= MainFormCaption+' - ['+Form_Main.ActiveMDIChild.Caption+']';
      

  5.   

    回复hiflower(花) :多谢帮助!
    我用你的方法试过了,但是这样会造成Main_Form的caption的叠加,我先将Main_Form的caption设为'',但是还是会同时出现两个子窗口的Caption。这样怎么改呀?
      

  6.   

    const MainFormCaption='主程序';
     Form_Main.Caption:= MainFormCaption+' - ['+Form_Main.ActiveMDIChild.Caption+']';
      

  7.   

    回复hiflower(花) :
       我是采用了你的方法,程序如下:
       Form_Main.Caption:= 'Program'+' -['+(MDIChildren[I] as TForm_MainChild).Caption+']';   但是会出现这样一种情况:
       假设当前不需保存的活动子窗口为:test.c,这时主窗口的Caption为“Program - [ test.c ],另有两个需要保存的非活动窗口:编辑1和编辑2。这时关闭窗口时主窗口的caption变为了:Program - [ 编辑1 ] - [ test.c ]。多了后面这一部分,我不知怎么消除它。我试过将Form_Main.Caption:= ''加在上句话前,还是不行。这样怎么办?拜托!
      

  8.   

    那你肯定在某个地方 修改了 子窗体的  Caption