请问:method pointer and regular procedure (100分)

  • 主题发起人 主题发起人 vagabond1998
  • 开始时间 开始时间
V

vagabond1998

Unregistered / Unconfirmed
GUEST, unregistred user!
现在编写如下一个函数
procedure SetComboBoxReadOnly(aComboBox : TcomboBox;var bReadOnly : Boolean);
begin
with aComboBoxdo
if bReadOnly then
begin
style := csSimple;
OnKeyPress := TKeyPressEvent(PreventKeyStroke);
end
else
begin
style := csDropDown;
OnKeyPress := nil;
end;
end;

其中PreventKeyStroke是这样定义的:
procedure PreventKeyStroke(Sender :TObject;var Key: Char);
begin
Key := #0;
end;

在编译的时候发生如下错误:incompatible types:method pointer and regular procedure
请问,该如何解决这个问题。就是说,不用派生的方式,该如何改写类的方法。
请回vagabond1998@263.net。谢谢!
 
如果您的类是源自TComponent,那么,只要将
OnKeyPress := TKeyPressEvent(PreventKeyStroke)写为:
OnKeyPress := PreventKeyStroke即可.
 
多谢费心回答。不过……
用继承TCombobox类的办法派生出一个新的类,大概是行得通的。
实际上,如果把PreventKeyStroke函数放到一个T**Form类中
声明并定义,并且 SetComboBoxReadOnly也是该form类的一个
成员,那么是没有一点问题的。但是这样做的不便之处是,我
如果想要在多个窗体里使用这样的代码,就需要复制多份。
所以我需要把这代码做成公用函数,并放在一个unit模块中。
结果,就出现了上述的问题。
 
>我把这代码做成公用函数,并放在一个unit模块中。
我也这样做了.
首先,我建立了一个独立于应用程序的类aa(父类是TObject),并把
SetComboBoxReadOnly和PreventKeyStroke都作为aa类的
公开过程声明定义;
在aa类里,我还是用的OnKeyPress := PreventKeyStroke;
不过我把您的SetComboBoxReadOnly函数第一个参数声明改为:
Var aComboBox : TcomboBox;
其次,在应用程序的开始(即project的代码里,我创建了一个aa类的实例:a
第三,在应用程序当中,我引用a.SetComboBoxReadOnly,结果获得成功.
整个过程中并没有用派生.
 
多谢指点。
蛋兄提供的这种方法,在通过编译上是绝对没有问题的。
可是它不太满足我想要的效果。
我的设想是这样的:
给一个窗体,我遍历出其中所有实现用户输入的界面
元素,包括编辑框、以及下拉框等,并可以设置
各个界面元素为只读。对于编辑框,我设置readonly
属性即可,但是对于下拉框来说,它没有readonly
属性,而我也不想设置它的enable属性(因为设置
enable为false以后,同时也就禁止显示它的hint了)。
所以我的一个想法是修改它的KeyPress和KeyDown
这两个event handler,防止用户的键盘输入,从而
实现“只读”的效果。
在给上述两个event handler赋值的时候,产生了
我问的问题。
关键就是说,声明/定义一个普通的函数,它能否赋值给
一个类的成员?(它们的参数都是一样的。)
 
消息句柄必须是类的成员函数,这是由其类型决定的.
不可能用一个普通函数响应消息的,因为消息句柄是8
字节,前4个字节是SELF指针,而普通函数不可能有SELF.
BTW:响应控件的OnKeyDown不可能实现只读的,因为系统
在进行了部分处理之后才调用OnKeyDown.要截获全部键
盘消息,必须用钩子函数或重设窗口函数的方法.
 
不能. Delpho 对两者的处理是不同的, 普通的 procedure 或者 function 仅仅是一个地址,
而类中的方法则有方法的实际地址和类实例指针两个部分.
解决你的问题的一个方法:
Use a Dummy Form which contains a method you want. First, make this method public.
then
you can call it everywhere.
 
多谢各位热心提供的帮助!
注意到在delphi自己的帮助中(Procedural types)有如下的例子代码:
……
type
TNotifyEvent = procedure(Sender: TObject) of object;
TMainForm = class(TForm)
procedure ButtonClick(Sender: TObject);
...
end;
var
MainForm: TMainForm;
OnClick: TNotifyEvent
we could make the following assignment.
OnClick := MainForm.ButtonClick;
……
它的意思好象是,变量var onClick只能引用在类中定义的方法。
看来想偷懒的想法落空了。:<
再次感谢各位的帮助!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
763
import
I
后退
顶部