我在Windows 7爲什麼按Ctrl + A時TEdit.OnChange會觸發?
運行德爾福XE7 VCL應用程序我已經觀察到,當Ctrl + A全(全選)按下TEdit.OnChange
事件觸發。這是爲什麼?
只有當TEdit
中的文字確實發生變化時,我才需要可靠地觸發OnChange
事件。不幸的是,沒有OnBeforeChange
事件可用,所以我可以比較更改前後的文本。
那麼,如何實現一個可靠的OnChange
事件TEdit
?
我在Windows 7爲什麼按Ctrl + A時TEdit.OnChange會觸發?
運行德爾福XE7 VCL應用程序我已經觀察到,當Ctrl + A全(全選)按下TEdit.OnChange
事件觸發。這是爲什麼?
只有當TEdit
中的文字確實發生變化時,我才需要可靠地觸發OnChange
事件。不幸的是,沒有OnBeforeChange
事件可用,所以我可以比較更改前後的文本。
那麼,如何實現一個可靠的OnChange
事件TEdit
?
是的,這不是一個壞的基本實現:
procedure TCustomEdit.CNCommand(var Message: TWMCommand);
begin
if (Message.NotifyCode = EN_CHANGE) and not FCreating then Change;
end;
此消息進來了「A」那就是在激發EN_CHANGE按鈕,當前與CTRL的狀態走到一起考慮不採取按下。
你可以做的是檢查,如果Ctrl鍵被按下:
procedure TForm44.edt1Change(Sender: TObject);
function IsCtrlPressed: Boolean;
var
State: TKeyboardState;
begin
GetKeyboardState(State);
Result := ((State[VK_CONTROL] and 128) <> 0);
end;
begin
if IsCtrlPresed then
Exit;
Caption := 'Ctrl is not pressed';
end;
爲了避免讀取整個鍵盤的狀態,你可以做什麼建議由大衛·赫弗南:
procedure TForm44.edt1Change(Sender: TObject);
function IsCtrlPresed: Boolean;
begin
Result := GetKeyState(VK_CONTROL) < 0;
end;
begin
if IsCtrlPresed then
Exit;
Caption := 'Ctrl is not pressed';
end;
'GetKeyState(VK_CONTROL)<0'就是這裏的成語。浪費閱讀整個鍵盤狀態。 –
它不是一個性能會成爲問題的情況,但我同意戴爾 –
不,perf不會是一個問題,但是當它很容易並且代碼更簡單時,您可能會高效。 –
這是VCL還是FMX? –
OnChange是如何觸發的?也許有更優雅的解決方案? –
@J ... - 也許,但OnChange觸發時,沒有實際變化的事實足夠有趣:)原因:在OnChange中,我甚至創建並分配一個唯一的ID給用戶在編輯框中輸入的文件。如果該事件觸發不止一次,則會生成多個ID並且我不希望這樣。但正如你所說,我可以改變設計,以繞過那個煩人的OnChange。 – Ampere