关于TObject类问题或者说是关于消息拦截,或处理的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 HongYuan
  • 开始时间 开始时间
H

HongYuan

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure Dispatch(var Message); virtual;
procedure DefaultHandler(var Message); virtual;

为什么不用定义类型?
 
为什么问上面的问题,一个是好奇,一个是我想拦截“在一个窗体上的控件上按鼠标右键的消息,并禁用控件上右键菜单的某项子菜单”。

为什么要拦截窗体上的控件消息,是因为程序设计时很多窗体从一个父类继承的,现在要统一去掉右键菜单中某项子菜单,但不保证派生中没有重新指定新的右键(弹出式)菜单,不知道高人有何办法处理这样的问题。
 
procedure Dispatch(var Message); virtual;
procedure DefaultHandler(var Message); virtual; 第一个是分发消息的,
后面的是默认的消息处理过程,就是如果子类中没有该消息的处理过程,子类将向父类中查找该消息的处理过程,如果还没有,继续向上寻找,直到调用Tobject类中默认的消息处理过程DefaultHandler

拦截控件的消息 用覆盖窗口过程应该可以的
 
不用定义类型有两个原因
1。Delphi的语法中规定使用var或者const修饰参数,则参数可以不带类型,所以这符合语法规定
2。TObject作为所有类的祖先类,不定义类型就给了派生类极大的灵活性
3。虽然没有定义类型,但是在Dispatch的实现代码中使用了两个字节表示消息ID来判断消息所以在实际使用中,定义的消息类型前两个字节必须表示消息ID
 
关于拦截,娃娃已经说到点子上了
 
to:ysp娃娃
procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP;
这样处理吗?

还是在这里处理。
procedure WndProc(var Message: TMessage);

我在WndProc中只能处理窗体自己的右键消息,不能拦截GRID上的右键消息。我想可能是因为他们可能都有自己的窗口句柄,所以窗体的上控件消息不经过TForm.WndProc直接交给控件的WndProc处理了吧。
 
procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP;
这个方法,我现在不能用,因为我用的是在delphi下开发的一个叫思维加速公司的平台,它不支持。
 
这个方法,我现在不能用,因为我用的是在delphi下开发的一个叫思维加速公司的平台,它不支持。


那怎么办啊? 具体要实现什么功能啊?
 
我们所有的功能里都用到一个叫TDataGrid控件,我缺省有个右键菜单,为了保证数据安全性,我们需要去掉右键菜单上的一个导出子菜单,或者说要让这个子菜单在授权的情况下才能使用,并且还要保留其他子菜单,不能全部去掉。
 
to:muhx

procedure TForm1.test(var aa);
begin
aa:='test';//Operator not applicable to this operand type
ShowMessage(aa);
end;

如果,定义了var 没有指定类型,这个在函数里怎么使用呀?
 
后退
顶部