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 <> nildo
  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, 18);
          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, 18);
          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