这行程序为什么行?(50分)

  • 主题发起人 主题发起人 Babyfloppy
  • 开始时间 开始时间
B

Babyfloppy

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个改 wndproc 的例程序里看到了这样几行程序 :"
procedure Tform1.wndproc(var message:tmessage);
begin
if Message.LParam = Longint(Button1) then
~~~~~~~~~~~~~~~~
begin
"
程序中为什么可以把button强制转化为longint? 能否详细的
讲一下到底什么情况下可以这样做呢?

thanks.
/bow.
 
好象是把button1的句柄转成吧? d3也许可以, d4不行了吧?
不是十分清楚.
 
LPARAM 本身就是longint类型,而Button1是一个Button控件的指针,这个指针
在消息传递时存储在消息参数lParam中,指针实际上也是一个长整数,只不过他
表示的是另一个对象的地址,因此指针可以通过longint型变量来存储,就象你
所看到的这种情况。总的来说,object pascal中的指针不能参加算术运算,因
此当需要指针参与运算(如加一个数得到另一个指针)或与一个整数(代表某个
对象的指针)进行比较时,就需要在指针与整型之间相互转换。如下面这条语
句:
(PByte(LongInt(OBuff)+i))^:=(PByte(LongInt(IBuff)+j))^;
OBuff与IBuff各代表输入、输出缓冲区指针,上面的程序就是把IBuff的第j个
单元赋给OBuff的第i个单元,包含了指针与longint的相互转换。
 
button1实际上是一个指针,longint(button1)是把指针转化为他在内存中的地址,
,通常用在回调函数或消息响应函数供其调用如ptr(longint(button1) as tbutton
就重新把他转化为button指针。例如
(ptr(longint(button1)) as tbutton).caption:='a demo';
 
感谢 yjshi 和hubdog 的帮助和解释.
我刚刚查了帮助,可是还是不明白为什么要用
message.Lparam,而不用Wparam 或result 呢,
我不知道message 里这几个东西的具体含义.哪位再解释一下.
thx.
/bow
 
windows应用程序采取消息响应机制,windows预定了一些消息如,wm_paint(绘图消
息)及鼠标键盘等消息,每一个预定的消息,wparam,lparam都包含特定的消息,如
wm_mousemove消息,wparam代表fkeys(表示鼠标移动时,同时有那些按键按下了)
lparam的高位代表mouse 的y坐标,低位代表x坐标,result表示消息处理后的结
果。其他消息也有特定的约定。应看help中的定义
 
Windows自己定义的消息,消息参数都有具体的规定,这一部分参考Win32的编程手册即可。Delphi的Vcl库扩展了Windows的消息,自定义了很多控件消息,这些消息的参数恐怕的分析具体的VCL源代码。至于你说的Button1指针为什么用LParam而不用其他的参数,这就要看它这条消息具体是如何定义的。自定义消息的消息参数如何定义并没有特殊规定,只要解读消息时保持一致就行。因此你处理的这条消息在发送时是把控件指针放到了LParam上,建议你分析一下这条消息发送时的具体程序。
 
呵呵, 这是根据message的不同有不同的用法.
例如:
procedure test(i,j:integer);
begin
result:=i+j*2;
end;
这里i和j是用在不同的地方, 当然不能随意混用. 例子可能不是十分贴切, 但意思
是一样的:-)
 
后退
顶部