AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi ProgressBar bei LoadFromFile in TListBox
Thema durchsuchen
Ansicht
Themen-Optionen

ProgressBar bei LoadFromFile in TListBox

Ein Thema von bodenheim · begonnen am 11. Mär 2008 · letzter Beitrag vom 12. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#1

ProgressBar bei LoadFromFile in TListBox

  Alt 11. Mär 2008, 23:09
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
  Mit Zitat antworten Zitat
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#2

Re: ProgressBar bei LoadFromFile in TListBox

  Alt 12. Mär 2008, 00:06
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
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#3

Re: ProgressBar bei LoadFromFile in TListBox

  Alt 12. Mär 2008, 00:44
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 AssignFile zu machen:

ungetestet:
Delphi-Quellcode:
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;
alternativ: BeginUpdate und EndUpdate => Listbox wird viel schneller fertig als mit ohne

Gruß

Calculon
--
  Mit Zitat antworten Zitat
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#4

Re: ProgressBar bei LoadFromFile in TListBox

  Alt 12. Mär 2008, 01:26
Hallo,
ja, mit assign und readln statt loadfromfile bewegt sich die ProgressBar jetzt;
kam auch nur darauf, weil es hier stand.

http://entwickler-forum.de/showthread.php?t=4763

Danke.
Allerdings stimmt jetzt die Berechnung noch nicht..
ProgressBar endet zu spät.
Mal schaun..
  Mit Zitat antworten Zitat
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#5

Re: ProgressBar bei LoadFromFile in TListBox

  Alt 12. Mär 2008, 02:12
year, Problem gelöst

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);
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: ProgressBar bei LoadFromFile in TListBox

  Alt 12. Mär 2008, 03:00
Guten Morgen,

wenn Du es so löst, dann brauchst Du die Datei
nur einmal lesen.

Delphi-Quellcode:
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);
[edit] noch zum sRecord 2 hinzugezählt, wegen CR und LF

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: ProgressBar bei LoadFromFile in TListBox

  Alt 12. Mär 2008, 03:20
Sauerei ! Da sucht man zu der Uhrzeit noch Textdatei wo das eventuell Sinn macht (> 10 MB) und dann findet der Kerl das selber.

Delphi-Quellcode:
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 würde ich die Try/Except-Orgie wenn schon, dann auch überall durchführen. Und (wie zu sehen) eine Gauge benutzen, statt der ProgressBar.

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 ? 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#8

Re: ProgressBar bei LoadFromFile in TListBox

  Alt 12. Mär 2008, 11:08
gelöscht, da missverständlich.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: ProgressBar bei LoadFromFile in TListBox

  Alt 12. Mär 2008, 11:17
Zitat von bodenheim:
stimmt, Gauge ist besser.
Um dem OpenDialog noch vorher Zeit zu geben zu schliessen,
habe ich noch einen delay eingebaut;
Hä? Warum denn das?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#10

Re: ProgressBar bei LoadFromFile in TListBox

  Alt 12. Mär 2008, 11:48
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz