Der Fortschrittsindikator — eines der anschaulichsten Elemente der Benutzeroberfläche: Er zeigt sofort an, wie viel Arbeit bereits erledigt ist und wie viel bis zum Abschluss des Prozesses verbleibt. In diesem Artikel untersuchen wir, wie sich ein solcher Indikator sowohl in die Oberfläche einer Delphi-Anwendung als auch in Berichte integrieren lässt — mithilfe der neuen Komponenten TfrProgressBar und TfrxProgressBar.
Benutzern von FastReport VCL Ultimate stehen zusätzliche visuelle Oberflächenkomponenten im Rahmen der Sets FastEditors VCL und FastGrid VCL. Nun wurden diese Sets um einen neuen nützlichen Editor erweitert — TfrProgressBar, und die Berichte — um die Komponente TfrxProgressBar. Dabei ist die Berichtskomponente nicht nur Inhabern von Ultimate verfügbar, sondern allen, die Zugriff auf die Hauptberichtskomponente haben — TfrxReport.
Im Folgenden betrachten wir im Detail die Eigenschaften und Möglichkeiten der neuen Komponenten und zeigen sie dann in Aktion: am Beispiel eines Demoprojekts mit realistischen Daten, das im Lieferumfang von FastReport VCL Ultimate enthalten ist.
Die ProgressBar-Komponente ist in der IDE auf der FastEditors-VCL-Palette verfügbar und dient zur Anzeige numerischer Werte im Format eines Fortschrittsindikators. Die Komponente:
Betrachten wir die wichtigsten Eigenschaften, die diese Fortschrittskomponente von den anderen Editoren des FastEditors-VCL-Sets unterscheiden.
Mit all diesen Eigenschaften lässt sich der visuelle Stil der Fortschrittsskala flexibel anpassen und bei Bedarf können mehrere verschiedene Wertebereiche und Marker verwendet werden:
Jeder Schwellenwert der Sammlung Properties.Thresholds besitzt die folgenden Eigenschaften:
Einen ähnlichen Satz von Eigenschaften bietet die spezielle Berichtskomponente TfrxProgressBar. Um sie in Ihren Bericht einzubetten:
1. platzieren Sie die nichtvisuelle Komponente TfrxProgressBarObject auf dem Formular — sie fügt Ihrem Projekt automatisch die erforderlichen Module hinzu;
2. öffnen Sie den Berichtsdesigner über die Komponente TfrxReport;
3. wählen Sie die Fortschrittskomponente auf der Komponentenpalette aus und platzieren Sie sie auf der Berichtsseite.
Im Vergleich zur Oberflächenkomponente weist die Berichtskomponente einige Besonderheiten auf:
Die Komponente zur Fortschrittsanzeige eignet sich gut für Anwendungen, in denen Werte im zeitlichen Verlauf im Vergleich zu Grenz- und Schwellenwerten visualisiert werden müssen: in Prozessleitsystemen, zur KPI-Verfolgung oder zur Überwachung der Lagerbelegung.
Zur Demonstration der Möglichkeiten der ProgressBar haben wir uns für die Metallurgie entschieden. Gerade in ihr sind die Schwellenwerte der Temperaturen und die Variabilität des Schmelzprozesses wichtig, und Datenabzüge eignen sich gut zum Drucken. Mit anderen Worten: Hier ist alles vorhanden, worin die ProgressBar gut ist.
Zunächst schreiben wir einen kleinen Hilfscode, der die Schwankungen der Temperatursensoren in verschiedenen Zonen des Schmelzofens simuliert: der Beschickungszone, der Schmelzzone, der Überhitzungszone, der Abstichzone und der Ausmauerung. In jeder Zone schwankt die Temperatur zufällig um die Nennwerte während der folgenden Prozessphasen: Aufheizen, Schmelzen, Überhitzen, Korrektur. Natürlich ist das ein stark vereinfachtes Schema, das dem realen Prozess nicht entspricht, aber zur Demonstration der Möglichkeiten der Komponente eignet sich diese Simulation hervorragend.
Den Quellcode der Simulation finden Sie im FastGrid-Demoprojekt in den Modulen frFurnaceZones und frFurnaceSimulator, den Hauptcode für die Arbeit mit der Komponente — im Modul ProgressBarDemo.
Die Hauptarbeit in diesem Projekt geschieht in den Ereignisbehandlern OnShow und UpdateUI.
In OnShow wird ein Dataset auf Basis der Standardkomponente TClientDataSet erstellt und die Bindung dieser Daten an FastGrid implementiert. FastGrid kann zwar auch direkt mit Daten arbeiten, ohne einen Vermittler in Form eines DataSet, aber in diesem Projekt wollten wir die Möglichkeiten des Druckens von mit der ProgressBar formatierten Daten zeigen, sowohl direkt aus der Quelle als auch über FastGrid. Und dafür eignet sich ein universaler Datenspeicher in Form von TClientDataSet oder einer ähnlichen Komponente am besten.
Anschließend werden im OnShow-Handler die Eigenschaften der FastGrid-Spalte konfiguriert, die für die Anzeige des Fortschritts verantwortlich ist, sowie die Eigenschaften der einzelnen TfrProgressBar-Komponenten auf dem Schema des Schmelzofens:
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;
Mehr zur Arbeit mit der FastGrid-Komponente erfahren Sie im Artikel «Detaillierter Überblick über die Möglichkeiten der FastGrid-Bibliothek».
Im UpdateUI-Ereignishandler werden die Werte im Dataset und in den einzelnen Komponenten per Timer aktualisiert:
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;
Die Konfiguration der Berichtskomponente und ihre Bindung an die Daten erfolgen im Berichtsdesigner wie folgt:
Das Ergebnis ist eine kleine Anwendung, die die Phasen des Aufheizens und Schmelzens im Ofen anschaulich demonstriert:
Zudem lässt sich jederzeit ein Datenabzug der Temperaturen in Form eines Berichts abrufen:
Die Komponenten TfrProgressBar und TfrxProgressBar — praktische Werkzeuge, mit denen sich eine visuelle Fortschrittsanzeige nicht nur in die Benutzeroberfläche Ihrer Anwendung, sondern auch in Berichte einfügen lässt. Die Datenbindung, die Einbettung in Tabellenzellen und die flexiblen Einstellungen für Skalen- und Textstile — all das hilft, Informationen einfach und schnell in einer leicht verständlichen Form darzustellen.
Wenn zu Ihren Aufgaben die Überwachung von Prozessabläufen, KPI-Dashboards oder Berichte über den Aufgabenfortschritt gehören — laden Sie die neueste Version von FastReport VCL Ultimate herunter, öffnen Sie das FastGrid-Demoprojekt und probieren Sie den neuen Fortschrittsindikator an Ihren eigenen Daten aus.