Delphi 7 - Почему VK_RETURN не работает для меня? - PullRequest
1 голос
/ 17 апреля 2011
procedure TfrmProgress.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
    if key = VK_RETURN then
    begin
        Self.Close;
    end;
end;

А потом я нажимаю Enter, и ничего не происходит ...

Ответы [ 4 ]

8 голосов
/ 17 апреля 2011

Я не могу сказать вам, в чем ваша проблема, исходя из этой информации, но я могу рассказать вам, как ее решить.

Создайте обработчик событий и присоедините его к Application.OnMessage.Он будет вызываться всякий раз, когда любое сообщение в очереди извлекается из очереди сообщений вашего приложения.Сообщения клавиатуры являются входящими сообщениями и, таким образом, помещаются в очередь, поэтому сообщение WM_KEYDOWN поступит в этот обработчик событий.

Реализуйте обработчик следующим образом:

procedure TMyForm.ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.Message=WM_KEYDOWN then
    Handled := False;
end;

Включите отладку DCU и затем установите точку останова налиния Handled := False.Запустите ваше приложение, выберите правку и нажмите ENTER.Код сломается, и теперь вы можете просмотреть, куда направлено сообщение WM_KEYDOWN.

После того, как обработчик события вернется, вы должны выполнить шаг, пока не найдете вызов DispatchMessage.Нажмите клавишу F7, чтобы войти в нее, и продолжайте следовать по следу, пока не узнаете, где он приземляется и почему он не приземляется в предполагаемом обработчике событий.

4 голосов
/ 17 апреля 2011

Фокус может быть в элементе управления редактированием, поэтому для того, чтобы форма заполучила ввод с клавиатуры, необходимо установить для свойства KeyPreview значение True. Ты это сделал?

1 голос
/ 17 апреля 2011

После того, как вы нажали Enter и форма не закрылась, закрывается ли она в конечном итоге после завершения обработки?То есть он закрывается с «эффектом задержки»?

Возможно, ваша форма не обрабатывает сообщения, а операция, для которой вы показываете прогресс, продолжается.

Одним из решений является периодический вызов Application.ProcessMessages в рамках вашей основной процедуры обработки.Однако не закрывайте форму в событии OnKeyDown.Вместо этого установите флаг, такой как «AbortRequest: = true», и проверьте этот флаг в своей процедуре обработки, и, если он установлен, выйдите оттуда и закройте форму.Это позволит вам выполнить необходимую очистку перед прерыванием.

Кроме того, включен ли spinedit и настроен ли он?Если вы поставили точку останова в событии, она сработала?

Другая возможность: VK_RETURN может использоваться другим элементом управления или компонентом в форме.Например, если у вас уже есть TAction в форме с сочетанием клавиш Enter, spinedit никогда не увидит этот ключ.Или у вас может быть TButton со свойством Default, установленным в True - тот же результат.

В общем, у нас, вероятно, недостаточно информации, чтобы знать наверняка.

0 голосов
/ 17 апреля 2011

Мне лично не нравится, что вы закрываете форму в обработчике событий KeyDown редактора.Я бы посоветовал вам сделать это в какой-то другой момент, по крайней мере, отложить этот вызов, отправив пользовательское сообщение в форму и вызвать метод Close в этом обработчике сообщений.Во всяком случае, такой код отлично работает на моей машине.Я только не знаю, что вы делаете, вызывая метод Progress.Я бы посоветовал вам поставить точку останова в этом обработчике событий и проверить, как работает программа.Если вы заинтересованы в подходе к отправке сообщений, просто дайте мне знать, и я опубликую код здесь.

...