Да, это не плохая основа реализации:
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;
Это VCL или FMX? –
Почему это имеет значение, если OnChange срабатывает? Возможно, есть более элегантное решение? –
@J ... - Возможно, но тот факт, что OnChange запускается, когда нет реальных изменений, достаточно интересен :) Причина: в OnChange даже я создаю и назначаю уникальный идентификатор файлу, введенному пользователем в поле «Редактировать» , Если событие срабатывает более одного раза, генерируется более одного идентификатора, и я не хочу этого. Но, как вы сказали, я могу изменить дизайн, чтобы обойти этот досадный OnChange. – Ampere