关于强制类型转换 SendMessage的使用(200分)

  • 主题发起人 主题发起人 GipsyCN
  • 开始时间 开始时间
G

GipsyCN

Unregistered / Unconfirmed
GUEST, unregistred user!
子窗口中:<br>SendMessage(hMainFormHandle, WM_MERGE_MENU, 0, LongInt(@aMainMenu));<br><br>主窗口处理WM_MERGE_MENU消息时:<br>procedure TfmDTMMain.MergeSubMenu(var aMsg: TMessage);<br>begin<br>&nbsp; MainMenu1.Merge(TMainMenu(aMsg.LParam));<br>end;<br>为什么会出错???<br>&nbsp;<br><br><br>回复贴子: <br>回复人: chechy(chechy) (2001-10-8 16:00:00) &nbsp;得0分 <br>改一下:<br>SendMessage(hMainFormHandle, WM_MERGE_MENU, 0, LongInt(aMainMenu));<br><br>注意Delphi的类本身就是一个指针,所以不必使用@符号。<br>&nbsp;<br>回复人: GipsyCN(德尔菲) (2001-10-8 16:01:29) &nbsp;得0分 <br>首先感谢这位朋友。我曾试过,结果一样。 &nbsp;<br>回复人: hellion(恶人) (2001-10-8 16:03:36) &nbsp;得0分 <br>主窗口处理WM_MERGE_MENU消息时aMainMenu还存在么? &nbsp;<br>回复人: GipsyCN(德尔菲) (2001-10-8 16:06:38) &nbsp;得0分 <br>应该是不存在,是强制转换不成功,我想,否则不会出错了。 &nbsp;<br>回复人: hellion(恶人) (2001-10-8 16:08:39) &nbsp;得0分 <br>不存在的话当然出错了。<br>1、改成全局变量<br>2、处理消息前不要free &nbsp;<br>回复人: saimaya() (2001-10-8 16:12:53) &nbsp;得0分 <br>gz &nbsp;<br>回复人: GipsyCN(德尔菲) (2001-10-8 16:16:12) &nbsp;得0分 <br>我的程序框架模仿资源管理器,<br>所有的子窗口显示时都显示在主窗口右半部分的NoteBook的不同页面上,<br>而子窗口和主窗口的通信,都是使用SendMessage。<br>我怀疑可能这种强制转换对TMainMenu不适合(也没道理啊)。 &nbsp;<br>回复人: GipsyCN(德尔菲) (2001-10-8 16:40:06) &nbsp;得0分 <br>我也尝试过使用先定义: &nbsp;PTMainMenu = ^TMainMenu;<br>&nbsp; MainMenu1.Merge(PTMainMenu(aMsg.LParam)^)<br>同样不行。<br>&nbsp;<br>回复人: klcn() (2001-10-8 17:41:21) &nbsp;得0分 <br>使用@aMainMenu是取得对象引用本身的的地址,这样是不对的。<br>改了以后仍然有问题,可能是你的处理函数有问题。 &nbsp;<br>回复人: GipsyCN(德尔菲) (2001-10-8 17:44:16) &nbsp;得0分 <br>下面的代码没问题:<br>procedure SendStrToMainForm(asMsg: string);<br>begin<br>&nbsp; SendMessage(gAppInfo.hMainFormHandle, WM_GET_STR, 0, LongInt(PChar(asMsg)));<br>end;<br><br>procedure TfmDTMMain.DispGetStr(var aMsg: TMessage);<br>begin<br>&nbsp; stbMain.Panels[2].Text := string(aMsg.LParam);<br>end;<br><br>&nbsp;<br>回复人: klcn() (2001-10-8 18:29:49) &nbsp;得0分 <br>现在你的消息传递和类型转换都是没有问题的,<br>也就是说在你的消息处理函数中已经成功的得到<br>了aMainMenu,你可以调试一下看看,在消息处理函数<br>中经过类型转换后的值是否仍然指向一块有效的内存。<br>如果这些都没有问题,只能说明你在消息处理函数中对<br>这个值的使用有问题。 &nbsp;<br>
 
SendMessage(hMainFormHandle, WM_MERGE_MENU, 0, LongInt(@aMainMenu));<br>procedure TfmDTMMain.MergeSubMenu(var aMsg: TMessage);<br>begin<br>&nbsp; MainMenu1.Merge(TMainMenu(aMsg.LParam));<br>end;<br>当然要出错了! aMsg.LParam只是一个整型数,你怎么把它强制转换呢?<br>第一句的写法却是对的,把aMainMenu的地址传过来,因此aMsg.LParam是aMainMenu的<br>地址,怎么从地址得到aMainMenu呢? 很简单,把它强制成指针,这个指针所指定的<br>就是aMainMenu了!明白了? 也就是这样:<br>&nbsp; MainMenu1.Merge(TMainMenu(Pointer(aMsg.LParam)^));<br><br>
 
非常感谢!
 
后退
顶部