2017-02-14 22 views
5

Ben Ctrl + A (tümünü seç) basıldığında TEdit.OnChange olay tetiklediğini gözlemledik Windows 7Ctrl + A basıldığında TEdit.OnChange neden tetikleniyor?

üzerinde Delphi XE7 VCL uygulaması çalıştırıyorum. Neden?

OnChange olayını yalnızca TEdit'daki metin gerçekten değiştiğinde güvenilir bir şekilde tetiklemem gerekiyor. Ne yazık ki, hiçbir OnBeforeChange olayı mevcut değil, böylece bir değişiklikten önce ve sonra metni karşılaştırabilirim.

TEdit için OnChange güvenilir bir olay nasıl uygulanır?

+0

Bu VCL veya FMX mi? –

+0

OnChange'ın patlaması neden önemlidir? Belki daha zarif bir çözüm var mı? –

+0

@J ... - Belki de gerçek değişimin olmadığı zamanlarda OnChange'ın tetiklediği gerçeği ilginçtir :) Nedeni: OnChange'da, Düzenleme kutusunda kullanıcı tarafından girilen dosyaya benzersiz bir kimlik bile oluşturabilir ve atayabilirim . Etkinlik birden fazla kez tetiklenirse, birden fazla kimlik oluşturulur ve bunu istemiyorum. Ama dediğin gibi, bu sinir bozucu OnChange'ın etrafında dolaşmak için tasarımı değiştirebilirim. OnChange'ı kullanarak – Ampere

cevap

3

Evet, kötü bir taban uygulaması değil:

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

Bu mesaj EN_CHANGE tetiklendiğini düğmedir 'A', şu anda ctrl durumuyla birlikte gelir dikkate almayan geliyor bastırdı.

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; 

bütün anahtar kurulu durumunu okuma kaçınmak için, David Heffernan tarafından ne önerildi yapabilirsiniz: Ne yapabilirsiniz

Ctrl basılı olup olmadığını kontrol etmektir

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' buradaki deyimdir. Tüm klavye durumunu okumak için israf. –

+0

Performansın bir sorun olacağı bir durum değil ama David –

+1

Hayır'a katılıyorum, perf bir sorun olmayacak, ancak bunu yapmak kolay ve kod daha basit olduğunda verimli olabilirsiniz. –

İlgili konular