我有一个组件,它附加到任何 TCustomEdit 控件。它过滤输入到 TCustomEdit 控件的键盘输入,使控件的行为类似于 maskedit。
但是我遇到了另一个问题。虽然我可以在粘贴之前分析剪贴板的内容,然后决定是否粘贴(OnKeyDown 事件 CTRL + V),但我无法通过右键菜单捕捉粘贴。
我不想拦截 OnChange 事件,因为我想在控件的文本实际更改之前进行操作。
感谢您的建议
我有一个组件,它附加到任何 TCustomEdit 控件。它过滤输入到 TCustomEdit 控件的键盘输入,使控件的行为类似于 maskedit。
但是我遇到了另一个问题。虽然我可以在粘贴之前分析剪贴板的内容,然后决定是否粘贴(OnKeyDown 事件 CTRL + V),但我无法通过右键菜单捕捉粘贴。
我不想拦截 OnChange 事件,因为我想在控件的文本实际更改之前进行操作。
感谢您的建议
我认为您可以通过侦听发送到目标控件的 WM_PASTE 消息来做您需要的事情。最简单的方法是通过 WindowProc 属性替换窗口过程。
这是如何做到的:
TTextMask = class (TComponent)
private
FtempWndProc: TWndMethod;
FWinControl:TWinControl;
procedure DoWindowProc(var Message: TMessage);
procedure SetWinControl(Value: TWinControl);
//...
published
//...
property WinControl : TWinControl read FWinControl write SetWinControl;
end;
// ...
procedure TTextMask.SetWinControl(Value: TWinControl);
begin
if Assigned(Value) and not Assigned(FWincontrol)
then
begin
FtempWndProc := Value.WindowProc;
Value.WindowProc := DoWindowProc;
end;
//...
FWincontrol:=Value;
end;
procedure TTextMask.DoWindowProc(var Message: TMessage);
var s:string;
Index:Integer;
m:integer;
begin
if Message.Msg = WM_Paste then
begin
// code here
end;
FtempWndProc(Message);
end;
谢谢你的好建议,大卫。