2012-04-15 15 views
7

クリップボードのコマンドを貼り付けて、クリップボードのテキストをTMemoに貼り付ける前に変更しますが、貼り付け後にクリップボードのテキストを変更する前と同じにする必要がありますか?貼り付けコマンドをTMemoに傍受(検出)する方法は?

例:クリップボードにはテキスト 'Simple Question'があり、TMemoには「СимплeQуeстиoн」というテキストがあり、その後クリップボードのテキストは「Simple Question」のように変更されます。あなたはWMPasteハンドラ空、まったくペースト操作を禁止したい場合

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; 

答えて

13

WM_PASTEメッセージを傍受する「TMemoオブジェクト」から派生する新しいコントロールを導出します。

+0

おかげ@Ken、私は質問を読み違えます。 –

+0

:)私はあなたがそれを釘付けにしたと思います。 +1、私のコメントを削除します。 –

3

これは、コントロールの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; 
関連する問題