问一个超级低级的问题,进来看看,或许你也迷惑。(100分)

  • 主题发起人 主题发起人 cqwty
  • 开始时间 开始时间
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(inttostr(longint(@self)));
Memo1.Lines.Add(inttostr(longint(self)));
memo1.Lines.Add(inttostr(longint(@form1)));
end;
这几个的值为什么各不相同呢?如何才能通过self得到和@form1一样的值呢?
 
Self和Form1都是指向同一个对象的指针
@Self为Self指针的指针
@Form1为Form1指针的指针
结论是通过Self不可能得到@Form1,因为对于他们两人来讲只是之间的目的地相同,但并不知道彼此的存在
 
哦,那如何得到他们都指向的那个对象的地址呢(也就是指针)。
 
Self和C++里的this一样,都是指向自己的指针,不知道你要取哪个地址,如果你要取类的地址直接: Pointer(Self)这样就可以了,如果你要取指针的地址那就@Self就可以了
 
to cqwty:
没太明白你的意思,对象其实就是一块内存,self就是指向这块内存的指针,你可以通过
Pointer(Self)^ 来直接访问对象的内存
 
你的代码应该再加一行变成这样
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(inttostr(longint(@self)));
Memo1.Lines.Add(inttostr(longint(self)));
memo1.Lines.Add(inttostr(longint(@form1)));
memo1.Lines.Add(inttostr(longint(form1)));
end;


@Self

@Form1
分别是保存Self和Form1的数据的地址,Form1和Self其实就是指向Form1在内存中的实例的指针,他们保存的内容都是指向Form1的实例的地址.
 
@self-------self----------|
Form1的实例地址
@form1-----form1----------|
 
yinju的解说完全正确。
 
上面解释的已经很清楚了。
 
为什么会迷惑呢?
既然这个方法是 TForm1 的方法,而调用这个方法的TForm1实例是Form1,那么语句中的Self当然就是指向Form1的指针,或者用OO的说法是Form1对象的Handle,这没有问题呀,Self是一个指针型变量而已,它等效于在程序声明段里声明的那个 var Form1: TForm1,
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(inttostr(longint(@self)));
Memo1.Lines.Add(inttostr(longint(self)));
memo1.Lines.Add(inttostr(longint(@form1)));
end;
这几个的值为什么各不相同呢?如何才能通过self得到和@form1一样的值呢?
 
多人接受答案了。
 

Similar threads

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