Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - ProgressBar
Andidreas - Mo 11.09.06 17:37
Titel: ProgressBar
Wo bzw wie kann ich hier eine ProgressBar-Anzeige einbauen, damit der Einlesefortschritt einer Datei angezeigt wird?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| procedure TForm2.Funktionen(Dat: string); var t : Textfile; i : integer; Temp, Test, s : String; begin i:=0; Assignfile(t, Dat); reset(t); while not eof(t) do begin readln(t, s); in_Liste(i,s); inc(i); end; HilfPtr1 := StartZ; while (HilfPtr1 <> nil) do begin HilfPtr1 := HilfPtr1.Ptr; if HilfPtr1 <> nil then begin Temp := HilfPtr1.Str; if AnsiContainsText(Temp, '"classname" "func_mover"') then Test := HilfPtr1.Str; if (Test = '"classname" "func_mover"') AND (AnsiContainsText(Temp, '"name"')) then begin Delete(Temp, 1, 8); Delete(Temp, Pos('"', Temp), 1); cmb_func_mover.Items.Add(Temp); Test := ''; end; if AnsiContainsText(Temp, '"classname" "light"') then Test := HilfPtr1.Str; if (Test = '"classname" "light"') AND (AnsiContainsText(Temp, '"name"')) then begin Delete(Temp, 1, 8); Delete(Temp, Pos('"', Temp), 1); cmb_func_Light.Items.Add(Temp); Test := ''; end; end; end; |
Calculon - Mo 11.09.06 23:32
Also, mit einer ProgressBar-Anzeige habe ich noch nie gearbeitet. Aber wenn du dir den Fortschritt anzeigen lassen willst, kannst du in deine "while not eof"-Schleife einen "Application.ProcessMessages"-Befehl einbauen. Diese Tatsache verdeutlicht einen Nachteil der ereignisorientierten Programmierung. Das Betriebssystem kann so schnell, wie die Schleifen durchlaufen werden, die Änderungen nicht abarbeiten. Die Methode Application.ProcessMessages erzwingt, dass alle Meldungen abgearbeitet werden. :gruebel: Dies muss aber nicht für ProgressBar gelten! Wie gesagt: Damit habe ich noch nie gearbeitet.
Zurück zum Thema:
Du kannst beispielsweise den Wert von i oben in deiner Form anzeigen lassen. Dazu musst du lediglich innerhalb deiner Schleife (ich würde es gegen Ende einfügen), folgendes einfügen:
Delphi-Quelltext
1: 2:
| form1.Caption := 'Lese gerade Zeile: '+inttostr(i); Application.ProcessMessages; |
Ich schätze, mit der ProgressBar-Anzeige dürfte es ähnlich laufen. Du musst dir nur ausrechnen, wie weit deine Schleife fortgeschritten ist und überträgst es auf die Anzeige oder gibst es irgendwo in Prozent aus.
Gruß
Sinspin - Di 12.09.06 00:17
progressBar existiert als fertige komponente.
leg dir einfach einen auf dein formular.
dann legst du noch den wert Max der komponente fest. beispielsweise die größe der datei die du ließt und fragst dann innerhalb der schleife die aktuelle position des dateizeigers ab und übergibst sie an den wert Position deines progressBars. und rufst Application.ProcessMessages; auf da sonst die anzeige erst erfolgt wenn deine procedure/function verlassen wird und alle gesammelten nachrichten verarbeitet werden die bisher liegengeblieben sind.
aber beachte das du Application.ProcessMessages; nicht zu offt aufrufst da sonst dein programm extrem langsam wird.
Lannes - Di 12.09.06 07:50
Hallo,
bei der Fortschrittsanzeige durch eine ProgressBar ist der Aufruf von Application.ProcessMessages nicht erforderlich, sie wird automatische aktualisiert.
Eine unvollständige Übersicht
Application.ProcessMessages erforderlich bei Fortschrittsanzeigen durch:
TLabel
TPanel
TRichEdit
TImage
automatische Aktualisierung:
TProgressbar
TGauge
TForm.Caption
TMemo
TStaticText
TStatusbar
Calculon - Di 12.09.06 11:56
Stimmt! TForm.Caption besitzt tatsächlich eine automatische Aktualisierung! Habe es gerade ausprobiert. Da hatte ich doch all' die Jahre eine Bremse in meinen Programmen! Danke für den Hinweis!
Gruß
Reinhard Kern - Sa 16.09.06 01:31
Titel: Ergänzung zu ProcessMessages
Hallo,
stimmt dass TProgressBar ohne weiteres Zutun live upgedatet wird, TStatusBar ebenso, wenn ich aber eine ProgressBar in der StatusBar verwende, muss ich einmal zusätzlich Application.ProcessMessages aufrufen, damit das ganze richtig aussieht: StatusBar wird zwar Parent von ProgressBar, erfährt aber nichts davon und zeichnet sich nicht neu.
Ich habe daher einem generell verwendbaren Progress-Objekt die Methode IntoStatusBar zugefügt und rufe dort einmal ProcessMessages auf, dann sieht das perfekt so aus, wie man sich das vorstellt.
Gruss Reinhard
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!