附著之控件(50分)

  • 主题发起人 主题发起人 jiichen
  • 开始时间 开始时间
J

jiichen

Unregistered / Unconfirmed
GUEST, unregistred user!
目前要寫一非視覺化之控件(TRedo),為 TControl 後代,
此控件內需攔截 Parent(繼承 TCustomMemo 之可見控件)
的 OnKeyUp, OnMouseUp, OnCreate 等事件,
使用者只需指定 TRedo.Associate 指向要攔截之控件便可,
其餘控件自行處理,不知要如何作較好?
 
可以继承下来之后,用属性编辑器来编制其Associate属性即可(RegisterPropertyEdit)。
使其对应的拦截控件是自己要求的控件类型,其它的不管。
 
我认为你的思路可能反了。
要截获类的事件,只能采取继承子类,重载其虚方法的办法。
所以,你应该这样做:继承 Memo 类,重载其虚方法如:KeyDown,KeyPress 等及
构造函数。然后增加一个 TRedo 类型属性:FAssociated: TRedo;而不是为 TRedo
类增加形如 FAssociated: TMemo 的属性,因为这样无法截获事件。
Right ?
From: BaKuBaKu
 
To Warm:
請問,是要繼承哪一類呢?

To BaKuBaKu:
問題是:不想限制單一 TMemo 子類,可能會使用 TRichEdit,但未來
如果遇上更好之編輯控件,便會改用,繼承的話,將來要改不是很麻煩嗎?
再說,如果無法攔截的話,那 TUpDown 是怎麼做到的呢?

請多多指教!謝謝!
 
绝对不可能拦截到 Parent 的 OnCreate 事件的。
因为在 该元件 创立时, 其 Parent 已经存在。其Constuctor 过程已是历史。
而 拦截 OnKey... OnMouse... 是可以的。

另外: Tmemo 等是不能作为容器的。因此 Parent 一说不恰当.
截获消息的方法可以用Hook ,也可以自己加。例:
Private
OLDWinProc:TWndMethod;
Procedure MyWindowProc(Var Message:Tmessage);
....

在构造里加上 OLDWinProc:=OtherComponent.WindowProc;
OtherComponent.WindowProc:=MyWindowProc;

在 MyComponent.MyWindowProc(Var Message:Tmessage);
Begin
//根据消息 Message 做相应处理过滤
OLDWinProc(Message); //让原来Memo 处理.
End;

在析构里还原
OtherComponent.WindowProc:=OLDWindowProc;




 
TUpDown 并没有拦截 Associated 对象的事件。
但是,当关联控件(比如 TEdit)的内容改变之后,TUpdown 控件的 Position 的确会跟着改变,这是怎么回事呢?
原因是:UDM_SETBUDDY 和 UDM_GETPOS 消息。
procedure TCustomUpDown.SetAssociate(Value: TWinControl);
begin
if FAssociate <> nil then { undo the current associate control }
begin
if HandleAllocated then
SendMessage(Handle, UDM_SETBUDDY, 0, 0); // 发送 UDM_SETBUDDY 消息
FAssociate := nil;
end;
end;
function TCustomUpDown.GetPosition: SmallInt;
begin
if HandleAllocated then
begin
Result := LoWord(SendMessage(Handle, UDM_GETPOS, 0, 0));
FPosition := Result;
end
else Result := FPosition;
end;
UDM_SETBUDDY 消息把 Edit 设置为 TUpdown 的“伙伴”,这样,当 Edit 内容改变之后,
因为对 Position 属性的读取会触发 GetPosition 方法,导致发送 UDM_GETPOS 消息,就
得到了 Edit 的当前内容,把它赋给 FPosition 。
下面是 UDM_GETPOS 的说明:
The UDM_GETPOS message retrieves the current position of an up-down control.

UDM_GETPOS
wParam = 0;
lParam = 0;

Return Values
The return value is the current position in the low-order word. If an error occurred, the high-order word is nonzero.
Remarks
When processing this message, the up-down control updates its current position based on the caption of the buddy window.
The up-down control returns an error if there is no buddy window or if the caption specifies an invalid or out-of-range value.
从说明里介绍的可以知道,其实 FAssociated 可以是任何 TWindowControl 的后代。

从上面的说明可以看到,这一过程不是通过 VCL 的对象继承与消息拦截实现的,它是由 Windows
标准控件(TUpdown 是标准控件)本身的特性决定的。

Clear ?
From: BaKuBaKu
 
多人接受答案了。
 
后退
顶部