Entwickler-Ecke
Dateizugriff - Textdatei mit Trennzeichen in Listview ausgeben
vicky12 - So 13.02.11 18:04
Titel: Textdatei mit Trennzeichen in Listview ausgeben
hallo,
in einer textdatei sind daten in jeder zeile mit ";" getrennt,
das ganze geht über mehrere zeilen. z.b:
Max;Muster;23.06.1964
Lisa;Laut;02.12.1968 .. usw.
ich möchte nun in einem listview das gesamte file ausgeben.
sollte so aussehen:
Name | Vorname | Geb.
Muster | Max | 23.06.1964
Laut | Lisa | 02.12.1968
mit textfiles habe ich schon gearbeitet, aber nur mit normalen readln()-befehlen,
also immer nur zeile für zeile ohne jegliche trennzeichen auslesen.
wäre super, wenn mir dabei jemand weiter helfen könnte.
Peter Schmelzer - So 13.02.11 18:18
Listview1.Items.LoadfromFile(Textfile);
mit Ersetzung des Semikolon:
Listview1.Items.LoadfromFile(Textfile);
ListView1.Items.Text := StringReplace(ListView1.Items.Text, ';', ' | ', [rfReplaceAll]);
elundril - So 13.02.11 18:24
ich weiß ja nicht welches delphi du hast aber bei delphi 7 hat TListview noch keine eigenschaft 'LoadFromFile'.
Mein Vorschlag: Du schreibst dir eine eigene Methode. Am elegantesten natürlich wenn du das in eine Komponente fasst die du vom TListView ableitest.
Dieser Methode übergibst du dann den Pfad zum TextFile. Dann öffnest du das Textfile, kann auch mit ReadLn() sein, oder halt wenn du es anders machen willst mit einer StringList. Dann gehst du dein Dokument Zeilenweise durch (bei ReadLn() gehts eh nicht anders) und filterst immer die wörter zwischen den semikolons raus. Das könntest du ev. durch Copy und PosEx() machen. Dadurch bekommst du die einzelnen Texte zwischen den Semikolons und das einzige was du dann noch machen musst ist diese dann in dein ListView einzufügen.
lg elundril
Peter Schmelzer - So 13.02.11 18:32
Listview1.Items.LoadfromFile(Textfile);
Seit Delphi 1 dabei!
elundril - So 13.02.11 18:44
-.- Wortklauberei, ich meinte natürlich bei den Items...
Aber auch dort ist bei mir in Delphi7 keine Methode mit dem Namen "LoadFromFile" dabei (siehe anhang). Sicher das du die richtige Komponente meinst?
lg elundril
jaenicke - So 13.02.11 18:45
Peter Schmelzer hat folgendes geschrieben : |
Listview1.Items.LoadfromFile(Textfile); |
Du denkst an eine TListBox. ;-)
Trotzdem geht es so, es fehlt nur das:
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: 52: 53:
| type TListItemsLoadHelper = class helper for TListItems public procedure LoadFromFile(AFileName: TFileName); end;
TListItemTextHelper = class helper for TListItem private function GetText: string; procedure SetText(const Value: string); public property Text: string read GetText write SetText; end;
TFormX = class(TForm) ...
implementation
function TListItemTextHelper.GetText: string; begin Result := Self.Caption + #13#10 + Self.SubItems.Text; end;
procedure TListItemTextHelper.SetText(const Value: string); begin Self.SubItems.Delimiter := ';'; Self.SubItems.DelimitedText := Value; if Self.SubItems.Count > 0 then begin Self.Caption := Self.SubItems[0]; Self.SubItems.Delete(0); end; end;
procedure TListItemsLoadHelper.LoadFromFile(AFileName: TFileName); var FileContents: TStringList; CurrentLine: string; begin FileContents := TStringList.Create; try FileContents.LoadFromFile(AFileName); for CurrentLine in FileContents do Self.Add.Text := CurrentLine; finally FileContents.Free; end; end; |
Jetzt funktioniert das Laden wirklich so:
Delphi-Quelltext
1:
| Listview1.Items.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'test.txt'); |
Peter Schmelzer - So 13.02.11 18:51
Stimmt,
Listview und ListBox sind verschiedene Dinge.
Dann ist's nicht ganz so trivial.
Delete - So 13.02.11 20:19
Lustig, gerade heute Nacht geschrieben:
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: 52: 53: 54: 55: 56:
| procedure TfrmMain.FillListview; var i: Integer; j: Integer; sl: TStringList; StartIdx: Integer; DelimitedLine: TStringList; LVItem: TListItem; begin try FCancel := False; UpdateStatus('Lese Datei... Abbrechen mit ESC'); lvCSVFile.Items.Clear; sl := TStringList.Create; try DelimitedLine := TStringlist.Create; Delimitedline.StrictDelimiter := True; DelimitedLine.Delimiter := FDelimiter; try sl.LoadFromFile(FFilename); ProgressBar1.Max := sl.Count; Application.ProcessMessages; if chKHasColumnNames.Checked then StartIdx := 1 else StartIdx := 0; for i := StartIdx to sl.Count - 1 do begin if FCancel then Break; DelimitedLine.DelimitedText := sl[i]; LVItem := lvCSVFile.Items.Add; LVItem.Caption := IntToStr(i); FCountRecords := i; UpdateStatusbar; for j := 0 to DelimitedLine.Count - 1 do begin LVitem.SubItems.Add(DelimitedLine[j]); end; ProgressBar1.StepIt; Application.ProcessMessages; end; finally DelimitedLine.Free; end; finally sl.Free; end; Progressbar1.Position := 0; FColumnToSort := 0; lvCSVFile.AlphaSort; UpdateStatus('Datei gelesen'); except raise Exception.Create('Fehler beim Lesen der Datei'); end; end; |
jaenicke - So 13.02.11 21:04
Als Class Helper eingebaut in die ListView finde ich es allerdings schöner. ;-)
Was da nicht geht, ist konzeptbedingt die Fortschrittsanzeige, allerdings ist die an der Stelle ohnehin fragwürdig finde ich. Denn entweder ist die Datei so klein, dass die sich nicht lohnt oder eine TListView fehl am Platz, weil die für größere Datenmengen viel zu langsam ist. ;-)
Delete - So 13.02.11 21:13
Sind 80 Zeilen à 26 Felder. Dauert so seine zwei, drei Sekunden. Rechnen tue ich mit maximal 150 Zeilen oder so. War auch nur so für mich privat mal schnell zusammengekloppt. Ist nur um die Backup Exporte meiner privaten Adressdatenbank im Notfall auch mal gescheit angucken zu können, wenn ich keine Verbindung zum Internet habe.
vicky12 - So 13.02.11 22:36
elundril hat folgendes geschrieben : |
Das könntest du ev. durch Copy und PosEx() machen.
lg elundril |
so sollte es klappen, vielen dank.
Peter Schmelzer hat folgendes geschrieben : |
Listview1.Items.LoadfromFile(Textfile);
mit Ersetzung des Semikolon:
Listview1.Items.LoadfromFile(Textfile);
ListView1.Items.Text := StringReplace(ListView1.Items.Text, ';', ' | ', [rfReplaceAll]); |
war eher nicht so gemeint, die "|"-Zeichen sollten nur die felder im erwähnten listview darstellen.
Delete - So 13.02.11 23:00
elundril hat folgendes geschrieben : |
Das könntest du ev. durch Copy und PosEx() machen. |
Warum so umständlich. Lass es doch die VCL machen. TStringList.Delimiter und TStringList.DelimitedText, siehe meinen Code. Tipp: damit er nur den angegeben Delimiter berücksichtigt und keine Leerzeichen muss die Eigenschaft StrictDelimiter auf True gesetzt werden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!