9

貼り付けコマンドをキャッチして、テキストをに貼り付ける前にクリップボードのテキストを変更するにはどうすれTMemoばよいですか。ただし、貼り付け後、クリップボードのテキストは変更前と同じである必要がありますか?

たとえば、クリップボードにはテキストが'Simple Question'あり、テキストはTMemois'Симплe Qуeстиoн'にあり、その後クリップボードのテキストは変更前のようになります'Simple Question'

4

2 に答える 2

16

'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ハンドラーを空にします。

于 2012-04-15T01:44:10.120 に答える
6

これは、コントロールの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;
于 2015-07-17T15:15:46.577 に答える