怎么阻止重复弹出窗体(50分)

  • 主题发起人 主题发起人 iwantdown
  • 开始时间 开始时间
I

iwantdown

Unregistered / Unconfirmed
GUEST, unregistred user!
在应用程序开始后,我点击一个按钮弹出一个窗体<br>例如: 点击 “登记”按钮弹出窗体:<br>&nbsp; &nbsp; &nbsp; &nbsp;fromDJ:=TfromDJ.application(self);<br>&nbsp; &nbsp; &nbsp; &nbsp;fromDJ.show;<br>请问怎么才能避免点击按钮后都能弹出新窗体<br>我想解决这个问题要先判断窗体是否已弹出,怎么判断
 
if FindWindow(nil,'标题栏文字')&gt;0 then exit; //标题栏文字<br>fromDJ:=TfromDJ.create(application);<br>fromDJ.show;
 
判断formDJ是否为nil就可以<br>但要记住,在form的destroy中加上一句formDJ:=nil;。
 
在按钮事件这样写<br><br>if formDJ&lt;&gt;nil then exit;<br>fromDJ:=TfromDJ.application(self);<br>fromDJ.show;<br>......<br>fromDJ.free;<br><br><br>记住,不要加这句 formDJ:=nil;
 
首先你要將這個窗體類變量設定為全局的.<br>有兩種方法實現,<br>一種是在程序啟動時就將窗體創建好,點按鈕調用他時,直接show,close時不要釋放,而是隱藏.hide 再次打開時,還是show<br>另一種是,在點按鈕時創建,你先判斷form1 = nil則創建,並show,否則,直接show.另外注意在窗口釋放的地方,一定要FreeAndNil來釋放這個窗口.
 
madeagle 的答案正确!
 
d5开发人员指南
 
if not Assigned(formDJ) then<br>&nbsp; formDJ := TformDJ.create(application)<br>formDJ .show;<br><br>formDJ &nbsp;的onclose 事件 &nbsp;<br>&nbsp; action := cafree<br>&nbsp; formDJ &nbsp;:= nil;
 
谢谢你们的回答,可是我一一试过还是有问题<br>mageale的方法是窗体彻底弹不出来<br>kinneng 的方法是窗体关闭在打开时会出错<br>&nbsp;<br>我已经找到一个方法:formdj.showmodal
 
我的方法经测试一点问题都没有,不知道你是怎么用的~~
 
if FindWindow(nil,'标题栏文字')&gt;0 then exit; //标题栏文字<br>fromDJ:=TfromDJ.create(application);<br>fromDJ.show;<br><br>我的程序启动后,点击按钮弹出窗体,窗体name 为 formdj;caption为formdj;<br>我的语句为:<br>if FindWindow(nil,'formdj')&gt;0 then exit; //标题栏文字<br>formDJ:=TformDJ.create(application);<br>formDJ.show;<br><br>可是显示不出来
 
不会吧,这个问题本来很弱智,懒得花时间,建两个窗体,form1放一个按钮,然后双击按钮,将下面的代码全部覆盖上去,接着run,按下按钮,弹出form2,仅此一次,无论form2是否显示,都不会再弹出来<br><br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs, StdCtrls, Unit2;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; &nbsp; procedure FormDestroy(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; <br>&nbsp; public<br>&nbsp; &nbsp; formDJ: TForm2;<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.dfm}<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; if formDJ &lt;&gt; nil then exit;<br>&nbsp; formDJ:= TForm2.Create(self);<br>&nbsp; formDJ.show;<br>end;<br><br>procedure TForm1.FormDestroy(Sender: TObject);<br>begin<br>&nbsp; if formDJ &lt;&gt; nil then<br>&nbsp; &nbsp; formDJ.free;<br>end;<br><br>end.<br><br><br>如果想form2关闭的时候,按按钮就会弹出,而弹出的时候,按钮无效,可以在form的Close事件加入代码<br><br>unit Unit2;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs;<br><br>type<br>&nbsp; TForm2 = class(TForm)<br>&nbsp; &nbsp; procedure FormClose(Sender: TObject; var Action: TCloseAction);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form2: TForm2;<br><br>implementation<br><br>{$R *.dfm}<br><br>uses &nbsp;Unit1;<br><br>procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);<br>begin<br>&nbsp; Form1.formDJ.free;<br>&nbsp; Form1.formDJ:=nil;<br>end;<br><br>end.<br><br>顺便改改前面的按钮过程<br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; if formDJ &lt;&gt; nil then<br>&nbsp; begin<br>&nbsp; &nbsp; formDJ.BringToFront;<br>&nbsp; &nbsp; exit;<br>&nbsp; end;<br>&nbsp; formDJ := TForm2.Create(self);<br>&nbsp; formDJ.show;<br>end;
 
1、ShowModal方式显示窗体是最直接的方法;<br>2、实在不能用ShowModal,必须先判断该窗口是否已存在,如果存在就直接Show,否则先Create再Show
 
恩,用findwindow,查找是否窗体句柄已经存在。存在直接显示,不存在要先create,然后再显示。
 

Similar threads

回复
0
查看
816
不得闲
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部