如何在消息里传递接口?(100分)

  • 主题发起人 主题发起人 SeaHawk
  • 开始时间 开始时间
S

SeaHawk

Unregistered / Unconfirmed
GUEST, unregistred user!
使用参数,将要传递的指针转换成LongInt类型,然后就可以了。
注意,两边都要使用相同的机构。否则很容易出问题。
 
yzhshi:请看以下代码!

procedure TForm1.ComboBoxEventChange(Sender: TObject;
var ctrl: _CommandBarComboBox);
var cV: olevariant;
begin
PostMessage(Form1.Handle,WB_COMBOBOXCHANGE,0,LongInt(ctrl));

end;

procedure TForm1.WBComboBoxChange(var Msg: TMessage);
var Combo1: IUNKnown;
begin
combo1:=IUNKnown(Msg.LParam)
此处转换出现错误!
end;

是什么问题?
 
这样如何?不知道语法是否通过?![:D]
combo1:=_CommandBarComboBox(Msg.LParam);
 
试过了,不行。出现错误:Access violation at Address.... Read of Address...
 
看了半天,基本上懂你的需求了,是不是将Word里面的ComboBox和Delphi里面的ComboBox
统一呀?据说两个不是一个东西。
不过你可以首先定义一个_CommandBarComboBox,将那个参数转换成_CommandBarComboBox类型。
然后逐个Items的给ComboBox赋值,至于事件嘛,好像没戏了吧,不过尝试一下事件赋值,也许你会有
意外的发现
var CommandBarComboBox1: _CommandBarComboBox;
CommandBarComboBox1:=_CommandBarComboBox(Msg.LParam);
...
 
不是,你看了讨论Word的那个帖子吗?因为生成的Word里的CommandBarComboBox的Change事件触发时
不能直接访问CommandBarComboBox的属性,但是等事件完成后就可以,从代码理由看不出什么问题:(
所以我想用一个消息去触发另一个事件,然后在这个事件里访问。但是却无法在消息里将
CommandBarComboBox接口传递过去,是在很郁闷,你能解决吗?
 
估计你这个想法没戏。
因为在本身都不能访问这个属性,如果你发送消息,那么发送是使用post还是Send。
post呢,不知道在那里完成了,send呢,和呢在那个事件里面访问基本一样。
 
问题是为什么接口传递不过来?到底是什么原因?你说的方法全试过了。可就是不行。但是
先把Ctrl赋给一个全局变量,就没有问题:(
 
不会吧?这个应该没问题的吧?!
var CommandBarComboBox1: _CommandBarComboBox;
CommandBarComboBox1:=_CommandBarComboBox(Msg.LParam);
 
不行,出现上面的错误,所以我实在不明白:(
 
那就不好办了:-),我也没办法了,可能你使用longInt传过来的不是地址!也许!
 
procedure TForm1.WBComboBoxChange(var Msg: TMessage);
begin
Label1.Caption:=NowCombo.Text;
end;

procedure TForm1.ComboBoxEventChange(Sender: TObject;
const Ctrl: _CommandBarComboBox);
begin
NowCombo:=Ctrl;
PostMessage(Form1.Handle,WB_COMBOBOXCHANGE,0,0);
end;
这里用全局变量就可以!
虽然PostMessage不是那么保险,只要不是太繁忙,我想问题不大,你说呢?
这也是没有办法的办法:(
 
NowCombo是什么类型?_CommandBarComboBox?TComboBox?
如果是前者,那么是正常的,如果是后者,那么出怪事了。[:)]
 
当然是_CommandBarComboBox;
 
那就不奇怪了,不过奇怪的是下面的为什么不行?
var CommandBarComboBox1: _CommandBarComboBox;
CommandBarComboBox1:=_CommandBarComboBox(Msg.LParam);
 
我跟踪过,传出来的参数都没问题,一转换就出错,真是奇怪。现在只好暂时用前面的办法。
而且,为什么事件出发的时候不能访问,出错的信息有比较奇怪,这都是我想搞明白的。
我听人说Office有个开发版,不知道有什么不同。
 
我也没有用过开发版,就不得而知了。
不过,有一个情况可供你参考:
当使用Word产生一个事件的时候,在这个事件里面使用SendMessage给Delphi程序发送消息。
此时Delphi程序接收到消息后在消息处理单元内就不能设置Word的任何属性了。
会报一个 对象处于同步 的错误。
 
开发版我倒是可以找到,2000和XP都有。不过还没有用过。
我今天看了老半天MSDN,也没有看出什么东西来。你说的这个情况是在OLE方式里吗?
 
倒不是Ole的情况,是在Com调用的时候。
不过原理差不多。
对了,关于Ole不能打印预览的情况,我们“斗胆”猜测一下:
首先看一下PowerPoint的打印,他的编辑和打印是完全两个模块,如果进入打印预览界面,
那么按Alt+Tab还可以切换回编辑界面。
那么对于Word呢?是不是同样存在这个问题?编辑和打印预览是两个窗体?
对于OleContainer,是不是仅仅显示了编辑窗体,而打印窗体即使你调用了,他发觉不能关闭
编辑窗体或者不能显示预览窗体而退出?
=========以上仅仅是猜测==========
 
后退
顶部