![]() |
ProgressBar bei LoadFromFile in TListBox
Hallo,
ich lade aus einer Textdatei Daten in eine TListBox. Also nach Auswahl der Datei in einem Open Dialog ListBox1.Items.LoadFromFile(FileName); Funktioniert auch, aber da die txt über 1 MB groß ist, hängt er herum, bis alle Zeilen geladen sind. Deshalb möchte ich den Ladevorgang in einer ProgressBar darstellen. Wie machen?? Komme nicht dahinter.. Danke ! PS also Irgendwie mit Count, wenn eine neue Zeile drin ist..komme gerade nicht ganz dahinter |
Re: ProgressBar bei LoadFromFile in TListBox
Hi,
habe jetzt eine Funktion ZeilenZählen geschrieben, welche vorher die Zeilen der txt liest, also die Items ProgressBar1.max:=ZeilenZählen(FileName); ProgressBar1.position:=0; ListBox1.Items.LoadFromFile(FileName); ProgressBar1.position:=ListBox1.Items.count; Jetzt springt er aber erst am Ende! auf 100, dazwischen während des Ladens tut sich weiter nichts an der Progress Bar..müsste doch gehen :wall: |
Re: ProgressBar bei LoadFromFile in TListBox
Hi bodenheim,
ListBox1.Items.count gibt die dir die Anzahl der Listboxeinträge zurück und ist kein "Zaehler". Überhaupt ist deine Datei, wenn dein Code bei ProgressBar1.position:=ListBox1.Items.count; ankommt bereits geladen. Die einzige Möglichkeit, die ich wüsste, ist das über ![]() ungetestet:
Delphi-Quellcode:
alternativ: BeginUpdate und EndUpdate => Listbox wird viel schneller fertig als mit ohne ;-)
var
myFile : TextFile; text : string; FileName: string; max, i: integer; begin Filename := // dei Datei halt max := ZeilenZählen(FileName); AssignFile(myFile, FileName); Reset(myFile); progressbar1.position := 0; ProgressBar1.max := 100; i := 0; while not Eof(myFile) do begin ReadLn(myFile, text); listbox1.items.add(test); progressbar1.position := round((i/max) * 100); inc(i); end; CloseFile(myFile); end; Gruß Calculon -- |
Re: ProgressBar bei LoadFromFile in TListBox
Hallo,
ja, mit assign und readln statt loadfromfile bewegt sich die ProgressBar jetzt; kam auch nur darauf, weil es hier stand. ![]() Danke. Allerdings stimmt jetzt die Berechnung noch nicht.. ProgressBar endet zu spät. Mal schaun.. |
Re: ProgressBar bei LoadFromFile in TListBox
year, Problem gelöst :-D
also die Lösung besteht natürlich darin, dass man vorher auslesen muss, wieviele Zeilen die TXT hat.
Delphi-Quellcode:
function CountLines(const sFile: String): Integer;
var fInput: TextFile; begin Result := 0; AssignFile(fInput, sFile); try ReSet(fInput); try while not EOF(fInput) do begin ReadLn(fInput); Inc(Result); end; finally CloseFile(fInput); end; except end; end; Dann setzt man diese Zeilen als Max der ProgressBar, und mit jeder eingelesenen Zeile inc. Auszug:
Delphi-Quellcode:
Begin
OpenDialog1.Execute; FileName1 := OpenDialog1.Filename; f:=countlines(Filename1); AssignFile(myFile,Filename1); Reset(myFile); progressbar1.position := 0; i:= 0; ProgressBar1.max:=f; while not Eof(myFile) do begin ReadLn(myFile, sRecord); listbox1.items.add(sRecord); inc(i); progressbar1.position:=i; end; CloseFile(myFile); |
Re: ProgressBar bei LoadFromFile in TListBox
Guten Morgen,
wenn Du es so löst, dann brauchst Du die Datei nur einmal lesen.
Delphi-Quellcode:
[edit] noch zum sRecord 2 hinzugezählt, wegen CR und LF
Begin
OpenDialog1.Execute; FileName1 := OpenDialog1.Filename; f:=FileSize(Filename1); AssignFile(myFile,Filename1); Reset(myFile); progressbar1.position := 0; ProgressBar1.max:=f; listbox1.items.BeginUpdate; while not Eof(myFile) do begin ReadLn(myFile, sRecord); listbox1.items.add(sRecord); progressbar1.position:=progressbar1.position+length(sRecord)+2; end; listbox1.items.EndUpdate; CloseFile(myFile); Grüße Klaus |
Re: ProgressBar bei LoadFromFile in TListBox
Sauerei ! :warn: Da sucht man zu der Uhrzeit noch Textdatei wo das eventuell Sinn macht (> 10 MB) und dann findet der Kerl das selber. :mrgreen:
Delphi-Quellcode:
Allerdings würde ich die Try/Except-Orgie wenn schon, dann auch überall durchführen. :zwinker: Und (wie zu sehen) eine Gauge benutzen, statt der ProgressBar.
procedure TForm1.FormActivate(Sender: TObject);
var t : TextFile; zeile : string; i, ZeilenAnzahl : integer; begin i := 0; ZeilenAnzahl := 0; AssignFile (t,Dateiname); reset (t); while not Eof (t) do begin ZeilenAnzahl := ZeilenAnzahl + 1; readln (t); end; CloseFile (t); Reset (t); gauge1.MaxValue := ZeilenAnzahl; readln (t,zeile); while not EOF (t) do begin i := i + 1; gauge1.Progress := i; Listbox1.Items.Add(IntToStr (i)); // Application.ProcessMessages; readln (t,zeile); end; CloseFile (t); end; Allerdings auch noch eine Frage : geht das nur mit Processmessages, dass man auch während des Füll-Laufes sieht, wie die Listbox sich füllt ? Jetzt noch roter Kasten ? :shock: Ne, geht nicht, weil keine feste Recordlänge verwendbar. Dateiinhalt : 1 ergibt 3 Byte und nicht 1. Dateiinhalt : 1 234 ergibt 8 Byte und nicht 2. |
Re: ProgressBar bei LoadFromFile in TListBox
gelöscht, da missverständlich.
|
Re: ProgressBar bei LoadFromFile in TListBox
Zitat:
|
Re: ProgressBar bei LoadFromFile in TListBox
Kleiner Tipp: Wenn so wenig zu laden ist, dass es eine "praktikable" (hust) Lösung darstellt, erst die Datei einzulesen und ihre Zeilen zu zählen und sie dann noch einmal einzulesen, und ein Delay einzubauen, damit man mehr vom Fortschritt sieht... Dann braucht man keine Fortschrittsanzeige. Auch das Einlesen von 10 MB sollte nicht länger als zwei Sekunden dauern, selbst wenn sie von einem langsamen Medium kommt. 500ms Delay nur um eine ProgressBar zu sehen, die sofort voll ist... ähm... nein. Hast du dich über solche Dinge in fremden Programmen noch nie geärgert? Miss einmal die Zeit, die das Laden ohne Progressbar und Delay dauert, und dann die Zeit mit.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz