请问:可以在form的OnCreate事件里关闭它本身吗?(20分)

  • 主题发起人 主题发起人 *HelloWorld*
  • 开始时间 开始时间
H

*HelloWorld*

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在主form的OnCreate事件中放入一个关于窗口是否已经存在的判断,使用FindWindowEx<br>函数。当给定标题的窗口(也就是本form)已经存在时,显示“程序已经打开”,然后关掉它。<br>代码如下:<br><br>//如果程序窗口已打开<br>begin<br>&nbsp; showmessage('程序已经打开');<br>&nbsp; form1.release;<br>&nbsp; form1:=nil;<br>end;<br>这样写出来的程序能调得通,但我总觉得不好,觉得它浪费了太多的资源。而且还有个问题:<br>form在运行上述代码的过程中会产生一个由建立到毁灭的快速闪烁,这样让人看了很不舒服。<br>如果我在release前面加上form1.visible:=false,那程序又调不通。<br>请问:您在遇到类似问题时如何解决的呢?
 
在Create中写,是不是可以避免闪烁?
 
这样写比较安全,效果和Form1.Release基本一样。 <br>begin<br>&nbsp; Application.Terminate;<br>end;<br><br>或者更直接的,没有你所说的闪烁,但不很安全:<br>begin<br>&nbsp; Halt;<br>end;
 
有过这个方面的讨论,最好的答案是重载Create事件。<br>
 
[red][h3]楼上全错![/h3][/red]<br>正确的是 PostMessage(Self.Handle, WM_CLOSE, 0, 0);
 
参考《delphi5开发人员指南》 &nbsp; 4.6.3
 
to com:<br><br>请参考Application.Terminate,<br>procedure TApplication.Terminate;<br>begin<br>&nbsp; if CallTerminateProcs then PostQuitMessage(0);<br>end;<br><br>条条大路通罗马,达到一个目的,并非只有一种方法。
 
不用等到主FORM的创建才来判断您这个程序是否运行,可以在程序启动时候就判断,<br>不要用查找窗口的标题的方式来判断,用互斥量。<br><br>program PrjChatServ;<br><br>uses<br>&nbsp; Forms,windows,SysUtils,<br>&nbsp; mainunit in 'mainunit.pas' {mainForm}<br>var<br>&nbsp;hMutex:HWND;<br>&nbsp;Ret:integer;<br>{$R *.RES}<br><br>begin<br>&nbsp; Application.Initialize;<br>&nbsp; hMutex:=CreateMutex(nil,false,'powerchatserver');<br>&nbsp; Ret:=GetLastError;<br>&nbsp; if Ret&lt;&gt;ERROR_ALREADY_EXISTS then<br>&nbsp; Begin<br>&nbsp; &nbsp;Application.CreateForm(TmainForm, mainForm);<br>&nbsp; &nbsp;Application.Run;<br>&nbsp; End<br>&nbsp; Else<br>&nbsp; &nbsp;application.MessageBox('程序已经运行,不要重复运行!','重复运行',MB_Ok);<br>&nbsp;end.<br>
 
不错,:左文明用互斥量的方法可以避免程序运行一个以上实例。<br>如果你想程序中不想有同样的FORM建立再次的话,可以用如下的方法:<br>if FORM1 = nil then<br>&nbsp; FORM1 := TForm1.Create(self);<br>FORM1.ShowModal;
 
begin &nbsp;<br>&nbsp; if not Assigned(Form1) then<br>&nbsp; &nbsp; Form1 := TForm1.Create(Application);<br>&nbsp; Form1.Show;<br>end;<br>这是判断窗体是否已经创建,如果创建就否则直接显示.<br>
 
同意左文明:<br>&nbsp; 用FINDWINDOW不太好因为有可能相同的窗体存在您在调试时如果窗体已在内存<br>&nbsp;您可能一次都不能运行。<br>建议在左文明的基础上用RegisterWindowMessage来注册一个消息号来唤醒已存在的窗体
 
agree 左文明
 
多人接受答案了。
 
后退
顶部