2017-02-14 5 views
5

私ははCtrl + Aは(すべて選択)を押すとTEdit.OnChangeイベントがトリガされていることを観察しているのWindows 7上Ctrl + Aを押したときにTEdit.OnChangeがトリガーされるのはなぜですか?

をデルファイXE7 VCLアプリケーションを実行しています。何故ですか?

TEditのテキストが実際に変更された場合にのみ、OnChangeイベントを確実にトリガーする必要があります。残念ながら、OnBeforeChangeイベントは利用できないため、変更前と変更後のテキストを比較できます。

TEditの信頼できるOnChangeイベントを実装するにはどうすればよいですか?

+0

これはVCLまたはFMXですか? –

+0

OnChangeが起動するとどうして問題になるのですか?おそらくより洗練されたソリューションがありますか? –

+0

@ J ... - おそらく、実際の変更がないときにOnChangeがトリガーするという事実は十分興味深いです:)理由:OnChangeでも、編集ボックスにユーザーが入力したファイルに一意のIDを作成して割り当てます。イベントが複数回トリガされた場合、複数のIDが生成され、そのIDは必要ありません。しかし、あなたが言ったように、私はその厄介なOnChangeを回るようにデザインを変更することができます。 OnChangeを使用して@NAZCAの – Ampere

答えて

3

はい、それは悪いベースの実装ではありません。

procedure TCustomEdit.CNCommand(var Message: TWMCommand); 
begin 
    if (Message.NotifyCode = EN_CHANGE) and not FCreating then Change; 
end; 

このメッセージはEN_CHANGEを発射されるボタンである「A」は、現在、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; 

全体のキーボードの状態を読んで回避するには、デビッド・Heffernanのによって提案されたものを行うことができます:

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; 
あなたは何ができるか

は、Ctrlキーを押しされているかどうか確認しています

+3

'GetKeyState(VK_CONTROL)<0'はここのイディオムです。キーボードの状態全体を読みとるには悲惨です。 –

+0

パフォーマンスが問題になることはありませんが、Davidと同意します –

+1

いいえ、perfは問題にはなりませんが、そうするのが簡単でコードが簡単な場合は効率的かもしれません。 –

関連する問題