究竟用什么判断对象已存在?(50分)

  • 主题发起人 主题发起人 hthugm
  • 开始时间 开始时间
H

hthugm

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
x:Tedit;
begin
if Not AsSigned(x) then
begin
x:=Tedit.create(self);
x.parent:=self;
x.visible:=True;
ShowMessage('x is not existed');
end
else
ShowMessage('x is existed');
end;

高手们程序一执行会出现'x is not existed‘还是'x is existed'
别乱回答请做一下试验
 
你这个中X不是全局变量,这样做有意义?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=0135436
 
你的这个问题真的有点奇怪,,??
我做了实验,,答案让我想不通,,不过,,
发现x 居然是 TForm1 的实例,,????
如果把 x: TEdit 的声明放到全局的地方就不会出现了。。:)
 
当然是'x is not existed'
现在Delphi中assigned中判断的依据是对象是否为nil,比如if assigned(edit) then ...
如果edit为nil那么assigned返回true,否则返回false,
但是如果edit本来不是nil,那么在你edit.free之后,你会发现edit并不是nil,虽然内存已经
释放,但却不能自动设置edit为nil,所以需要用assigned判断是一定要用freeandnil函数
来释放这个edit,比如freeandnil(edit),然后用assigned判断就可以了.
 

这个是局部对象,判断是多余的。直接Create
 
局部变量的初值是随机的,所以你的结果也是随机.
局部变量用之前最好赋一下初值.
x:= nil;
 
刚开始的话,x并没有赋值,还是NIL
not assigned为真,当然会显示 x is not existeed;
你把x设成全局变量这样测试才有意义。
 
procedure TForm1.Button1Click(Sender: TObject);
var
x:Tedit;
begin
x:=nil;
///////
if Not AsSigned(x) then
begin
x:=Tedit.create(self);
x.parent:=self;
x.visible:=True;
ShowMessage('x is not existed');
end
else
ShowMessage('x is existed');
end;
 
看来在定义一个对象之后,这个对象并不是nil,需要x:=nil一次,
就像是定义一个integer之后未初始化,它的值就不是0一样
 
to www:
全局变量是不用初始化的,只有局部变量才需要这么作.
 

全局变量一般不需要初始化,但它是一个对象。会被初始化为nil。
 
这样子的哈。。
 
自己初始化一下没坏处
 
还是有很多人不做试验就乱回答,唉。。。。

x:Tedit;
其实这样声明,X是一个指针,与A:INTEGER不一样的

 
TO ALL FRIENDS:

如果这里X是一个窗体类型我第一次初始化这个窗体已经显示了,我再
击一下按钮因为这个窗体已显示了,再来一句X:=NIL不是多于吗?相当于判断对象是否存

如果没有X:=NIL这一句哪单击就得不到正确的结果,
我必须是局部变量。
 
如果你用的是局部变量,上面的语句就毫无意义。
局部变量一离开其作用域就自动释放了,而且再次进入作用
域重新分配空间获得的是一个随机的值.
 
to xeen:
我不是说了吗我的X是另外一个窗体,我只是显示一下而已,我只是显结果
我发现朋友们回答问题有点答非所问我问是
究竟用什么判断对象已存在?
 
你不会连变量的作用域都不知道吧!
 
你定义了x:Tedit;
如果你对它直接赋值,比如x:=edit1;
那么这个x确实是指向edit1的一个指针,但如果你x:=tedit.create,那么x就是一个实例.
何况你的问题也是用什么判断对象已存在.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部