如何使主窗口关闭时程序不退出
编号: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,整个程序也就退出了。
此问题由李海回答。
| |
|
|
| |
|
|