请教各位:关于强制类型转换

GipsyCN 2001-10-08 03:43:39
子窗口中:
SendMessage(hMainFormHandle, WM_MERGE_MENU, 0, LongInt(@aMainMenu));

主窗口处理WM_MERGE_MENU消息时:
procedure TfmDTMMain.MergeSubMenu(var aMsg: TMessage);
begin
MainMenu1.Merge(TMainMenu(aMsg.LParam));
end;
为什么会出错???
...全文
141 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
GipsyCN 2001-10-23
  • 打赏
  • 举报
回复
在“大富翁”上搞定!多谢各位参与!
MainMenu1.Merge(PTMainMenu(Pointer(aMsg.LParam)^)!!!
hantao 2001-10-16
  • 打赏
  • 举报
回复
up
klcn 2001-10-08
  • 打赏
  • 举报
回复
现在你的消息传递和类型转换都是没有问题的,
也就是说在你的消息处理函数中已经成功的得到
了aMainMenu,你可以调试一下看看,在消息处理函数
中经过类型转换后的值是否仍然指向一块有效的内存。
如果这些都没有问题,只能说明你在消息处理函数中对
这个值的使用有问题。
GipsyCN 2001-10-08
  • 打赏
  • 举报
回复
下面的代码没问题:
procedure SendStrToMainForm(asMsg: string);
begin
SendMessage(gAppInfo.hMainFormHandle, WM_GET_STR, 0, LongInt(PChar(asMsg)));
end;

procedure TfmDTMMain.DispGetStr(var aMsg: TMessage);
begin
stbMain.Panels[2].Text := string(aMsg.LParam);
end;

klcn 2001-10-08
  • 打赏
  • 举报
回复
使用@aMainMenu是取得对象引用本身的的地址,这样是不对的。
改了以后仍然有问题,可能是你的处理函数有问题。
GipsyCN 2001-10-08
  • 打赏
  • 举报
回复
我也尝试过使用先定义: PTMainMenu = ^TMainMenu;
MainMenu1.Merge(PTMainMenu(aMsg.LParam)^)
同样不行。
GipsyCN 2001-10-08
  • 打赏
  • 举报
回复
我的程序框架模仿资源管理器,
所有的子窗口显示时都显示在主窗口右半部分的NoteBook的不同页面上,
而子窗口和主窗口的通信,都是使用SendMessage。
我怀疑可能这种强制转换对TMainMenu不适合(也没道理啊)。
saimaya 2001-10-08
  • 打赏
  • 举报
回复
gz
hellion 2001-10-08
  • 打赏
  • 举报
回复
不存在的话当然出错了。
1、改成全局变量
2、处理消息前不要free
GipsyCN 2001-10-08
  • 打赏
  • 举报
回复
应该是不存在,是强制转换不成功,我想,否则不会出错了。
hellion 2001-10-08
  • 打赏
  • 举报
回复
主窗口处理WM_MERGE_MENU消息时aMainMenu还存在么?
GipsyCN 2001-10-08
  • 打赏
  • 举报
回复
首先感谢这位朋友。我曾试过,结果一样。
chechy 2001-10-08
  • 打赏
  • 举报
回复
改一下:
SendMessage(hMainFormHandle, WM_MERGE_MENU, 0, LongInt(aMainMenu));

注意Delphi的类本身就是一个指针,所以不必使用@符号。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧