Я бы предложил почитать темы. Длинные действия (я не говорю, что 300 мс - это долго, но похоже, что это может продолжаться дольше), как правило, замораживают графический интерфейс и приводят к прерывистым приложениям. Теперь вы можете добавить туда application.processmessages, чтобы поддерживать работу GUI, но он может легко отбросить ваш предполагаемый стиль процедурного кодирования.
Я со стороны прохода, который считает, Application.ProcessMessages должно быть забанено , если вы не программист VB, пытающийся использовать Delphi для имитации DoEvents и вы все еще не вышли из мышления VB.
Создать поток и выполнять свою работу в этом потоке. Если вы хотите обновить GUI, когда закончите, вызовите Synchronize, чтобы «безопасно» сделать это. Передача текущего состояния назад и вперед с потоком приводит к совершенно новому разговору, который, однако, является прыжком от использования элемента управления таймером.