O indicador de progresso — um dos elementos mais ilustrativos da interface: ele mostra instantaneamente quanto trabalho já foi feito e quanto resta até a conclusão do processo. Neste artigo, veremos como adicionar esse indicador tanto à interface de um aplicativo Delphi quanto aos relatórios — com a ajuda dos novos componentes TfrProgressBar e TfrxProgressBar.
Usuários de FastReport VCL Ultimate têm disponíveis componentes adicionais de interface visual no âmbito dos conjuntos FastEditors VCL e FastGrid VCL. Agora esses conjuntos foram ampliados com um novo editor útil — o TfrProgressBar, e os relatórios — com o componente TfrxProgressBar. Além disso, o componente de relatórios está disponível não apenas para os proprietários do Ultimate, mas para todos que têm acesso ao componente principal de relatórios — o TfrxReport.
A seguir, examinaremos em detalhe as propriedades e os recursos dos novos componentes e, em seguida, os mostraremos em ação: no exemplo de um projeto de demonstração com dados realistas, que acompanha o FastReport VCL Ultimate.
O componente ProgressBar está disponível na IDE, na paleta FastEditors VCL, e destina-se à exibição de valores numéricos no formato de indicador de progresso. O componente:
Examinemos as principais propriedades que distinguem este componente de progresso dos outros editores do conjunto FastEditors VCL.
Todas essas propriedades permitem ajustar com flexibilidade o estilo visual da exibição da escala de progresso e, se necessário, usar vários intervalos de valores e marcadores diferentes:
Cada valor de limite da coleção Properties.Thresholds tem as seguintes propriedades:
Um conjunto semelhante de propriedades é oferecido pelo componente especial TfrxProgressBar, disponível nos relatórios. Para incorporá-lo ao seu relatório:
1. coloque no formulário o componente não visual TfrxProgressBarObject — ele adicionará automaticamente os módulos necessários ao seu projeto;
2. abra o designer de relatórios usando o componente TfrxReport;
3. selecione o componente de progresso no painel de componentes e coloque-o na página do relatório.
Em comparação com o componente de interface, o componente de relatório tem uma série de particularidades:
O componente de exibição de progresso é conveniente para usar em aplicativos em que é preciso visualizar valores ao longo do tempo em comparação com valores limite e de limite: em sistemas de controle de processos, para acompanhamento de KPIs ou para controle do grau de ocupação do armazém.
Para demonstrar os recursos do ProgressBar, escolhemos a metalurgia. É nela que os valores de limite de temperatura e a variabilidade do processo tecnológico de fusão são importantes, e as amostras de dados servem bem para impressão. Em outras palavras, aqui há tudo aquilo em que o ProgressBar é bom.
Primeiro, escreveremos um pequeno código auxiliar que imita as oscilações dos sensores de temperatura em várias zonas do forno de fusão: zona de carregamento, zona de fusão, zona de superaquecimento, zona de descarga e revestimento. Em cada zona, a temperatura oscila aleatoriamente em torno dos valores nominais ao longo das seguintes fases do processo: aquecimento, fusão, superaquecimento, correção. Naturalmente, este é um esquema muito simplificado, que não corresponde ao processo real, mas para demonstrar os recursos do componente essa simulação é perfeita.
O código-fonte da simulação pode ser encontrado no projeto de demonstração do FastGrid, nos módulos frFurnaceZones e frFurnaceSimulator, e o código principal de trabalho com o componente — no módulo ProgressBarDemo.
O trabalho principal neste projeto acontece nos manipuladores de eventos OnShow e UpdateUI.
Em OnShow, um conjunto de dados é criado com base no componente padrão TClientDataSet, e a vinculação desses dados ao FastGrid é implementada. Naturalmente, o FastGrid sabe trabalhar com dados diretamente, sem intermediário na forma de DataSet, mas neste projeto queríamos mostrar as possibilidades de impressão de dados formatados com o ProgressBar, tanto diretamente da fonte quanto por meio do FastGrid. E para isso, um armazenamento de dados universal na forma de TClientDataSet ou de outro componente semelhante é mais adequado.
Em seguida, no manipulador OnShow, são configuradas as propriedades da coluna FastGrid responsável pela exibição do progresso, bem como as propriedades dos componentes TfrProgressBar individuais localizados no diagrama do forno de fusão:
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;
Para saber mais sobre o trabalho com o componente FastGrid, você pode ler o artigo «Visão detalhada dos recursos da biblioteca FastGrid».
No manipulador do evento UpdateUI, os valores no conjunto de dados e nos componentes individuais são atualizados por temporizador:
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;
A configuração do componente de relatório e sua vinculação aos dados são feitas no designer de relatórios da seguinte forma:
Como resultado, obtemos um pequeno aplicativo que demonstra claramente as fases de aquecimento e fusão no forno:
E, a qualquer momento, é possível obter uma amostra dos dados de temperatura na forma de relatório:
Os componentes TfrProgressBar e TfrxProgressBar — ferramentas práticas que permitem adicionar indicação visual de progresso não apenas à interface do usuário do seu aplicativo, mas também aos relatórios. A vinculação aos dados, a incorporação em células da grade, as configurações flexíveis de estilos de escala e texto — tudo isso ajuda a apresentar a informação de forma fácil, rápida e agradável de perceber.
Se entre as suas tarefas estão o monitoramento de processos tecnológicos, painéis de KPI ou relatórios sobre o andamento de tarefas — baixe a versão mais recente do FastReport VCL Ultimate, abra o projeto de demonstração do FastGrid e experimente o novo indicador de progresso nos seus próprios dados.