Autor |
Beitrag |
Sahroma
Beiträge: 66
Erhaltene Danke: 1
Delphi 10 Seattle, Delphi 10.1 Berlin
|
Verfasst: Mi 01.07.15 15:38
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
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Sahroma
Beiträge: 66
Erhaltene Danke: 1
Delphi 10 Seattle, Delphi 10.1 Berlin
|
Verfasst: 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
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: 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
Beiträge: 66
Erhaltene Danke: 1
Delphi 10 Seattle, Delphi 10.1 Berlin
|
Verfasst: 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
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
ub60
Beiträge: 762
Erhaltene Danke: 127
|
Verfasst: 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
Beiträge: 66
Erhaltene Danke: 1
Delphi 10 Seattle, Delphi 10.1 Berlin
|
Verfasst: 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. Danke schonmal für die bisherigen Hilfestellungen.
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: 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
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|