Autor |
Beitrag |
Andidreas
      
Beiträge: 114
Windows XP Pro
BDS 2006
|
Verfasst: Mo 11.09.06 17:37
Wo bzw wie kann ich hier eine ProgressBar-Anzeige einbauen, damit der Einlesefortschritt einer Datei angezeigt wird?
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
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: 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.  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
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: 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
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: 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
|
|
|