我TMemo在表格上有一個,我已經OnChange為它設定了一個事件。我希望當用戶按下備忘錄OnChange時不會觸發該事件。Ctrl X但Ctrl X只是剪切文本選擇,這肯定會觸發OnChange事件。我怎樣才能防止這種情況?
我試圖Ctrl X在KeyUp事件中檢測,如果用戶按下,Ctrl X我會取消系結備忘錄的OnChange事件并以編程方式再次剪切文本。但這不起作用,我也不知道如何以編程方式發送Ctrl X.
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = Ord('X')) and (Shift = [ssCtrl]) then
begin
Memo1.OnChange := nil;
// programmatically cut the text here, which I don't know how to do
Memo1.OnChange := Memo1Change;
end;
end;
uj5u.com熱心網友回復:
不要依賴鍵盤事件(例如,當您使用彈出選單剪切某些內容時,它們不會執行),而是依賴 Windows 訊息。
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure Memo1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FPrevMemoWindowProc : TWndMethod;
procedure MemoWindowProc(var AMessage: TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Clipbrd;
procedure TForm1.MemoWindowProc(var AMessage: TMessage);
begin
if(AMessage.Msg = WM_CUT) then
begin
if(Memo1.SelLength > 0) then
begin
Memo1.OnChange := nil;
try
Clipboard.AsText := Memo1.SelText;
Memo1.ClearSelection();
Exit;
finally
Memo1.OnChange := Memo1Change;
end;
end;
end;
FPrevMemoWindowProc(AMessage);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FPrevMemoWindowProc := Memo1.WindowProc;
Memo1.WindowProc := MemoWindowProc;
end;
procedure TForm1.Memo1Change(Sender: TObject);
begin
ShowMessage('Change');
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/418503.html
標籤:
上一篇:將圖片上傳到服務器時應用程式凍結
