貼り付けコマンドをキャッチして、テキストをに貼り付ける前にクリップボードのテキストを変更するにはどうすれTMemo
ばよいですか。ただし、貼り付け後、クリップボードのテキストは変更前と同じである必要がありますか?
たとえば、クリップボードにはテキストが'Simple Question'
あり、テキストはTMemo
is'Симплe Qуeстиoн'
にあり、その後クリップボードのテキストは変更前のようになります'Simple Question'
。
'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ハンドラーを空にします。
これは、コントロールのWndProcをオーバーライドするというSertacの優れた答えに代わるものです。
// 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;