Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Обработка функции в OnKeyUp


Автор: Keeper89 14.11.2009, 22:07
Доброго времени суток!

В Edit'е выполняются некоторые операции при перемещении курсора в зависимости от его положения. Обрабатывается все в событии OnKeyUp. 

Проблема заключается в том, что при многократном нажатии клавиш (стрелок вправо-влево), приложение тормозит, т.к. соответственно запускает процедуру обработки в OnKeyUp по несколько раз.

Вопрос: как лучше определить"последнее" нажатие, после которого запускать обработку? Та же ситуация возникает при большом количестве щелчков по эдиту.

Заранее спасибо.

Автор: Akella 15.11.2009, 00:52
Может потоки спасут?

Добавлено через 2 минуты и 41 секунду
Можно попробовать делать паузу, ждать следующего нажатия.
Сработало событие OnKeyUp
Пауза........
Сработало событие OnKeyUp
Пауза
Пауза закончилась
Началась обработка, если нажатий больше не было.

Ну как-то так.

Автор: Keeper89 15.11.2009, 01:25
Цитата(Akella @  15.11.2009,  01:52 Найти цитируемый пост)
Может потоки спасут?

А при чем тут они?

Что если проверять в выполняемой процедуре состояние клавиш стрелок - например, через GetKeyState или т.п.?

Автор: kami 15.11.2009, 02:07
Цитата(Keeper89 @  15.11.2009,  01:25 Найти цитируемый пост)
 например, через GetKeyState

Имхо, Get[Async]KeyState не спасет - он просто будет выдавать "да, действительно, клавиша отжата", ибо так оно и будет.
Имхо, здесь нужно как-то так:
Код

1. Попали в OnKeyUp
2. Запомнили время (в поле формы или глобальную переменную)
3. Запустили таймер с каким-нибудь маленьким (относительно) интервалом
В таймере:
4. Проверили, если (текущее_время-время_пункта_2)>нужного_промежутка, то 
    begin
      дисаблим таймер
      вызываем_свою_процедуру
    end;


Таким образом, если клавиши будут нажиматься чаще, чем нужный_промежуток, то будет меняться время из п.2 и соответственно проверка всего хозяйства в таймере не даст выполниться своей_процедуре.

Хотя, может стоит подумать об изменении логики работы?

Автор: Akella 15.11.2009, 11:34
Цитата(Keeper89 @  15.11.2009,  01:25 Найти цитируемый пост)
Что если проверять в выполняемой процедуре состояние клавиш стрелок - например, через GetKeyState или т.п.?

Ну проверяй, а при чём здесь GetKeyState?

Добавлено через 59 секунд
Цитата(Keeper89 @  15.11.2009,  01:25 Найти цитируемый пост)
Цитата(Akella @  15.11.2009,  01:52 Найти цитируемый пост)
Может потоки спасут?

А при чем тут они?

Вызывать поток в событии  OnKeyUp. А вот поток уже будет выполнять обработку. Таким образом приложение тормозить не будет.

Автор: Keeper89 15.11.2009, 14:32
Цитата(kami @  15.11.2009,  03:07 Найти цитируемый пост)
Хотя, может стоит подумать об изменении логики работы? 

Я делаю что-то похожее на Code Insight при вводе текста в Edit или установке в него фокуса (щелчке мыши). Можно ли это сделать лучше чем у меня? smile

Добавлено @ 14:33
Цитата(kami @  15.11.2009,  03:07 Найти цитируемый пост)
Имхо, Get[Async]KeyState не спасет - он просто будет выдавать "да, действительно, клавиша отжата", ибо так оно и будет.

Я имею ввиду осуществлять проверку в запускаемой процедуре - если клавиша нажата пока она работает - выйти из процедуры.

===

Вопрос решился: буду использовать http://delphikingdom.ru/asp/answer.asp?IDAnswer=74138. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)