我的子窗体是动态建立的.如果多次调用该函数的话!就会生成多个Frm 如何使其只有一个?
procedure TForm1.Frm2ShowOnClick(Sender:TObject);
var
Frm:TForm2
begin
Frm:=TFrom2.Create(Selft);
Frm.Show();
end;
procedure TForm1.Frm2ShowOnClick(Sender:TObject);
var
Frm:TForm2
begin
Frm:=TFrom2.Create(Selft);
Frm.Show();
end;
解决方案 »
- 兄弟甚为郁闷
- 求一份多开HOME呼出代码
- 我朋友用VC写,我用delphi,现在VC把一张bmp的图放在内存传入(我写dll),请问delphi如何读取内存中的bmp图,并放在Timage中?
- delphi中Web Service自定义类型返回
- 祝贺CC结婚.CC都新婚燕尔,偶呢?郁闷
- 关于数据库的两道题目,在线等,救人哪!!!急等~~~~
- 为了提高技术水平我弄了一个DELPHI论坛,希望能够和有DELPHI技术网站的弄友情链接
- 一个很难回答的问题?
- 请问怎么改变NetMeeting控件的显示模式 急!在线待待
- 哪一位高手对用于浏览器下载的Inf文件熟悉?
- 软件包居然安装错误!大家看看啊(来者有分)
- 有意思的问题,请指点
begin
showmessage('已经存在了');
Exit;
end;
Form2 := TForm2.Create(Self);
Form2.Show;
var
Frm:TForm2
begin
if from2=nil then
Frm:=TFrom2.Create(Selft);
Frm.Show();
end;
beginaction:=cafree;
form2:=nil;
end;
Form1:=TForm1.Create(Application);
Form1.Show;
Raised Exception Class EAcess Violation
var
Frm:TForm2
begin
if frm=nil then
Frm:=TFrom2.Create(Selft);
Frm.Show();
end;
Form2:=TForm2.Create(self);
无法判断其是空的,它始终不为空
TForm1.Create(Tfrm2,frm2);
Frm2.ShowModal;
Frm2.free;
Frm:TForm2
begin
if Frm is Tform then
Frm.show
else
begin
Frm:=TFrom2.Create(Selft);
Frm.Show;
end;
end;
var
Frm:TForm2
begin
if Application.findcomponent('frm')=nil then
Frm:=TFrom2.Create(Self);
Frm.Show();
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SUIButton, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
Var
Frm2:TForm2;
begin
if(Frm2 = nil) then
begin
Frm2:=TForm2.Create(Self);
Frm2.Show;
end
else
begin
Frm2.Show;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
Frm22:TForm2;
begin
if Frm22 is TForm then
begin
Frm22.Show;
end
else
begin
Frm22:=TForm2.Create(Self);
Frm22.Show;
end;
end;procedure TForm1.Button3Click(Sender: TObject);
var
Frm23:TForm2;
begin
if Application.FindComponent('Frm23')=nil then
Frm23:=TForm2.Create(Self); Frm23.Show;
end;procedure TForm1.Button4Click(Sender: TObject);
var
Frm24 :TForm2;
begin
if not Assigned(Frm24) then
begin
Frm24:=TForm2.Create(Self);
Frm24.Show;
end
else
begin
Frm24.Show;
end;
end;end.
var
Frm23:TForm2;
begin
if Application.FindComponent('Frm23') = nil then
begin
Frm23:=TForm2.Create(Application);
Frm23.Name := 'Frm23';
Frm23.Show;
end;
end;
var
Frm23:TForm2; // 注意:这个是局部变量,请注意它的有效范围!!!
begin
if Application.FindComponent('Frm23')=nil then
Frm23:=TForm2.Create(Self); Frm23.Show;
end;
因为它CREATE 建立的 就还堆内存中,下次再来的时候就不用再CREATE了
function TMainForm.checkOpenmdiwin(Sender: TFormClass):boolean;
//用于打开Mdi窗口前是否有此窗口,false则载系统忙信息窗口
Var
iii:Integer;
begin
result:=false;
For iii:=0 to MainForm.MDIChildCount-1 Do Begin
if MainForm.MDIChildren[iii].ClassType=Sender Then Begin
result:=true;
Exit;
End;
End;
end;
给你看看吧
http://community.csdn.net/Expert/topic/3542/3542420.xml?temp=.6751673
IF 窗口被创建? THEN 显示到最前台
ELSE 创建窗口
------------------------------------
因为它CREATE 建立的 就还堆内存中,下次再来的时候就不用再CREATE了
------------------------------------
说明你已经知道窗口在关闭时并没有被销毁!
这会导致一个什么问题呢???
上面那么多解决窗口重复打开的方法,其实本质上都是为了解决下面这个问题?
很多窗口在被重新打开的时候,根本就不能用SHOW方法
why?
你刚发了一封EMAIL,现在还想再写一封,你新建EMAIL发现里面里显示
都是上一封邮件内容时,你有何感觉?
所以窗体一旦被关闭,就应该立即销毁,治标得治本
好好看看吧
窗体建立之后,是有一个对象存在了,但是函数内部局部变量能保存对象地址么??
Frm.Free;
Frm := nil;
表面上窗体被释放掉了,但仍然能调用窗体中的某些函数(BCB也一样),因此内存并没有释放。
FormIsCreated:Boolean;procedure TForm1.Frm2ShowOnClick(Sender:TObject);
var
Frm:TForm2
begin
Frm:=TFrom2.Create(Selft);
Frm.Show();
FormIsCreated:=True;
end;procedure TForm2.OnShow(Sender:TObject);
begin
FormIsCreated:=False;
end;哈哈,够简单了吧?
function FormCreated(fForm: TFrom):boolean;
Var
i: integer;
Begin
Result := False;
Try
i := fForm.Height;
Result := True;
Exception
Result := False;
End;
End;
var I: integer;
begin //判断窗体是否已经存在。入口参数 FormName 为待检测窗体名称。
Result := false; //结果先设为真。
with form1 do
for I := 0 to MDIChildCount - 1 do //用循环判断子窗体是否存在。
if pos(Uppercase(FormName), Uppercase(MDIChildren[I].Name)) > 0 then
begin
Result := True; //结果返回假。
Break;
end;
end;
........
if not ExistForm(form2) then
begin
form2:=tform2.Create(self);
end ;
form2.show;
end;...................
zdee(好好学习,天天向上)
zxw111111(秋风)
但是第一次 没有建立起来是不可以访问的! victor_yang(victoryang) :
全局变量:FormIsCreated:Boolean; 行的通 但不实用 我有12个Frm 其不是和累
二、FindWindow()
什么叫内存没释放?怎么可能没释放?难道释放内存非要再填满$0000 或$ffff ?
出于效率考虑,一般释放内存时仅仅将被释放段标识成未用,并不再进行进一步的清零销毁
但 xxx.Free后,xxx的内存已经释放了to ZengMuAnSha:
你在每个按钮中放一个局部变量是不对的,函数结束局部变量就没了,
你有好多个窗口,每个窗口都是一个单独的unit吧?每个unit中都有一个Form的全局变量吧?
Delphi自动加的,打开自己好好看看,不用你自己加什么"FormIsCreate"
var
Form2: TForm2;主窗口中:
unit Unit1;uses Unit2, Unit3, ...;//相信你已经加了procedure TForm1.Button1Click(Sender: TObject);
begin
if(Form2 = nil) then Form2 := TForm2.Create(Self);//根据全局变量判断窗口是否已建立
Form2.Show;
end;Unit2中:var
Form2: TForm2;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form2 := nil; //如果被关闭,设为空,防止重复建立
end;
如果是防止同一个句柄重复创建,参考OverlordBlind(OverlordBlind)的方法处理。
搂主的意思应该是第一个。