How to intercept (detect) a Paste command into a TMemo?
Asked Answered
G

2

9

How to catch Paste command and change text of Clipboard before that text is pasted into a TMemo, but, after Paste, text in Clipboard must be same like before changing?

Example, Clipboard have text 'Simple Question', text that go in the TMemo is 'Симплe Qуeстиoн', and after that text in Clipboard is like before changing, 'Simple Question'.

Giorgio answered 15/4, 2012 at 1:26 Comment(0)
T
16

Derive a new control that descends from 'TMemo' to intercept the WM_PASTE message:

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;

If you would like to prohibit any paste operation at all, empty the WMPaste handler.

Talkfest answered 15/4, 2012 at 1:44 Comment(1)
:) I think you've nailed it. +1, and removing my comments.Regional
C
7

This is an alternative to Sertac's excellent answer, which is to override the control's 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;
Chapman answered 17/7, 2015 at 15:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.