2017-02-14 40 views
5

我在Windows 7爲什麼按Ctrl + A時TEdit.OnChange會觸發?

運行德爾福XE7 VCL應用程序我已經觀察到,當Ctrl + A全(全選)按下TEdit.OnChange事件觸發。這是爲什麼?

只有當TEdit中的文字確實發生變化時,我才需要可靠地觸發OnChange事件。不幸的是,沒有OnBeforeChange事件可用,所以我可以比較更改前後的文本。

那麼,如何實現一個可靠的OnChange事件TEdit

+0

這是VCL還是FMX? –

+0

OnChange是如何觸發的?也許有更優雅的解決方案? –

+0

@J ... - 也許,但OnChange觸發時,沒有實際變化的事實足夠有趣:)原因:在OnChange中,我甚至創建並分配一個唯一的ID給用戶在編輯框中輸入的文件。如果該事件觸發不止一次,則會生成多個ID並且我不希望這樣。但正如你所說,我可以改變設計,以繞過那個煩人的OnChange。 – Ampere

回答

3

是的,這不是一個壞的基本實現:

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; 
+3

'GetKeyState(VK_CONTROL)<0'就是這裏的成語。浪費閱讀整個鍵盤狀態。 –

+0

它不是一個性能會成爲問題的情況,但我同意戴爾 –

+1

不,perf不會是一個問題,但是當它很容易並且代碼更簡單時,您可能會高效。 –

相關問題