Autor Beitrag
Sahroma
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 66
Erhaltene Danke: 1


Delphi 10 Seattle, Delphi 10.1 Berlin
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 66
Erhaltene Danke: 1


Delphi 10 Seattle, Delphi 10.1 Berlin
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 66
Erhaltene Danke: 1


Delphi 10 Seattle, Delphi 10.1 Berlin
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 762
Erhaltene Danke: 127



BeitragVerfasst: Do 02.07.15 17:52 
Das Einlesen geht wesentlich einfacher:

ausblenden 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 66
Erhaltene Danke: 1


Delphi 10 Seattle, Delphi 10.1 Berlin
BeitragVerfasst: Fr 03.07.15 08:32 
Moin,

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

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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)