2017-02-14 17 views
5

Я бегу приложение Delphi VCL XE7 на Windows 7.Почему срабатывает TEdit.OnChange при нажатии Ctrl + A?

Я заметил, что TEdit.OnChange событие срабатывает, когда Ctrl + A (выбрать все) нажата. Почему это?

Мне нужно надежно запускать событие OnChange только в том случае, если текст в TEdit действительно меняется. К сожалению, нет события OnBeforeChange, поэтому я могу сравнить текст до и после изменения.

Итак, как реализовать надежное событие OnChange для TEdit?

+0

Это VCL или FMX? –

+0

Почему это имеет значение, если OnChange срабатывает? Возможно, есть более элегантное решение? –

+0

@J ... - Возможно, но тот факт, что OnChange запускается, когда нет реальных изменений, достаточно интересен :) Причина: в OnChange даже я создаю и назначаю уникальный идентификатор файлу, введенному пользователем в поле «Редактировать» , Если событие срабатывает более одного раза, генерируется более одного идентификатора, и я не хочу этого. Но, как вы сказали, я могу изменить дизайн, чтобы обойти этот досадный OnChange. – Ampere

ответ

3

Да, это не плохая основа реализации:

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

Это сообщение приходит не принимая во внимание, что «А», то есть кнопка, которая стреляет в 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; 

Чтобы избежать чтения состояния всей клавиатуре, вы можете сделать то, что было предложено Дэвидом 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; 
+3

'GetKeyState (VK_CONTROL) <0' - это идиома здесь. Отвратительно читать все состояние клавиатуры. –

+0

Это не случай, когда производительность будет проблемой, но я согласен с Дэвидом –

+1

Нет, перфоманс не будет проблемой, но вы можете быть эффективны, когда это легко сделать, и код проще. –