Вопрос, поднятый пользователем на форуме, касается поиска аналога стандартного индикатора выполнения (ProgressGauge) в Delphi, который бы отображал активность цикла без привязки к конкретному прогрессу. В данном случае, речь идет о визуальном подтверждении работы программы, а не о точном измерении завершенных этапов.
Проблема
Пользователь столкнулся с необходимостью отображать, что программа все еще выполняет вычисления, но не может или не хочет использовать стандартный TProgressBar из-за отсутствия информации о точном прогрессе.
Решения
1. Использование TProgressBar в режиме "marquee"
Стандартный TProgressBar в Delphi поддерживает стиль pbstMarquee, который создает анимацию бегущей полосы, имитируя активность без указания процентов.
procedure TForm1.Button1Click(Sender: TObject);
begin
ProgressBar1.Style := pbstMarquee;
ProgressBar1.Visible := True;
// Долгий цикл
for I := 1 to 1000000 do
begin
Application.ProcessMessages; // Чтобы форма не зависала
// Вычисления...
end;
ProgressBar1.Visible := False;
end;
2. Альтернативные компоненты
TActivityIndicator (доступен в Delphi 10.4+) – анимированный индикатор, который вращается, пока активен.
TAdvCircularProgress (из пакета TMS VCL) – круговой индикатор с настраиваемой анимацией.
TNumberBox (если требуется отображение числового прогресса).
3. Самодельное решение: мигающий текст или индикатор
Пользователь предложил простой вариант – изменять видимость метки (TLabel) в цикле:
procedure TForm1.LongProcess;
var
I: Integer;
begin
for I := 1 to 1000000 do
begin
if I mod 1000 = 0 then
begin
Label1.Visible := not Label1.Visible; // Мигание
Application.ProcessMessages;
end;
// Вычисления...
end;
end;
4. Мониторинг активности потока
Для сложных многопоточных приложений можно использовать флаги активности:
var
IsRunning: Boolean = False;
procedure TForm1.StartProcess;
begin
IsRunning := True;
TThread.CreateAnonymousThread(
procedure
begin
while IsRunning do
begin
// Работа в фоне
TThread.Synchronize(nil,
procedure
begin
Label1.Caption := 'Running... ' + TimeToStr(Now);
end);
Sleep(1000);
end;
end).Start;
end;
procedure TForm1.StopProcess;
begin
IsRunning := False;
end;
Вывод
Выбор метода зависит от требований:
- Простота → TProgressBar в режиме pbstMarquee или мигающий TLabel.
- Гибкость → специализированные компоненты вроде TActivityIndicator.
- Многопоточность → флаги активности с обновлением UI.
Для случаев, подобных описанному в исходном сообщении (неожиданная остановка вычислений), рекомендуется также добавить логирование и проверку состояния потока.
Совет: Если программа зависает без уведомлений, используйте Application.ProcessMessages в длительных циклах или выносите вычисления в отдельный поток.
Примеры кода приведены для Delphi, но аналогичные подходы применимы и в Free Pascal.
Вопрос о реализации индикатора выполнения цикла в Delphi и Pascal без использования стандартного ProgressGauge, с акцентом на визуальное подтверждение активности программы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.