Программирование на ИБ8
18.12.2013 07:07
#
Существует ли в ИБ8 какая-нибудь стандартная функция, которая не останавливая работы программы (не останавливая вычислений в алгоритме), позволяет узнать нажимались ли какие-нибудь кнопки пользователем на клавиатуре (обработать события от клавиатуры)
- 22 просмотра
В бланках можно обрабатывать клавиши Fx в сочетаниях с Ctrl, Shift, Alt.
При нажатии соответствующей комбинации клавиш происходит вызов библиотечной функции.
См. в редакторе бланков/контекстное меню/"События бланка".
Это, да. Но меня интересовало другое (возможно мною некорректно был поставлен вопрос).
Интересно, все-таки можно ли обработать состояние (события) клавиатуры в любом расчете (типовая операция, бланк).
Например, крутим "бесконечный" цикл (ЦИКЛ ПОКА (ДА) ..... КОНЕЦ_ЦИКЛА). В цикле что-то делаем (неважно, например читаем базу данных много раз без перерыва). В конце концов нам это надоело и решено прекратить вычисления. Обычно в такой ситуации в цикле "опрашивается" клавиатура на предмет "были ли нажатия" и если нажатия были, то возвращается логическое "ДА" и читается буфер клавиатуры (в виде строки, что в строку не вошло отбрасывается, а буфер клавиатуры очищается), а если нажатий не было, то возвращается логическое "НЕТ". И все рады.
Меня интересует в ИБ8, что-то подобное есть.
Буду несказанно рад "если вдруг случайно появится"!
В Windows сообщения о нажатии и отпускании клавиш получаются в цикле обработки сообщений.
Причем клавиатурные сообщения посылаются только окну, которое имеет т.н. фокус ввода.
В ИБ таким окном может быть бланк, диалог типовой операции, графа ввода, кнопка и т.д. и т.п.
Ловить все подряд для всевозможных окон - плохая затея.
Задача отлова определенной клавиши или комбинации вне зависимости от фокуса ввода решается установкой внутри программного (в пределах процесса) хука клавиатуры.
Обычно так ловится какая-то конкретная клавища: Escape или Ctrl+Break.
Для случая прерывания вычислений можно представить пару функций:
первая устанавливает клавиатурный хук и сбрасывает признак остановки,
вторая проверяет признак остановки.
Пример:
УСТ_ПРИЗНАК_ОСТАНОВКИ(ДА) // установили хук, сбросили признак
ЦИКЛ ПОКА(ДА)
//...
ЕСЛИ ПРОВЕРИТЬ_ПРИЗНАК_ОСТАНОВКИ ТО
// обрабатываем отмену...
КОНЕЦ_ЕСЛИ
//...
КОНЕЦ_ЦИКЛА
УСТ_ПРИЗНАК_ОСТАНОВКИ(НЕТ) // убрали хук, больше не нужен
Так Вам это представлялось?
Очень было бы неплохо, если бы это на как-то уровне платформы решалось.
В SQL_ЗАПРОС, например, проверку упрятать. Если возможно замедление работы - сделать эту проверку опциональной, как "Автопересчет отчетов ", например.
Да! Большое спасибо!
Но, если не трудно, то подскажите пожалуйста, на нажатие какой клавиши на клавиатуре срабатывает приведенный Вами фрагмент кода.
И извините, еще один вопрос.
В самой платформе ИБ8 этих "волшебных" функций (УСТ_ПРИЗНАК_ОСТАНОВКИ и ПРОВЕРИТЬ_ПРИЗНАК_ОСТАНОВКИ), я так понимаю нет?
Или я все-таки неправ, и функции существуют! Тогда подскажите, какую библиотеку необходимо подключить, чтобы они заработали?
А я так понимаю, что обсуждались Ваши хотелки...
Конечно, функций пока нет и никакой конкретной клавиши - тоже.
Я только пытался уточнить задачу, но даже тут возникло недопонимание...
Не ставил перед собой задачи кого-то огорчить.
Но вопрос реально стоит на повестке дня (у меня). Просто устал для остановки вычислений "посылать" в общую папку события с другого компьютера. Реально хотелось получить
простое, но эффективное средство по решению данной проблемы средствами платформы ИБ8.
Задача у меня простая одни работники вносят в общий файл запросы, а "старший" должен в реальном
времени видеть эти запросы и их обслуживать для дальнейшей работы сотрудников. Пока задача решается так, утром старший запускает "динаму" (процедуру обработки запросов) и она крутится до конца дня. Когда нужно остановить "динаму", с любого другого рабочего места посылается "событие" в общую папку, и "динама" видя событие останавливается. Все хорошо, но общем как одевать брюки через голову. Хотелось останавливать "динаму" произвольно (в любое время) с рабочего места "старшего".
Второй вопрос родился от слабого знания платформы (или собственной поспешности).
Поздравляю всех с наступающим годом синей лошади (Новым 2014 года)!
Надеюсь на взаимность!
С уважением, Зайцев Максим Викторович!