Autor Beitrag
Bronstein
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Di 26.06.07 10:51 
Ich möchte eine Textdatei einlesen, deren Spalten durch Tab getrennt sind.

Habe mir jetzt folgende Funktion zusammengebastelt.
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:
43:
44:
45:
46:
47:
48:
49:
50:
51:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i, z, zeilen: Integer;
  ListItem: TListItem;
  tmpFile, tmpLine: TStringlist;
begin
  Timer1.Enabled := false;
  for i:=1 to 7 do
  begin
    Listview1.Columns.Add;
    ListView1.Columns[i-1].Width := -2;
  end;
  tmpFile := TStringList.Create;
  // Laden der Datei
  copyfile('G:\SAPR3\KDMAT_INFO\Kundennummer.txt', 'C:\temp_edb\Kundennummer.txt', false);
  tmpFile.LoadFromFile('C:\temp_edb\Kundennummer.txt');
  //tmpFile.LoadFromFile('Kundennummer.txt');
  if tmpFile.Count > 0 then
  begin
    zeilen := 1;
    Progressbar1.Max := tmpFile.Count;
    // Nur wenn Zeilen vorhande....
    tmpLine := TStringList.Create;
    tmpLine.Delimiter := #9;
    for i := 0 to tmpFile.Count -1 do
    begin
      Progressbar1.Position := Progressbar1.Position + 1;
      tmpLine.DelimitedText := tmpFile.Strings[i];
      if zeilen = 1 then
      begin
        zeilen := 2;
        Listview1.Column[0].Caption := tmpLine[2];
        for z:=3 to 8 do
        begin
          Listview1.Column[z-2].Caption := tmpLine[z];
        end;
      end
      else
      begin
        // ....Einlesen der einzelnen Zeile
        ListItem := ListView1.Items.Add;
        ListItem.Caption := tmpLine[2];
        for z:=3 to 8 do
        begin
          ListItem.SubItems.Add(tmpLine[z]);
        end;
      end;
    end;
    tmpLine.Free;
  end;
end;


Das Einlesen geht jetzt aber sehr lange, gibt es noch eine schnellere Möglichkeit.

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 26.06.07 11:12 
So eine ListView ist auch nicht sonderlich schnell, denn nach jeder Änderung wird sie komplett neu gezeichnet. Versuche es mal mit 'Items.BeginUpdate/EndUpdate'.

Die 1.Zeile sollte dann 'MyListView.Items.Beginupdate' und die letzte Zeile entsprechend 'EndUpdate' lauten.

_________________
Na denn, dann. Bis dann, denn.
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Di 26.06.07 11:32 
Dadurch wird es auch nicht schneller

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 26.06.07 11:52 
Wie groß ist die Datei?

Lass mal die Progressbar weg. Die wird sowieso erst zum Schluß angezeigt, da Du nirgendwo ein Application.ProcessMessages machst.

ProgressBars kosten viel Zeit. Nur da einsetzen, wo es sinnvoll ist und in Deinem Beispiel auf keinen Fall für jeden Datensatz. Du kannst besser nebenbei mitrechnen und dann bei allen 10% die ProgressBar aktualisieren.

Ansonsten gehe doch mal die Anweisungen Schrittweise durch. Vielleicht findest Du so schon die Bremse.
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: Di 26.06.07 13:33 
Schau' mal hier.