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 这个修饰表明)