如何修改粘贴的文字?

How to modify the text being pasted?

我正在尝试修改粘贴到 TEdit 后代中的文本。

当用户粘贴一些文本时,我想用 'Y' 替换所有 'X' 个字符,而不修改实际的剪贴板文本内容。

我截获了 WM_PASTE 消息,但我不知道有任何“干净”的方法来更改粘贴到控件中的文本。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TMyEdit = class(Vcl.StdCtrls.TEdit)
  private
    procedure WMPaste(var Msg: TWMPaste); message WM_PASTE;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  Clipbrd;

procedure TMyEdit.WMPaste(var Msg: TWMPaste);
begin
  inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Edt : TMyEdit;
begin
  Edt := TMyEdit.Create(Self);
  Edt.Top := 10;
  Edt.Left := 10;
  Edt.Parent := Self;
end;

end.

我发现的唯一可行方法是临时替换剪贴板内容,但我正在寻找更清洁的解决方案(如果有的话...)。

procedure TMyEdit.WMPaste(var Msg: TWMPaste);
var
  PrevClipboardText : string;
begin
  if(IsClipboardFormatAvailable(CF_TEXT)) then
  begin
    PrevClipboardText := Clipboard.AsText;
    try
      Clipboard.AsText := StringReplace(Clipboard.AsText, 'X', 'Y', [rfReplaceAll]);
      inherited;
    finally
      Clipboard.AsText := PrevClipboardText;
    end;
  end else
  begin
    inherited;
  end;
end;

为什么不做显而易见的事情?

procedure TEdit.WMPaste(var Msg: TWMPaste);
begin
  SelText := F(Clipboard.AsText);
end;

其中 F 是您的 string-transforming 函数。