Autor Beitrag
vicky12
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 13.02.11 18:04 
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
Hält's aus hier
Beiträge: 16


BDS 2006 Enterprice, XE Enterprice
BeitragVerfasst: 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]);


Zuletzt bearbeitet von Peter Schmelzer am So 13.02.11 18:39, insgesamt 1-mal bearbeitet
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Peter Schmelzer
Hält's aus hier
Beiträge: 16


BDS 2006 Enterprice, XE Enterprice
BeitragVerfasst: So 13.02.11 18:32 
Listview1.Items.LoadfromFile(Textfile);

Seit Delphi 1 dabei!
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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?

listview

lg elundril
Einloggen, um Attachments anzusehen!
_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 13.02.11 18:45 
user profile iconPeter Schmelzer hat folgendes geschrieben Zum zitierten Posting springen:
Listview1.Items.LoadfromFile(Textfile);
Du denkst an eine TListBox. ;-)

Trotzdem geht es so, es fehlt nur das:
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:
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

{ TListItemTextHelper }

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;

{ TListItemsLoadHelper }

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:
ausblenden Delphi-Quelltext
1:
 Listview1.Items.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'test.txt');					

Für diesen Beitrag haben gedankt: bummi
Peter Schmelzer
Hält's aus hier
Beiträge: 16


BDS 2006 Enterprice, XE Enterprice
BeitragVerfasst: So 13.02.11 18:51 
Stimmt,
Listview und ListBox sind verschiedene Dinge.
Dann ist's nicht ganz so trivial.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 13.02.11 20:19 
Lustig, gerade heute Nacht geschrieben:
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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. ;-)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 13.02.11 22:36 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Das könntest du ev. durch Copy und PosEx() machen.
lg elundril

so sollte es klappen, vielen dank.


user profile iconPeter Schmelzer hat folgendes geschrieben Zum zitierten Posting springen:
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.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 13.02.11 22:57 
user profile iconvicky12 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Das könntest du ev. durch Copy und PosEx() machen.
lg elundril

so sollte es klappen, vielen dank.
Meine Lösung ist doch schon komplett. :gruebel:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 13.02.11 23:00 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
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.