2017-02-14 11 views
5

은 내가 Ctrl + A가 (모두 선택)을 누를 때 TEdit.OnChange 이벤트가 트리거 관찰 한 윈도우 7Ctrl + A를 누르면 TEdit.OnChange가 트리거되는 이유는 무엇입니까?

에 델파이 XE7 VCL 애플리케이션을 실행하고 있습니다. 왜 그런가요?

TEdit의 텍스트가 실제로 변경 될 때만 OnChange 이벤트를 확실히 트리거해야합니다. 아쉽게도 OnBeforeChange 이벤트를 사용할 수 없으므로 변경 전후의 텍스트를 비교할 수 있습니다.

따라서 TEdit에 대한 신뢰할 수있는 OnChange 이벤트를 구현하는 방법은 무엇입니까?

+0

이 VCL 또는 FMX입니까? –

+0

OnChange가 실행되면 왜 중요합니까? 아마도 더 우아한 해결책이 있을까요? –

+0

@J ... - 아마도,하지만 실제로 변경 사항이 없을 때 OnChange가 트리거한다는 사실은 흥미 롭습니다 :) 이유 : OnChange에서도 Edit 상자에 사용자가 입력 한 파일에 고유 ID를 만들고 지정합니다 . 이벤트가 두 번 이상 트리거되면 둘 이상의 ID가 생성되며이를 원하지 않습니다. 하지만 당신이 말했듯이, 그 성가신 OnChange를 돌아 다니기 위해 디자인을 변경할 수 있습니다. – 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; 

는 전체 키 보드의 상태를 읽어 방지하기 위해, 당신은 데이비드 헤퍼 넌 무엇을 제안했다 수행 할 수 있습니다 : 당신이 할 수있는 일

은 Ctrl 키를 누르거나하지 않은 경우 확인입니다

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는 문제가되지 않지만 그렇게하기 쉽고 코드가 더 간단 할 때 효율적일 수 있습니다. –