- Код: Выделить всё
procedure MySuperProc;
...
coord:=GetMouseCoord;
//тут выполнение продолжится только после того как пользователь укажет точку и нажмет lmb
...
Ничего умнее чем посадить внутрь GetMouseCoord свой цикл обработки событий не придумалось... там сидит конструкция вида
- Код: Выделить всё
while _условие_завершения_ do
begin
Application.HandleMessage;
end;
Все хорошо работает, пока пользователь не начинает запускать подобные выкрутасы рекурсивно - Т.е. нажимает кнопку в обработчике которой сидит MySuperProc, запускается GetMouseCoord со своим циклом, а этот подлец вместо указания точки нажимает кнопку второй раз (запретить повторное нажатие пока не отработало первое не предлагать, т.к. иногда это нужно пользователю).
Попробовал из обработчика кнопки запускать MySuperProc асинхронно, перед этим выставив _условие_завершения_ чтобы уже запущенный дополнительный цикл обработки сообщений успел завершиться - не получилось - Application.HandleMessage успевает запустить асинхронный вызов до выхода из цикла.
Помогает только "двойной" асинхронный запуск, т.е. асинхронно запускаю процедуру, которая асинхронно запускает MySuperProc. Жуткий костыль((
Как временно приостановить обработку асинхронных запусков для HandleMessage?
Как подобные вещи организуются по правильному?