2012-04-15 18 views
7

Cómo atrapar el comando Pegar y cambiar el texto del Portapapeles antes de pegar ese texto en un TMemo, pero, después de Pegar, el texto en el Portapapeles debe ser el mismo que antes de cambiar?Cómo interceptar (detectar) un comando Pegar en un TMemo?

Ejemplo, el Portapapeles tiene el texto 'Pregunta simple', el texto que entra en el TMemo es 'Симплe Qуeстиoн', y después de eso el texto en el Portapapeles es como antes de cambiar, 'Pregunta simple'.

Respuesta

13

derivar un nuevo control que desciende desde 'TMemo' para interceptar el mensaje 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; 

Si desea prohibir cualquier operación de pegado en absoluto, el controlador de vacío WMPaste.

+0

Gracias @Ken, leí mal la pregunta. –

+0

:) Creo que lo has conseguido. +1, y eliminar mis comentarios. –

3

Esta es una alternativa a la excelente respuesta de Sertac, que es para anular WndProc del control:

// 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; 
Cuestiones relacionadas