2012-04-15 10 views
7

Jak złapać polecenie Wklej i zmienić tekst schowka przed wklejeniem tego tekstu do pliku TMemo, ale po wklejeniu tekst w schowku musi być taki sam jak przed zmianą?Jak przechwycić (wykryć) polecenie Wklej do TMemo?

Przykład, Schowek ma tekst "Proste pytanie", tekst w TMemo to "Симплe Qуестиoн", a po tym tekst w Schowku jest jak przed zmianą "Proste pytanie".

Odpowiedz

13

Wyprowadź nową kontrolę, która wywodzi się od „TMemo” przechwycić wiadomość 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; 

Jeśli chcesz zabronić jakiejkolwiek operacji wklejania w ogóle, pusty program obsługi WMPaste.

+0

Dzięki @Ken, ja misread pytanie. –

+0

:) Myślę, że go przybiłeś. +1 i usuwanie moich komentarzy. –

3

Jest doskonałą alternatywą dla odpowiedź Sertac, który ma zastąpić WndProc kontrolki:

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