|
Вопрос # 1 129/ вопрос решён / |
|
Приветствую, уважаемые эксперты!
Как отследить задержку нажатия клавиши? Тоесть, узнать сколько секунд(миллисекунд) её держали.
Спасибо
 |
Вопрос задал: Crazy_Theman (статус: Посетитель)
Вопрос отправлен: 22 ноября 2007, 01:47
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: min@y™
Вот написал тебе примерчик, буквально только что. Проверил, работает!
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs;
-
- type
- TForm1 = class(TForm)
- procedure FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure FormKeyUp(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- private
- { Private declarations }
- public
- FBegin: Cardinal;
- FPressed: Boolean;
- constructor Create(AOwner: TComponent); override;
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
- constructor TForm1.Create(AOwner: TComponent);
- begin
- inherited;
- KeyPreview:= True;
- FPressed:= False;
- end;
-
- procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- if not FPressed
- then begin
- FPressed:= True;
- FBegin:= GetTickCount();
- end;
- end;
-
- procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
-
- FPressed:= False;
- end;
-
- end.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 22 ноября 2007, 08:31
Оценка за ответ: 5
|
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, Crazy_Theman!
Добавляю к предыдущему ответу. Дело в том, что пользователь может нажать две или больше клавиш одновременно. тогда этот код будет измерять непонятно что. Поэтому лучше завести массив на и записывать время нажатия каждого символа и время отпускани.
Или в процедуре нажатия записывать нажатую клавишу, а в процедуре отпускания - очищать. а если при нажатии клавиши обнаружили, что уже нажата другая клавиша - принимать какие то действия (игнорировать например)
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 22 ноября 2007, 11:54
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 29 ноября 2007, 12:25; участников в обсуждении: 3.
|
Crazy_Theman (статус: Посетитель), 29 ноября 2007, 12:10 [#1]:
Всем спасибо, все понятно!
Но еще вопросик, а что делает inherited?
|
|
Вадим К (статус: Академик), 29 ноября 2007, 12:16 [#2]:
вызывает одноименный метод/свойство предка (точнее родителя) компонента. вызывать глубже нельзя, да и считается это плохим дизайном.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Feniks (статус: Бакалавр), 29 ноября 2007, 12:19 [#3]:
В примере min@y™ идет перекрытие метода Create. За это отвечает ключевое слово override в объявлении метода. Другими словами, мы перекрываем/перехватываем стандартный/родной метод класса и пишем свой. Но бывают случаи, когда необходимо все-таки сначало выполнить родной, а потом свои действия. Ключевое слово inherited в обработчике метода как раз это и делает. Т.е. в данной строке сначало идет родная обработка метода Create, а после этого слова уже идут наши действия.
Теперь понятно ?
|
|
Crazy_Theman (статус: Посетитель), 29 ноября 2007, 12:25 [#4]:
Теперь да) Спс еще раз!
|
31 января 2011, 19:30: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|