Autor Beitrag
Andidreas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows XP Pro
BDS 2006
BeitragVerfasst: Mo 11.09.06 17:37 
Wo bzw wie kann ich hier eine ProgressBar-Anzeige einbauen, damit der Einlesefortschritt einer Datei angezeigt wird?

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: 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