如何在將文本粘貼到TMemo之前捕捉粘貼命令並更改剪貼板文本,但粘貼後,剪貼板中的文本必須與更改前相同?如何攔截(檢測)粘貼命令到TMemo中?
例如,剪貼板上有'Simple Question'文本,TMemo中的文本是'СимплeQуeстиoн',之後剪貼板中的文本就像在更改'簡單問題'之前一樣。
如何在將文本粘貼到TMemo之前捕捉粘貼命令並更改剪貼板文本,但粘貼後,剪貼板中的文本必須與更改前相同?如何攔截(檢測)粘貼命令到TMemo中?
例如,剪貼板上有'Simple Question'文本,TMemo中的文本是'СимплeQуeстиoн',之後剪貼板中的文本就像在更改'簡單問題'之前一樣。
派生出新的控制從「TMemo」下降攔截WM_PASTE
消息:
type
TPastelessMemo = class(TMemo)
protected
procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
end;
uses
clipbrd;
procedure TPastelessMemo.WMPaste(var Message: TWMPaste);
var
SaveClipboard: string;
begin
SaveClipboard := Clipboard.AsText;
Clipboard.AsText := 'Simple Question';
inherited;
Clipboard.AsText := SaveClipboard;
end;
如果你想禁止任何粘貼操作可言,空WMPaste處理程序。
這是Sertac的出色答卷,這是覆蓋控制的WndProc一種替代方案:
// For detecting WM_PASTE messages on the control
OriginalMemoWindowProc: TWndMethod;
procedure NewMemoWindowProc(var Message: TMessage);
//...
// In the form's OnCreate procedure:
// Hijack the control's WindowProc in order to detect WM_PASTE messages
OriginalMemoWindowProc := myMemo.WindowProc;
myMemo.WindowProc := NewMemoWindowProc;
//...
procedure TfrmMyForm.NewMemoWindowProc(var Message: TMessage);
var
bProcessMessage: Boolean;
begin
bProcessMessage := True;
if (Message.Msg = WM_PASTE) then
begin
// Data pasted into the memo!
if (SomeCondition) then
bProcessMessage := False; // Do not process this message any further!
end;
if (bProcessMessage) then
begin
// Ensure all (valid) messages are handled!
OriginalMemoWindowProc(Message);
end;
end;
感謝@Ken,我誤解了問題。 – 2012-04-15 01:56:31
:)我認爲你已經釘了它。 +1,並刪除我的評論。 – 2012-04-15 02:03:24