Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка функции в OnKeyUp 
V
    Опции темы
Keeper89
Дата 14.11.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Доброго времени суток!

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

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

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

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


--------------------
PM MAIL WWW   Вверх
Akella
Дата 15.11.2009, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Может потоки спасут?

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

Ну как-то так.
PM MAIL   Вверх
Keeper89
Дата 15.11.2009, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



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

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

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

Это сообщение отредактировал(а) Keeper89 - 15.11.2009, 01:30


--------------------
PM MAIL WWW   Вверх
kami
Дата 15.11.2009, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



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

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

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


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

Хотя, может стоит подумать об изменении логики работы?
PM MAIL WWW   Вверх
Akella
Дата 15.11.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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

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

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

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

Вызывать поток в событии  OnKeyUp. А вот поток уже будет выполнять обработку. Таким образом приложение тормозить не будет.
PM MAIL   Вверх
Keeper89
Дата 15.11.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



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

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

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

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

===

Вопрос решился: буду использовать потоки. smile

Это сообщение отредактировал(а) Keeper89 - 20.11.2009, 02:00


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0656 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.