Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 129

Раздел: Delphi » Прочее
/ вопрос решён /

Приветствую, уважаемые эксперты!
Как отследить задержку нажатия клавиши? Тоесть, узнать сколько секунд(миллисекунд) её держали.
Спасибо

Crazy_Theman Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Crazy_Theman (статус: Посетитель)
Вопрос отправлен: 22 ноября 2007, 01:47
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Вот написал тебе примерчик, буквально только что. Проверил, работает!

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. procedure FormKeyDown(Sender: TObject; var Key: Word;
  12. Shift: TShiftState);
  13. procedure FormKeyUp(Sender: TObject; var Key: Word;
  14. Shift: TShiftState);
  15. private
  16. { Private declarations }
  17. public
  18. FBegin: Cardinal;
  19. FPressed: Boolean;
  20. constructor Create(AOwner: TComponent); override;
  21. end;
  22.  
  23. var
  24. Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. constructor TForm1.Create(AOwner: TComponent);
  31. begin
  32. inherited;
  33. KeyPreview:= True;
  34. FPressed:= False;
  35. end;
  36.  
  37. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  38. Shift: TShiftState);
  39. begin
  40. if not FPressed
  41. then begin
  42. FPressed:= True;
  43. FBegin:= GetTickCount();
  44. end;
  45. end;
  46.  
  47. procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  48. Shift: TShiftState);
  49. begin
  50.  
  51. FPressed:= False;
  52. end;
  53.  
  54. end.


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 22 ноября 2007, 08:31
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, Crazy_Theman!
Добавляю к предыдущему ответу. Дело в том, что пользователь может нажать две или больше клавиш одновременно. тогда этот код будет измерять непонятно что. Поэтому лучше завести массив на и записывать время нажатия каждого символа и время отпускани.
Или в процедуре нажатия записывать нажатую клавишу, а в процедуре отпускания - очищать. а если при нажатии клавиши обнаружили, что уже нажата другая клавиша - принимать какие то действия (игнорировать например)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 22 ноября 2007, 11:54
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 29 ноября 2007, 12:25; участников в обсуждении: 3.
Crazy_Theman

Crazy_Theman (статус: Посетитель), 29 ноября 2007, 12:10 [#1]:

Всем спасибо, все понятно!
Но еще вопросик, а что делает inherited?
Вадим К

Вадим К (статус: Академик), 29 ноября 2007, 12:16 [#2]:

вызывает одноименный метод/свойство предка (точнее родителя) компонента. вызывать глубже нельзя, да и считается это плохим дизайном.
Галочка "подтверждения прочтения" - вселенское зло.
Feniks

Feniks (статус: Бакалавр), 29 ноября 2007, 12:19 [#3]:

В примере min@y™ идет перекрытие метода Create. За это отвечает ключевое слово override в объявлении метода. Другими словами, мы перекрываем/перехватываем стандартный/родной метод класса и пишем свой. Но бывают случаи, когда необходимо все-таки сначало выполнить родной, а потом свои действия. Ключевое слово inherited в обработчике метода как раз это и делает. Т.е. в данной строке сначало идет родная обработка метода Create, а после этого слова уже идут наши действия.
Теперь понятно ? ;-)
Crazy_Theman

Crazy_Theman (статус: Посетитель), 29 ноября 2007, 12:25 [#4]:

Теперь да) Спс еще раз!

31 января 2011, 19:30: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.03 сек.