Индикатор прогресса — один из самых наглядных элементов интерфейса: он мгновенно показывает, сколько работы уже выполнено и сколько осталось до завершения процесса. В этой статье разберём, как добавить такой индикатор и в интерфейс Delphi-приложения, и в отчёты — с помощью новых компонентов TfrProgressBar и TfrxProgressBar.
Пользователям FastReport VCL Ultimate доступны дополнительные компоненты визуального интерфейса в рамках наборов FastEditors VCL и FastGrid VCL. Теперь эти наборы пополнились новым полезным редактором — TfrProgressBar, а отчёты — компонентом TfrxProgressBar. При этом компонент отчётов доступен не только владельцам Ultimate, но и всем, у кого есть доступ к основному компоненту отчётов — TfrxReport.
Далее подробно разберём свойства и возможности новых компонентов, а затем покажем их в деле: на примере демонстрационного проекта с реалистичными данными, который поставляется в составе FastReport VCL Ultimate.
Компонент ProgressBar доступен в IDE на палитре FastEditors VCL и предназначен для отображения числовых значений в формате показателя прогресса. Компонент:
Рассмотрим основные свойства, отличающие этот компонент прогресса от других редакторов набора FastEditors VCL.
Все эти свойства позволяют гибко настроить визуальный стиль отображения шкалы прогресса и при необходимости использовать несколько различных диапазонов значений и маркеров:
Каждое пороговое значение коллекции Properties.Thresholds имеет следующие свойства:
Похожим набором свойств обладает и специальный компонент TfrxProgressBar, доступный в отчётах. Чтобы встроить его в свой отчёт:
1. положите на форму невизуальный компонент TfrxProgressBarObject — он автоматически добавит необходимые модули в ваш проект;
2. откройте дизайнер отчёта с помощью компонента TfrxReport;
3. выберите компонент прогресса на панели компонентов и поместите его на страницу отчёта.
По сравнению с интерфейсным компонентом у компонента отчёта есть ряд особенностей:
Компонент отображения прогресса удобно использовать в приложениях, где требуется визуализировать значения в динамике в сравнении с граничными и пороговыми значениями: в системах управления технологическими процессами, для отслеживания KPI или для контроля заполненности склада.
Для демонстрации возможностей ProgressBar мы выбрали металлургию. В ней как раз важны пороговые значения температур и изменчивость технологического процесса плавки, а срезы данных хорошо подходят для печати. Иными словами, здесь есть всё, в чём ProgressBar хорош.
Для начала напишем небольшой вспомогательный код, который имитирует колебания датчиков температуры в различных зонах плавильной печи: зоне загрузки, зоне плавления, зоне перегрева, зоне выпуска и футеровке. В каждой зоне температура случайно колеблется вокруг номинальных значений на протяжении следующих стадий процесса: нагрев, плавление, перегрев, коррекция. Разумеется, это очень упрощённая схема, не соответствующая реальному процессу, но для демонстрации возможностей компонента такая симуляция отлично подходит.
Исходный код симуляции можно найти в демонстрационном проекте FastGrid в модулях frFurnaceZones и frFurnaceSimulator, а основной код работы с компонентом — в модуле ProgressBarDemo.
Основная работа в этом проекте происходит в обработчиках событий OnShow и UpdateUI.
В OnShow создаётся набор данных на основе стандартного компонента TClientDataSet и реализуется привязка этих данных к FastGrid. Разумеется, FastGrid умеет работать с данными и напрямую, без посредника в виде DataSet, но в этом проекте мы хотели показать возможности печати данных, отформатированных с помощью ProgressBar, как напрямую из источника, так и через FastGrid. А для этого лучше подойдёт универсальное хранилище данных в виде TClientDataSet или другого похожего компонента.
Далее в обработчике OnShow настраиваются свойства колонки FastGrid, которая отвечает за отображение прогресса, а также свойства отдельных компонентов TfrProgressBar, расположенных на схеме плавильной печи:
gFurnaceTableView1.Columns.RetrieveMissingColumns; LColumn := gFurnaceTableView1.Columns[0]; LColumn.Caption := 'Furnace Zone'; LColumn.Options.Editing := False; LColumn.PropertiesClass := TfrEditProperties; LColumn := gFurnaceTableView1.Columns[1]; LColumn.Caption := 'Temperature, C'; LColumn.Width := 300; LColumn.PropertiesClass := TfrProgressBarProperties; LProperties := TfrProgressBarProperties(LColumn.Properties); LProperties.CaptionType := frpbctPosition; LProperties.CaptionColor := clBlack; LProperties.ProgressBarStyle := frpbsGradient; LProperties.MaxValue := FConfig.ScaleMax; LProperties.MinValue := FConfig.ScaleMin; LProperties.MarkerLinesVisible := True; LProperties.CaptionType := frpbctPosition; LProperties.ProgressBeginColor := clWhite; LProperties.ProgressEndColor := FConfig.Thresholds[0].Color; LProperties.ProgressChunkBorder := False; LProperties.OnGetDisplayText := DoGetDisplayText; for J := 1 to Length(FConfig.Thresholds) - 1 do begin LThresholdItem := LProperties.Thresholds.Add; LThresholdItem.MarkerLineVisible := False; LThresholdItem.ProgressBarStyle := frpbsGradient; LThresholdItem.MarkerLineVisible := FConfig.Thresholds[J].Caption = 'Overheat'; LThresholdItem.MarkerLineSize := 2; LThresholdItem.Value := FConfig.Thresholds[J - 1].UpperBound; LThresholdItem.BeginColor := FConfig.Thresholds[J - 1].Color; LThresholdItem.EndColor := FConfig.Thresholds[J].Color; end; pbLoading.Properties.Assign(LProperties); pbLoading.Properties.Thresholds.Assign(LProperties.Thresholds); pbLoading.Properties.CaptionType := frpbctPercent; pbMelting.Properties.Assign(LProperties); pbMelting.Properties.Thresholds.Assign(LProperties.Thresholds); pbMelting.Properties.CaptionType := frpbctPercent; pbDischarge.Properties.Assign(LProperties); pbDischarge.Properties.Thresholds.Assign(LProperties.Thresholds); pbDischarge.Properties.Orientation := frpboVertical; pbDischarge.Properties.CaptionType := frpbctPercent; pbOverheat.Properties.Assign(LProperties); pbOverheat.Properties.Thresholds.Assign(LProperties.Thresholds); pbOverheat.Properties.Orientation := frpboVertical; pbOverheat.Properties.CaptionType := frpbctPercent; pbLining.Properties.Assign(LProperties); pbLining.Properties.Thresholds.Assign(LProperties.Thresholds); pbLining.Properties.Orientation := frpboVertical; pbLining.Properties.CaptionType := frpbctPercent;
Подробнее про работу с компонентом FastGrid вы можете прочитать в статье «Подробный обзор возможностей библиотеки FastGrid».
В обработчике события UpdateUI осуществляется обновление значений в наборе данных и отдельных компонентах по таймеру:
procedure TfrmProgressBar.UpdateUI; var I: Integer; LZoneRuntime: TFurnaceZoneRuntime; LControl: TfrProgressBar; LZoneName: string; begin dmData.cdsZones.DisableControls; try dmData.cdsZones.First; for I := 0 to Length(FProcess.FRuntime) - 1 do begin LZoneRuntime := FProcess.FRuntime[I]; dmData.cdsZones.Edit; dmData.cdsZones.FieldByName('Temperature').AsFloat := LZoneRuntime.CurrentTemp; dmData.cdsZones.Post; dmData.cdsZones.Next; LZoneName := LZoneRuntime.Zone.Name; if LZoneName = 'Loading zone' then LControl := pbLoading else if LZoneName = 'Melting zone' then LControl := pbMelting else if LZoneName = 'Overheat zone' then LControl := pbOverheat else if LZoneName = 'Discharge zone' then LControl := pbDischarge else LControl := pbLining; LControl.Value := LZoneRuntime.CurrentTemp; end; finally dmData.cdsZones.EnableControls; end; // General progress lOrders.Caption := ' Furnace Grid - Progress: ' + IntToStr(Round(FProcess.Progress01 * 100)) + ' % finished. ' + Format('Melting time: %s', [FormatDateTime('nn:ss', FProcess.TotalElapsed / SecsPerDay)]); end;
Настройка компонента отчёта и привязка его к данным осуществляется в дизайнере отчётов следующим образом:
В результате получаем небольшое приложение, которое наглядно демонстрирует стадии нагрева и плавления в печи:
При этом в любой момент времени можно получить срез температурных данных в форме отчёта:
Компоненты TfrProgressBar и TfrxProgressBar — удобные инструменты, которые позволяют добавить визуальную индикацию прогресса не только в пользовательский интерфейс вашего приложения, но и в отчёты. Привязка к данным, встраивание в ячейки сетки, гибкие настройки стилей шкал и текста — всё это помогает легко и быстро представить информацию в удобном для восприятия виде.
Если в ваших задачах встречаются мониторинг технологических процессов, KPI-дашборды или отчёты о ходе выполнения задач — скачайте последнюю версию FastReport VCL Ultimate, откройте демонстрационный проект FastGrid и попробуйте новый индикатор прогресса на своих данных.