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); Reset(Filename); zeile := 0; while not eof(Filename) do begin setlength(result, zeile+1); Readln(Filename,result[zeile]); inc(zeile); end; CloseFile(Filename); 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
Sahroma hat folgendes geschrieben : |
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); ... 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[0, 0]:='Nummer'; MeinStringGrid.Cells[1, 0]:='Fehler'; MeinStringGrid.Cells[2, 0]:='Sender'; MeinStringGrid.Cells[3, 0]:='Datum'; MeinStringGrid.Cells[4, 0]:='Computer'; MeinStringGrid.Cells[5, 0]:='User'; MeinStringGrid.Cells[6, 0]:='Benutzer'; MeinStringGrid.Cells[7, 0]:='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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 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!