tria писал(а):Ваять отдельный поток при проведении документа - это вообще не туда. Всего лишь нужно, чтобы пользователь дождался выполнения действий и видел прогресс выполнения
Что я тут могу сказать... Потоки - наверно, идеологически верное решение, но не всегда целесообразное. Они нужны, если:
1. Предполагается, что пользователь параллельно может запустить два или более расчета параллельно.
2. Предполагается, что пользователь будет активно взаимодействовать с интерфейсом (заполнять данные, загружать файл). Просто смотреть за прогрессом и (если что) нажимать на кнопочку "Остановить расчёт" - потоки не требуется.
3. Если удастся распараллелить вычисления.
В противном случае - поток - лишняя "головная боль" с синхронизацией (для того же ProgressBar) и, возможно, с отладкой. Что можно сделать? Создать отдельный модуль (возможно - со всей логикой расчётов), а в нём ввести логическую переменную IsCalculating (на время расчёта, очевидно, true). Во всех окнах, которые могут быть активны, в событие OnCloseQuery поставить проверку этой переменной. Должен ли "прогрессбар" (можно - вместе с кнопкой "остановить расчёт") быть модальным - это на любителя, плюс - основное окно будет автоматически "задизейблено", минус - всё остальное непредсказуемо.
tria писал(а):Пока что идея такая - перед началом действий для всех окон сделать enable=false, по окончанию - true.
Можно, но не строго обязательно. Некоторые элементы управления можно и оставить активными - другое дело, что пользователю будет неудобно, если между ProcessMessages будет около секунды расчётов. Опять же, можно на формы "повесить" таймер, в котором также будет проверяться IsCalculating (если да - всё лишнее отключается, нет - включается). Да, это требует небольших ресурсов, но не требуется перебирать окна вручную - окно отвечает само за себя.
Главное - не скупиться на ProcessMessages, иначе при расчёте при нажатии на форму система проверит и решит, что программа "зависла", предложит закрыть её.