procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Sbkz_Form.Free;
Sbkz_Form:=nil;
end;procedure TSbkz_Form.Button2Click(Sender: TObject);
begin
Close;
end;
点击这个按钮出错,提示:‘Abstrat error’
而我用窗体上的‘x’关闭窗口不会出错,但是重新创建这个窗体是又出错,创建代码如下:
procedure TGlzt_Form.Button4Click(Sender: TObject);
begin
if Sbkz_Form=nil then
Sbkz_Form:=Sbkz_Form.Create(Self)
else
Sbkz_Form.show;
end;我该怎么写这个释放?
begin
Sbkz_Form.Free;
Sbkz_Form:=nil;
end;procedure TSbkz_Form.Button2Click(Sender: TObject);
begin
Close;
end;
点击这个按钮出错,提示:‘Abstrat error’
而我用窗体上的‘x’关闭窗口不会出错,但是重新创建这个窗体是又出错,创建代码如下:
procedure TGlzt_Form.Button4Click(Sender: TObject);
begin
if Sbkz_Form=nil then
Sbkz_Form:=Sbkz_Form.Create(Self)
else
Sbkz_Form.show;
end;我该怎么写这个释放?
解决方案 »
- 求一SQL语句,或delphi方法
- jf接到4000分,庆贺一下
- delphi中导出的类中.如何导出属性(property)?
- array [0..7]of char 和string有什么区别,string 可以用的函数char数组是否可用
- 两个FORM如何传递消息?
- 请问Pagecontrol中,怎么设置能让标签宽度随着Tabsheet的宽度变化?
- DX问题高手求救:在Delphi的DX编程中,为何最简单的例子,用到的控件就DXDraw及DXTimer两个,占CPU那么高?怎么降低?
- 我自己做了一个form模板,但现在要修改,不知道怎么才能修改
- DBgrid为什么显示0:00-1:00之间的时间字段有问题?
- 在dephi5.0下,在保存sql的Text字段时,总是提示我'Non-blob column in table required to perform operation' 为什么?请各位提示一下?
- 無辜啊: 何錯之有?
- delphi中長字符串字段問題
//ShowModal
form2.ShowModal;
form2.Free;//Show
form2.Show;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
Sbkz_Form := TSbkz_Form.Create(Self)
else
Sbkz_Form.show;还有,Sbkz_Form 怎么没有初始化为nil?
begin
Sbkz_Form.Free;
Sbkz_Form:=nil;
end;將 Sbkz_Form.Free; 那句去掉,應該可以改正錯誤!
procedure TGlzt_Form.Button4Click(Sender: TObject);
begin
if Sbkz_Form=nil then
Sbkz_Form:=Sbkz_Form.Create(Self)
else
Sbkz_Form.show;
end;
释放动态创建的窗体和窗体本身是否摸态没有关系吧?!楼主在创建窗体的时候使用如下代码:
if not Assigned(Sbkz_Form) then
begin
Application.Create(TSbkz_Form,Sbkz_Form);
Sbkz_Form.Show;
end; //因为是动态创建的,所以如果判断对象指针为空,那么肯定是没有创建,所以可见性也谈不上,也没有必要在调用Show方法了,这样会出错。至于窗体对象指针的清零可以在释放的时候保证释放窗体的时候在OnClose事件中写如下代码:
FreeAndNil(Self);
begin
if not Assigned(Sbkz_Form) then
Application.CreateForm(Sbkz_Form,Tsbkz_Form)
end;
procedure TGlzt_Form.Button4Click(Sender: TObject);
begin
if not Assigned(Sbkz_Form) then
begin
Application.CreateForm(TSbkz_Form, sbkz_Form);
sbkz_Form.Show
end;
end;
begin
Action:=caFree;
end;
Form1:=Nil; //不可以使用Self
2.Free;
Form1:=Nil; //不可以使用Self,同上
3.FreeAndNil(Self);
这里可以使用Self,原因很简单,看看SysUtils单元的FreeAndNil源码就知道了
procedure FreeAndNil(var Obj); //参数类型是无类型变参
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil; //这里可以看到FreeAndNil内部是先释放指针,才释放对象的!
Temp.Free;
end;
begin
try
aa.showmodal
finally
release
end;
end;
我操作窗口时一般不要用全局变量指针的。
顶多在不得已的时候定义一个私有的窗口变量。
-------------------------------------------------------------------
也建立楼主尽量不要用Sbkz_Form这种全局变量,
会带来太多的不稳定因素啊。
直接用SELF不是可以访问了吗?
如果用Sbkz_Form这种变量也就限定了同类型的窗口只能打开一个实例了,
不太好。
-------------------------------------------------------------------
不到万不得已,不要用全局变量!
Form1:=Nil; //不可以使用Self
2.Free;
Form1:=Nil; //不可以使用Self,同上
3.FreeAndNil(Self);//??????????????第三点有问题:
这样可以,但是这样解决不了楼主的问题。
你虽然清空了SELF指针的值,但是没有清空Sbkz_Form的值!
很明显示,楼主需要清空Sbkz_Form的值。
begin
Action:=caFree;
Sbkz_Form:=nil;
end;//建议楼主少用Sbkz_Form这样的变量。
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free; //这里释放对象实体
end;
在close事件中;
action:=cafree;
form:=close;
如果是一个单击事件释放直接调用close就行了
var
P: TObject;
begin
P := TObject(Obj);
TObject(Obj) := nil; // clear the reference before destroying the object
P.Free;
end;/*
如果用FreeAndNil(SELF)调用,只会清除SELF指针,却不会清除Sbkz_Form指针的值,
Sbkz_Form不会为nil的。
*/
不要用Sbkz_Form这种全局变量?那我该怎么办?单击button4时创建Sbkz_Form这个窗体
to yzykjh FrameSniper
用你们这个方法窗体Sbkz_Form创建不了,没有反映啊
if not Assigned(Sbkz_Form) then
begin
Application.Create(TSbkz_Form,Sbkz_Form);
Sbkz_Form.Show;
end;
TSbkz_Form.Create(Application).Show;procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
if not Assigned(Sbkz_Form) then
begin
Application.Create(TSbkz_Form,Sbkz_Form);
Sbkz_Form.Show;
end;procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
Sbkz_Form:=nil;
end;
if not Assigned(Sbkz_Form) then
Application.Create(TSbkz_Form,Sbkz_Form);
Sbkz_Form.Show;
procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
Sbkz_Form:=nil;
end;
不要用Sbkz_Form这种全局变量?那我该怎么办?单击button4时创建Sbkz_Form这个窗体
第二种方法:
if not Assigned(Sbkz_Form) then
Application.Create(TSbkz_Form,Sbkz_Form);
Sbkz_Form.Show;
编译时说类型不对:
[Error] Glzt.pas(52): Incompatible types: 'TComponent' and 'Class reference'
Application.Create(TSbkz_Form,Sbkz_Form);
Sbkz_Form.Show;procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
Sbkz_Form:=nil;
end;
还有if not Assigned(Sbkz_Form) then
和if Sbkz_Form=nil then这两个方法有什么区别?
Application.Create(TSbkz_Form,Sbkz_Form);
Sbkz_Form.Show;procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
Sbkz_Form:=nil;
end;//一定行,不可能错。
这句话编译出错:Application.Create(TSbkz_Form,Sbkz_Form);
[Error] Glzt.pas(52): Incompatible types: 'TComponent' and 'Class reference'
要改成Application.CreateForm(TSbkz_Form,Sbkz_Form);