热情软件屋

 

如何使主窗口关闭时程序不退出


编号:QA003750
建立日期: 2001年1月8日 最后修改日期:2001年1月8日
所属类别:

老高:
    操作系统: windows98
    编程工具: delphi
    问题: 专家同志:
    我想做到如下效果: 在没有其他应用程序运行的情况下,一个应用程序在启动时开启了一个窗体(称A),选择A的某一菜单则会显示一个新的非模态窗体(称B),此时A,B在状态栏中都有相对应的按钮存在,也就是说按Alt+Tab可以在A和B之间切换;除系统进程外按Ctrl+Alt+Del只显示一个进程.如果关闭A则B并不消失,程序也并不结束;反之关闭B则A也不消失,程序也并不结束。只有当两窗体(A,B)都关闭之后程序才结束,即按Ctrl+Alt+Del显示此进程消失。
    这样看来,似乎没有那个窗体算是主窗体了。推而广之,一个应用程序任意多个这样的窗体,如何实现?如果你有OutLook Express 5 你可以按几次"新邮件"按钮试试看。
    不知我说清楚了没有。
    水平: 中级

回答:

    对于你的要求,我目前还有一点无法实现,就是使用ALT+TAB可以在一个进程的窗口中切换。其他的要求都可以实现。下面是一个例子。FORM1是主窗口,FORM2是副窗口。给FORM1增加一个public变量:
     FormsCount:integer;
    FORM1上有一个按钮,按下按钮显示FORM2:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Form2.Show;
    end;
    默认,Delphi在任务条只显示一个窗口对应的按钮。如果你希望Form2对应的窗口也显示在任务条,可以这样:
    procedure TForm2.FormCreate(Sender: TObject);
    var lStyle:longint;
    begin
     lStyle := GetWindowLong(Handle, GWL_EXSTYLE);
     lStyle := lStyle Or WS_EX_APPWINDOW;
     SetWindowLong(Handle, GWL_EXSTYLE, lStyle);
     Form1.FormsCount := Form1.FormsCount + 1;
    end;
    Delphi还有一个问题,就是如果主窗口被关闭,整个程序就退出了。为了避免这一点,我们可以修改Form1的OnClose事件:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Application.Title := 'Form1';
     FormsCount := 1;
    end;
    
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     if FormsCount > 1 then
     begin
     Action := caNone;
     Visible := False;
     ShowWindow(Application.Handle, SW_HIDE);
     FormsCount := FormsCount - 1;
     end;
    end;
    在OnClose事件中,我们判断有几个窗口,如果只有一个(那就是Form1了),程序就正常退出。否则,有多个窗口显示,Form1隐藏起来并将FormsCount减1。Form2的OnClose事件如下:
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     Form1.FormsCount := Form1.FormsCount - 1;
     if Form1.FormsCount = 0 then
     Form1.Close;
    end;
    如果用户关闭Form2,而还有其他窗口在显示,则正常退出并将Form1.FormsCount减1。如果这是只有Form2显示,则程序关闭Form1,整个程序也就退出了。
    
    

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio