H hotboy Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-15 #1 Form1;Tform;<br>请问以下3句有何区别???<br>integer(Form1);<br>integer(@Form1);<br>form1.handle;<br>请大师指导!
W wanglogon Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-15 #2 integer(Form1);就是物理指针,用过;interger(@form1)估计是这个指针的地址,没有用过.foem1.handle和指针没有关系,是wincontrol的句柄
L lovezyp Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-15 #3 楼上说的基本正确<br>handle是句柄,简单理解为控件在程序里的标识,当然每次是随机分配的<br>@取地址
K kinneng Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-15 #5 我认为不是楼上说的那样,integer()是强制转换为整数的函数,form1 是变量,<br>integer(form1)就是强制取前form1变量的值的前四字节转换成一个整数的值。<br>@form1是指针指向form1这个变量本身而不是它的值,interger(@form1)强制将<br>它转换成整数值。对于form1.handle没异议。
我认为不是楼上说的那样,integer()是强制转换为整数的函数,form1 是变量,<br>integer(form1)就是强制取前form1变量的值的前四字节转换成一个整数的值。<br>@form1是指针指向form1这个变量本身而不是它的值,interger(@form1)强制将<br>它转换成整数值。对于form1.handle没异议。
W wanglogon Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-15 #6 form1 是变量没错,但是它是pointer变量,所以interger(form1)就是将指针转换成整数(integer)类型返回给你便于存储和记录。当你要作为对象使用的时候,再把这个整数转换成指针类型,你就可以得到这个对象指针。这是delphi编译器一个非常优秀的地方,不详述!
form1 是变量没错,但是它是pointer变量,所以interger(form1)就是将指针转换成整数(integer)类型返回给你便于存储和记录。当你要作为对象使用的时候,再把这个整数转换成指针类型,你就可以得到这个对象指针。这是delphi编译器一个非常优秀的地方,不详述!
H hotboy Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #7 对句柄,指针还是模糊不清。能不能,再详细一点?<br>句柄每次不一样,而integer(Form1);integer(@Form1);不变<br>对象的指针是不是固定的?还是程序编译后就固定?
D delp Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #8 打个比方内存是这样的<br> 地址 内容<br> 00000000 : // 32位系统内存是从0开始的一直到4GB<br> ...<br> 4570148 : 13967236 // Form1 这个指针变量在这里 4570148,说明真正的Form1 在 13967236 这个位置<br> ...<br> ...<br> ...<br> 13967236 : Caption // 真正的 Form1 实际上在这里<br> Visible<br> Color <br> ....<br> ...<br> 4GB : // 32 位系统应该就这么大了2的32次方<br> <br><br>Form1 有2个含义,Form1就好像一个口袋,一个含义是口袋在什么位置,另外一个含义是这口袋里面装的是什么.<br><br>Integer(@Form1) 就是取Form1这个口袋的位置(本例子=4570148).<br>Integer(Form1) 就是取Form1这个口袋的内容是什么(本例子=13967236).<br><br><br><br>Form1 如果是全局变量,那么一般情况下编译以后位置就定下来了,如果是函数局部变量或者是malloc出来的那么就看调用的顺序申请内容是否固定,如果都是固定的,那么位置也是定的,不过不同时间位置表示的意义不一定是Form1这个东西,否则位置就不固定了.<br><br>句柄这个东西没什么深奥的,假设把鼠标/键盘/都编一个号,1是鼠标2是键盘,那么鼠标的句柄就是1,键盘的句柄就是2.
打个比方内存是这样的<br> 地址 内容<br> 00000000 : // 32位系统内存是从0开始的一直到4GB<br> ...<br> 4570148 : 13967236 // Form1 这个指针变量在这里 4570148,说明真正的Form1 在 13967236 这个位置<br> ...<br> ...<br> ...<br> 13967236 : Caption // 真正的 Form1 实际上在这里<br> Visible<br> Color <br> ....<br> ...<br> 4GB : // 32 位系统应该就这么大了2的32次方<br> <br><br>Form1 有2个含义,Form1就好像一个口袋,一个含义是口袋在什么位置,另外一个含义是这口袋里面装的是什么.<br><br>Integer(@Form1) 就是取Form1这个口袋的位置(本例子=4570148).<br>Integer(Form1) 就是取Form1这个口袋的内容是什么(本例子=13967236).<br><br><br><br>Form1 如果是全局变量,那么一般情况下编译以后位置就定下来了,如果是函数局部变量或者是malloc出来的那么就看调用的顺序申请内容是否固定,如果都是固定的,那么位置也是定的,不过不同时间位置表示的意义不一定是Form1这个东西,否则位置就不固定了.<br><br>句柄这个东西没什么深奥的,假设把鼠标/键盘/都编一个号,1是鼠标2是键盘,那么鼠标的句柄就是1,键盘的句柄就是2.
迷 迷 路 人 Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #9 楼上的有道理 一个是指针本身的地址 一个是指针指向的地址,也就是指针的内容
I icc Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #11 楼上的delp已经讲得非常精辟,补充一点<br>因为Form1,被声明为TForm1,类实例之引用,即Pointer,数据结构为4个字节<br>Integer,4个字节<br>所以和整数互转为没有任何问题,因为数据结构是完全一样的<br>@Form1,这种运算符,是取变量所在的存储单元,其硬件地址,32位系统,每2字节为一个地址,俗称字,对4字节的整数,取地址较低的字地址为多字单元的地址<br>欢迎Delp加我的QQ:14574256
楼上的delp已经讲得非常精辟,补充一点<br>因为Form1,被声明为TForm1,类实例之引用,即Pointer,数据结构为4个字节<br>Integer,4个字节<br>所以和整数互转为没有任何问题,因为数据结构是完全一样的<br>@Form1,这种运算符,是取变量所在的存储单元,其硬件地址,32位系统,每2字节为一个地址,俗称字,对4字节的整数,取地址较低的字地址为多字单元的地址<br>欢迎Delp加我的QQ:14574256
C creation-zy Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #12 我来说一下最后一个 form1.handle 吧。Windows系统中的窗体都是有句柄(Handle)的<br>系统对象,就像Delphi利用对象变量来访问对象的内容一样,Windows系统也是利用句柄来<br>访问窗体(或者窗体的内嵌子控件)的。所以,Handle可以(或者说“应该”)被理解为操<br>作系统中用于管理界面对象信息的指针——如果要对form1发送消息(或者,进行其它的系<br>统级API的调用),就必然要用到它的句柄(handle)——句柄仅对操作系统有实际意义。
我来说一下最后一个 form1.handle 吧。Windows系统中的窗体都是有句柄(Handle)的<br>系统对象,就像Delphi利用对象变量来访问对象的内容一样,Windows系统也是利用句柄来<br>访问窗体(或者窗体的内嵌子控件)的。所以,Handle可以(或者说“应该”)被理解为操<br>作系统中用于管理界面对象信息的指针——如果要对form1发送消息(或者,进行其它的系<br>统级API的调用),就必然要用到它的句柄(handle)——句柄仅对操作系统有实际意义。
W wql Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #13 integer(Form1)和integer(@Form1)是一样的!<br><br>form1.handle;表示你的程序的该界面的窗口的句柄!
W wanglogon Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #14 integer(Form1)和integer(@Form1) 一定不一样!
M man8888 Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #15 integer(Form1); //对象地址指针,严格说应该是pointer(Form1); <br>integer(@Form1); //类类型的地址<br>form1.handle; //只是得到对象的handle属性而已。如果想访问handle属性先得到Form1的存放地址指针<br>然后才可以访问handle属性,也就是应该这么写:<br>if Form1 <> nil then<br>begin<br> if form1.handle <> 0 then ...<br>end;
integer(Form1); //对象地址指针,严格说应该是pointer(Form1); <br>integer(@Form1); //类类型的地址<br>form1.handle; //只是得到对象的handle属性而已。如果想访问handle属性先得到Form1的存放地址指针<br>然后才可以访问handle属性,也就是应该这么写:<br>if Form1 <> nil then<br>begin<br> if form1.handle <> 0 then ...<br>end;
D deepfar Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #17 可以结贴了,wanglogon 的回答是正确的
E eloveme Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #18 楼上的delp分析的很精辟``如LZ还有疑问,去看C/C++指针那章吧<br>指针本身也是有值的,即 integer(Form1); <br>指针指向的地址 即 integer(@Form1); <br>最后那个是句柄 即 form1.handle;
楼上的delp分析的很精辟``如LZ还有疑问,去看C/C++指针那章吧<br>指针本身也是有值的,即 integer(Form1); <br>指针指向的地址 即 integer(@Form1); <br>最后那个是句柄 即 form1.handle;
M Miros Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-16 #19 我的理解<br>Integer(Form1) = 指针Form1的值,即Form1指向的地址.<br>Integer(@Form1)= 指针Form1的地址.(一般情况都不这么用,因为大多数情况是想知道指针的指向的内存地址而非该指针的位置。)<br>关于句柄在Delphi中提供给用户用的地方不太多,因为涉及到句柄的API很多都被borland给封装好了.他是系统提供给你的一个已注册类别的实例,可以是窗口类或者是其他。Form1.Handle就是在CreateWindow(Ex)时创建的窗口系统所返回的,用这个句柄可以显示/隐藏窗口(TForm.Visible)或设置窗口样式(TForm.FormStyle)等等。
我的理解<br>Integer(Form1) = 指针Form1的值,即Form1指向的地址.<br>Integer(@Form1)= 指针Form1的地址.(一般情况都不这么用,因为大多数情况是想知道指针的指向的内存地址而非该指针的位置。)<br>关于句柄在Delphi中提供给用户用的地方不太多,因为涉及到句柄的API很多都被borland给封装好了.他是系统提供给你的一个已注册类别的实例,可以是窗口类或者是其他。Form1.Handle就是在CreateWindow(Ex)时创建的窗口系统所返回的,用这个句柄可以显示/隐藏窗口(TForm.Visible)或设置窗口样式(TForm.FormStyle)等等。
K kinneng Unregistered / Unconfirmed GUEST, unregistred user! 2007-07-17 #20 我没理form1是什么东西,不管form1是什么,它就是变量,楼主说是tform,则长度<br>sizeof(form1)=4,可以强制为各种4字节的类型,不一定当指针使用,integer(f):=123; <br>integer(f) * 2 = 246,强制为>4字节的类型有出无法访问内存的致命错。
我没理form1是什么东西,不管form1是什么,它就是变量,楼主说是tform,则长度<br>sizeof(form1)=4,可以强制为各种4字节的类型,不一定当指针使用,integer(f):=123; <br>integer(f) * 2 = 246,强制为>4字节的类型有出无法访问内存的致命错。