我需要拦截WM_PASTE message https://stackoverflow.com/questions/10158861/how-to-intercept-detect-a-paste-command-into-a-tmemo/10158921#10158921 for a TEdit
放置在内部的组件TFrame
的后代阶级。
如果不满足条件,我想取消粘贴操作。
有没有办法在帧级别做到这一点? (我的意思是,没有声明TEdit
的后裔)
有没有办法在帧级别做到这一点? (我的意思是,没有声明TEdit
的后裔)
WM_PASTE
被直接发送到TEdit
窗口, 的TFrame
永远不会看到它,所以你必须子类化TEdit
直接拦截消息。您可以:
-
有TFrame
分配一个处理程序到TEdit
's WindowProc
财产。如果您只有几个,这是一个简单的方法TEdit
s到子类,但越多它变得越复杂TEdit
你想要子类化:
type
TMyFrame = class(TFrame)
Edit1: TEdit;
...
procedure FrameCreate(Sender: TObject);
...
private
PrevWndProc: TWndMethod;
procedure EditWndProc(var Message: TMessage);
...
end;
procedure TMyFrame.FrameCreate(Sender: TObject);
begin
PrevWndProc := Edit1.WindowProc;
Edit1.WindowProc := EditWndProc;
...
end;
procedure TMyFrame.EditWndProc(var Message: TMessage);
begin
if Message.Msg = WM_PASTE then
begin
if SomeCondition then
Exit;
end;
PrevWndProc(Message);
end;
编写并安装一个派生自的新组件TEdit
,类似于TMemo你提出的例子 https://stackoverflow.com/a/10158921/65863.
-
定义一个本地的插入器类TFrame
的单位,上面TFrame
类声明,它将拦截WM_PASTE
for every TEdit
在框架上:
type
TEdit = class(Vcl.StdCtrls.TEdit)
procedure WMPaste(var Message: TMessage); message WM_PASTE;
end;
TMyFrame = class(TFrame)
Edit1: TEdit;
Edit2: TEdit;
...
end;
procedure TEdit.WMPaste(var Message: TMessage);
begin
if not SomeCondition then
inherited;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)