2012-04-15 7 views
7

Wie fangen Sie den Befehl Einfügen und ändern Sie den Text der Zwischenablage, bevor der Text in ein TMemo eingefügt wird, aber nach dem Einfügen muss der Text in der Zwischenablage wie vor der Änderung sein?Wie wird ein Einfügebefehl in ein TMemo abgefangen (erkannt)?

Beispiel, Zwischenablage haben Text "Einfache Frage", Text, der im TMemo gehen ist "Симпле Qуесtiοn", und danach der Text in der Zwischenablage ist wie vor dem Ändern, "Einfache Frage".

Antwort

13

Leiten Sie eine neue Steuerung, die die WM_PASTE Nachricht abzufangen von ‚TMemo‘ absteigt:

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; 

Wenn Sie überhaupt einen Einfügevorgang verbieten möchte, die WMPaste Handler leer.

+0

Dank @Ken ich die Frage falsch verstanden. –

+0

:) Ich denke du hast es geschafft. +1, und entfernen Sie meine Kommentare. –

3

Dies ist eine Alternative zu Sertac des ausgezeichneten Antwort, die die WndProc der Kontrolle außer Kraft zu setzen ist:

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