哪位大虾可以给我,将一下。控件的事件机制。(200分)

  • 主题发起人 主题发起人 byrybye
  • 开始时间 开始时间
B

byrybye

Unregistered / Unconfirmed
GUEST, unregistred user!
控件的事件,怎么和控件的是事件处理方法连上的。
我看书上讲的好象用消息,可是如果是用消息,还要
事件做什么。我实在是不明白,他的机制呀。
 
Delphi的消息处理公开了一半,有一半是编译器提供的。
例如 procedure ... message WM_....

事件处理程序 实际上是一个函数指针。看看VCL就可以看到这样的代码

if Assign(On.....) then On....

这里On...就是事件处理程序,这样联系上的。

一段VCL的实例代码:

...
TLVDrawItemEvent = procedure(Sender: TCustomListView; Item: TListItem;
Rect: TRect; State: TOwnerDrawState) of object;
...
FOnDrawItem: TLVDrawItemEvent;
...

procedure TCustomListView.DrawItem(Item: TListItem; Rect: TRect;
State: TOwnerDrawState);
begin
TControlCanvas(FCanvas).UpdateTextFlags;
if Assigned(FOnDrawItem) then FOnDrawItem(Self, Item, Rect, State)
else
begin
FCanvas.FillRect(Rect);
FCanvas.TextOut(Rect.Left + 2, Rect.Top, Item.Caption);
end;
end;

这里 OnDrawItem 就是事件处理函数(指针)。

procedure ... of Object;

意思就是一个函数指针类型(虽然并没有指针出现,它用 of Object 这个修饰表明)
 
另外,可以找到这样一个声明:

property OnDrawItem: TLVDrawItemEvent read FOnDrawItem write FOnDrawItem;

这里是将事件作为一个属性声明出来,于是你就可以在ObjectInspecter上看到了。
具体如何将这个函数和这个属性连接上呢?
看看Dfm的文本描述:

object ListView1: TListView
Left = 72
Top = 192
Width = 250
Height = 150
Columns = <>
TabOrder = 1
OnDrawItem = ListView1DrawItem <------连接事件处理函数
end


 
再另外,delphi的消息分两种,一个是内部的消息处理,一个是Window的消息处理。
内部的消息是为了控件之间的联系用的,window的消息主要是和系统相关的消息。
一般编程中很少直接用到内部的消息,一般主要是相应window系统的消息。
内部的消息处理主要就用 事件 这个机制了。
就是前面讲的。
 
还有另外:

procedure ...; WM_ .....;

这种类型的消息处理,delphi在内部有一个消息映射表,类似与VC的那种。
这个表是由编译器创建并维护的,我们访问不到。
 
事件实际上一个后期绑定的事件处理函数的函数指针。在你的自定义控件中定义一个符合该函数函数头的函数指针。然后当你在编写该控件的实现代码时,
在你觉得应该触发该事件的地方使用该函数指针调用事件处理函数(当然这时候编译器并不知道该处理函数的入口地址是什么,它是在运行期绑定的)。
这样你的控件的使用者在使用你的控件时只需要在它的代码中定义一个和和事件相匹配的事件处理函数,并将控件的事件句柄(也就是上边说的函数指针)赋值为该事件处理函数就是了。
 
结了吧。
 
我想问一下,在messages.pas文件中定义了许多消息的格式,是不是声明为T......格式(也就是后半部分)的消息才能
在Delphi中定义使用?
 
不是的,所有的消息都可以用的。在MESSAGES。PAS文件中的声明只是为了你使用特定的消息方便而已。
 
好好研究一下下面这个帖子。就明白了。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2403549
 
delphi在内部有一个消息映射表
 
其实,Delphi里的事件机制最底层来说,大部分是采用的Windows提供的Api,只不过改成Pascal的方式了。建议看一下Windows消息机制。
 
后退
顶部