类的Create函数调用一个类中定义的函数,函数实现过程中要求调用该类创建的对象的地址,不知是否可以实现?
如定义类
TTest = class;
private
Procedure FuncOne;
Public
Constructor Create;
End;
......MyTest:TTest;
MyTest:=TTest.Create;
其中Create函数内调用了FuncOne,FuncOne要求调用MyTest的地址,不知道有什么办法可以实现?望指教!!
如定义类
TTest = class;
private
Procedure FuncOne;
Public
Constructor Create;
End;
......MyTest:TTest;
MyTest:=TTest.Create;
其中Create函数内调用了FuncOne,FuncOne要求调用MyTest的地址,不知道有什么办法可以实现?望指教!!
解决方案 »
- 小弟问一下连数据库系统的发布问题
- 有没有需要Delphi兼职的?
- TbsSkinCheckListBox 的使用问题
- 跪求《delphi2程序设计大全》一书。
- 大家来比较一下serverSokcet与clientSocket和idTcpServer与idTcpClient两组通讯组件的异同
- 在线等待!!!
- 初学delphi求指教
- ACCESS2000为什么 create table 表1 (字段1 single default 0) 提示default出错误
- 怎么使dbcombobox中的某一个item的font和color与其他item不同?
- 关于midas.dll
- 如何让表单最小化时放至任务栏?
- 用IDHTTP上传文件时,如何在上传工作中获取上传速度?
这样取的时候,每次创建新的对象时引用Self取的地址是不变的!
SELF.自身私有变量 怎么能根据创建不同的实例得到不同的值呢?SELF应该代表实例
很久没碰Delphi,有不对的地方希望大家指教。
类没有实例化时不可能知道其实例的地址,类实例化为对象后,其地址当然会因不同的对象地址而不同的。在类的方法中,self即表示该对象的地址,如果是类方法(以Class开头),self代表类本身(VMT地址)。
TTest = class;
private
Procedure FuncOne;
Public
Constructor Create;
End;Procedure TTest.FuncOne
var
PTmp:PTest;
begin
PTmp:=PTest(@Self);
end;Constructor TTest.Create(...);
begin
inherited Create;
FuncOne;
end;
......MyTest:TTest;
MyTest:=TTest.Create;
如上面类Create中调用了FuncOne,FuncOne取对象实李例的地址,但是现在测试出来每次创建新的对象实例取回来的都是同一地址,我认为这里的Self取的是类的地址,不知道问题在哪里?现在要取对象地址.上面这段代码该如何修改?
什么是vmt??页内地址??
TTest = class;
private
Procedure FuncOne;
Public
Constructor Create;
End;Procedure TTest.FuncOne
var
PTmp:PTest;
begin
PTmp:=PTest(@Self);
end;
你定义了一个指向对象的指针?受C++影响太严重了。
self既为指针(指向对象实例),@self为self变量本身的地址(指向指针的指针)
要显示self的地址很容易:
ShowMessage(Inttostr(Integer(self)));
var
ObjArr:array of TMyClass;
尽量使用ObjectPascal的语法
var
MyTest: TTest;
begin
MyTest := TTest.Create;
后,MyTest是一个指针,指向TTest.Create生成的一个实例。Integer(MyTest)得到的是MyTest变量本身的地址,指针也是一个数据,需要一个地方存储;而Create方法中的Integer(Self)表示实例的地址(因为Create不是“class function”式的普通类方法,否则则表示类引用地址,及VMT地址)。
2、因此楼主所说“FuncOne要求调用MyTest的地址”,应该是表达的错误,真正的意思是得到TTest.Create生成的实例的地址对不对?
3、要得到实例地址,Integer(Self)就可以了。至于:
var
PTmp:PTest;
begin
PTmp:=PTest(@Self);
end;
(1)的确没有必要用^Test,当然用了也没错误。
(2)楼主可能发现每次执行时Integer(PTmp)的值都不变。为什么呢?因为Integer(PTmp)得到的是变量PTmp的地址,而不是它所指向的对象实例的地址。