Программирование на ИБ8

пользователь
Регистрация: 03.09.2012

Существует ли в ИБ8 какая-нибудь стандартная функция, которая не останавливая работы программы (не останавливая вычислений в алгоритме), позволяет узнать нажимались ли какие-нибудь кнопки пользователем на клавиатуре (обработать события от клавиатуры)

модератор
Регистрация: 06.09.2007

В бланках можно обрабатывать клавиши Fx в сочетаниях с Ctrl, Shift, Alt.
При нажатии соответствующей комбинации клавиш происходит вызов библиотечной функции.
См. в редакторе бланков/контекстное меню/"События бланка".

пользователь
Регистрация: 03.09.2012

Это, да. Но меня интересовало другое (возможно мною некорректно был поставлен вопрос).
Интересно, все-таки можно ли обработать состояние (события) клавиатуры в любом расчете (типовая операция, бланк).
Например, крутим "бесконечный" цикл (ЦИКЛ ПОКА (ДА) ..... КОНЕЦ_ЦИКЛА). В цикле что-то делаем (неважно, например читаем базу данных много раз без перерыва). В конце концов нам это надоело и решено прекратить вычисления. Обычно в такой ситуации в цикле "опрашивается" клавиатура на предмет "были ли нажатия" и если нажатия были, то возвращается логическое "ДА" и читается буфер клавиатуры (в виде строки, что в строку не вошло отбрасывается, а буфер клавиатуры очищается), а если нажатий не было, то возвращается логическое "НЕТ". И все рады.
Меня интересует в ИБ8, что-то подобное есть.
Буду несказанно рад "если вдруг случайно появится"!

модератор
Регистрация: 06.09.2007

В Windows сообщения о нажатии и отпускании клавиш получаются в цикле обработки сообщений.
Причем клавиатурные сообщения посылаются только окну, которое имеет т.н. фокус ввода.
В ИБ таким окном может быть бланк, диалог типовой операции, графа ввода, кнопка и т.д. и т.п.
Ловить все подряд для всевозможных окон - плохая затея.

Задача отлова определенной клавиши или комбинации вне зависимости от фокуса ввода решается установкой внутри программного (в пределах процесса) хука клавиатуры.
Обычно так ловится какая-то конкретная клавища: Escape или Ctrl+Break.

Для случая прерывания вычислений можно представить пару функций:
первая устанавливает клавиатурный хук и сбрасывает признак остановки,
вторая проверяет признак остановки.

Пример:

УСТ_ПРИЗНАК_ОСТАНОВКИ(ДА) // установили хук, сбросили признак
ЦИКЛ ПОКА(ДА)
//...
ЕСЛИ ПРОВЕРИТЬ_ПРИЗНАК_ОСТАНОВКИ ТО
// обрабатываем отмену...
КОНЕЦ_ЕСЛИ
//...
КОНЕЦ_ЦИКЛА
УСТ_ПРИЗНАК_ОСТАНОВКИ(НЕТ) // убрали хук, больше не нужен

Так Вам это представлялось?

дилер
Регистрация: 29.05.2013

Очень было бы неплохо, если бы это на как-то уровне платформы решалось.
В SQL_ЗАПРОС, например, проверку упрятать. Если возможно замедление работы - сделать эту проверку опциональной, как "Автопересчет отчетов ", например.

пользователь
Регистрация: 03.09.2012

Да! Большое спасибо!
Но, если не трудно, то подскажите пожалуйста, на нажатие какой клавиши на клавиатуре срабатывает приведенный Вами фрагмент кода.

пользователь
Регистрация: 03.09.2012

И извините, еще один вопрос.
В самой платформе ИБ8 этих "волшебных" функций (УСТ_ПРИЗНАК_ОСТАНОВКИ и ПРОВЕРИТЬ_ПРИЗНАК_ОСТАНОВКИ), я так понимаю нет?
Или я все-таки неправ, и функции существуют! Тогда подскажите, какую библиотеку необходимо подключить, чтобы они заработали?

модератор
Регистрация: 06.09.2007

я так понимаю нет?

А я так понимаю, что обсуждались Ваши хотелки...

Конечно, функций пока нет и никакой конкретной клавиши - тоже.
Я только пытался уточнить задачу, но даже тут возникло недопонимание...

пользователь
Регистрация: 03.09.2012

Не ставил перед собой задачи кого-то огорчить.
Но вопрос реально стоит на повестке дня (у меня). Просто устал для остановки вычислений "посылать" в общую папку события с другого компьютера. Реально хотелось получить
простое, но эффективное средство по решению данной проблемы средствами платформы ИБ8.
Задача у меня простая одни работники вносят в общий файл запросы, а "старший" должен в реальном
времени видеть эти запросы и их обслуживать для дальнейшей работы сотрудников. Пока задача решается так, утром старший запускает "динаму" (процедуру обработки запросов) и она крутится до конца дня. Когда нужно остановить "динаму", с любого другого рабочего места посылается "событие" в общую папку, и "динама" видя событие останавливается. Все хорошо, но общем как одевать брюки через голову. Хотелось останавливать "динаму" произвольно (в любое время) с рабочего места "старшего".
Второй вопрос родился от слабого знания платформы (или собственной поспешности).

пользователь
Регистрация: 03.09.2012

Поздравляю всех с наступающим годом синей лошади (Новым 2014 года)!
Надеюсь на взаимность!
С уважением, Зайцев Максим Викторович!