Entwickler-Ecke

Dateizugriff - Textdatei in Tabelle umsetzen


Sahroma - Mi 01.07.15 15:38
Titel: Textdatei in Tabelle umsetzen
Hi zusammen,

brauche mal wieder euren Rat. ;)
Ich muss ein Programm schreiben, wo man eine Error.log Datei auswählt und diese dann zur besseren Übersicht in eine Tabelle einfügt. Die Datei ist in etwa wie folgt formatiert:

Fehler:
Error 12345
Sender:
irgendwas.exe
Datum:
21.5.2015 11:05:23
Computer:
IchPC
User:
ICH
Benutzer:
(-1)
Formulare:
test.adi

-> hier kommt ein Absatz und dann beginnt es wieder mit Fehler:.....

Die Spaltennamen der Tabelle sollen jeweils z.B. Fehler, Sender usw. sein und in die jeweiligen Zeilen kommt dann z.B. Error 12345, irgendwas.exe usw. Bisher besteht mein Programm aus eine Combobox (für den Namen der Datei bzw. den Pfad) und einem Button für den Start des Programms. Welche Komponenten für die Tabelle benutze ich da am besten bzw. habt ihr Tipps wie ich das am besten bewerkstellige?

Gruß
Sahroma


Nersgatt - Mi 01.07.15 15:43

Zur Darstellung könntest Du ein TStringGrid verwenden.
Um die Datei passend anzuzeigen, könntest Du sie in eine TStringList einlesen (.LoadFromFile) und dann Zeile für Zeile durchgehen.


Sahroma - Mi 01.07.15 16:19

Bei TStringGrid ist es doch nicht möglich die Spalten zu beschriften, oder liege ich da falsch? Habe zumindest bisher noch nicht herausgefunden wie.


baumina - Mi 01.07.15 16:30

Wenn Du die Eigenschaft FixedRows auf 1 stellst, beinhaltet die erste Zeile der StringGrid quasi die Spaltenüberschriften.


Sahroma - Do 02.07.15 10:14

Mir ist da noch ne Idee gekommen. Könntet ihr mir sagen ob das auch hinhauen würde?

Habe nun eine zweite Unit erstellt mit einer Funktion für die Textdatei einlesen:


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:
unit ReadIn;

interface

type
  TextArray = array of string;
  function Read(Path: string): TextArray;

implementation

function Read(Path: string): TextArray;
var
Filename: TextFile;
zeile: Integer;
begin
  AssignFile(Filename, Path);             //Einlesen der Datei
  Reset(Filename);                        //Setzt den Cursor an den Anfang
  zeile := 0;
  while not eof(Filename) do
  begin
    setlength(result, zeile+1);           //Solange das Dateiende nicht erreicht ist
    Readln(Filename,result[zeile]);       //Erhöht die Länge des dynamischen Strings
    inc(zeile);                           //Schreibt die ganze Zeile in result[Zeile] und setzt den Cursor in die nächste Zeile
  end;
  CloseFile(Filename);                    //Schließt die Datei
end;
end.


Meine Idee dahinter diese Unit benutzen um den TStringGrid zu füllen. 2 Fragen habe ich hier:

1. Ist die Idee gut und würde das in die Richtung funktionieren?
2. Wenn ja, wie befülle ich damit ein TStringGrid (habe noch nicht so oft damit gearbeitet)?


Nersgatt - Do 02.07.15 10:25

user profile iconSahroma hat folgendes geschrieben Zum zitierten Posting springen:
Mir ist da noch ne Idee gekommen. Könntet ihr mir sagen ob das auch hinhauen würde?


Viele Wege führen nach Rom. Man muss sich halt für einen entscheiden.
Mit Deiner Funktion bekommst Du die Daten aus der Datei als Array of String. Kann man auch mit arbeiten, warum nicht? Ich finde halt die TStringList handlicher, aber das ist Dir überlassen.

Das TStringGrid ist eigentlich ganz simpel. Du setzt RowCount und ColCount auf die richten Werte und kannst dann über die Eigenschaft .Cells[Col,Row] auf die Zellen zugreifen und einen Wert zuweisen.


ub60 - Do 02.07.15 17:52

Das Einlesen geht wesentlich einfacher:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var Liste: TStringList;
begin
  Liste:=TStringList.Create;
  Liste.LoadFromFile(PfadUndDateiname);
  // Zugriff auf die einzelnen Zeilen mit Liste[i]
  ...
  // irgendwann am Ende...
  Liste.Free;
end;

Die erste Zeile eines StringGrids könnte man so befüllen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
MeinStringGrid.Cells[00]:='Nummer';  // irgend eine laufende Nummer
MeinStringGrid.Cells[10]:='Fehler';
MeinStringGrid.Cells[20]:='Sender';
MeinStringGrid.Cells[30]:='Datum';
MeinStringGrid.Cells[40]:='Computer';
MeinStringGrid.Cells[50]:='User';
MeinStringGrid.Cells[60]:='Benutzer';
MeinStringGrid.Cells[70]:='Formulare';

Das geht natürlich auch über eine Schleife mit den Daten aus der Textdatei bzw. der StringListe.

ub60


Sahroma - Fr 03.07.15 08:32

Moin,

bisher habe ich das mit den Spalten Beschriftung wie folgt gelöst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TError.FormCreate(Sender: TObject);
begin
  sgErgebnis.Cells[1,0] := 'Fehler';
  sgErgebnis.Cells[2,0] := 'Sender';
  sgErgebnis.Cells[3,0] := 'Datum';
  sgErgebnis.Cells[4,0] := 'Computer';
  sgErgebnis.Cells[5,0] := 'User';
  sgErgebnis.Cells[6,0] := 'Benutzer';
  sgErgebnis.Cells[7,0] := 'Formulare';
end;


Und die Beschriftung der Zeilen so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TError.btnImportClick(Sender: TObject);
var
LValue: string;
begin
  LValue :=  Read(cbPfad.Text)[4];
  sgErgebnis.Cells[1,1] := LValue;
  LValue :=  Read(cbPfad.Text)[6];
  sgErgebnis.Cells[2,1] := LValue;
  LValue :=  Read(cbPfad.Text)[8];
  sgErgebnis.Cells[3,1] := LValue;
  LValue :=  Read(cbPfad.Text)[10];
  sgErgebnis.Cells[4,1] := LValue;
  LValue :=  Read(cbPfad.Text)[12];
  sgErgebnis.Cells[5,1] := LValue;
  LValue :=  Read(cbPfad.Text)[14];
  sgErgebnis.Cells[6,1] := LValue;
  LValue :=  Read(cbPfad.Text)[16];
  sgErgebnis.Cells[7,1] := LValue;
end;


Jetzt muss ich nur noch herausfinden wie ich das in eine Schleife einbaue damit er mir die anderen Meldungen im Textdokument anzeigt. Die Meldungen sind jeweils durch Absätze getrennt. :gruebel: Danke schonmal für die bisherigen Hilfestellungen.


baumina - Fr 03.07.15 09:01

Also so wie ich deinen Code verstehe, liest du zur Zeit die komplette Datei mit jedem Aufruf von "read", sprich 7 mal, ein.


Nersgatt - Fr 03.07.15 09:13

Genau, baumina hat Recht!

Du solltest Die Datei einmal auslesen, das Ergebnis in einer lokalen Variable zwischenspeichern und dann ins Grid füllen.
Die Schleifen bekommst Du mit for... hin.