2012-04-15 10 views
7

Come catturare il comando Incolla e modificare il testo degli Appunti prima che il testo venga incollato in un TMemo, ma, dopo Incolla, il testo negli Appunti deve essere lo stesso come prima di cambiare?Come intercettare (rilevare) un comando Incolla in un TMemo?

Esempio, gli Appunti hanno il testo 'Domanda semplice', il testo che va nel TMemo è 'Симплe Qуeстиoн', e dopo che il testo negli Appunti è come prima di cambiare, 'Domanda semplice'.

risposta

13

derivare una nuova controllo che scende da 'TMemo' per intercettare il messaggio 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; 

Se volete vietare qualsiasi operazione di pasta a tutti, vuota il gestore WMPaste.

+0

Grazie @Ken, ho letto male la domanda. –

+0

:) Penso che tu l'abbia inchiodato. +1 e rimuovendo i miei commenti. –

3

Questa è un'alternativa alla risposta eccellente di Sertac, che è quello di ignorare WndProc del controllo:

// 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; 
Problemi correlati