| 
| 
 | Вопрос # 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |