Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Logdatei in StringGrid laden (https://www.delphipraxis.net/114892-logdatei-stringgrid-laden.html)

SaFu 2. Jun 2008 14:21


Logdatei in StringGrid laden
 
Hi Männers

Wie es schon in der Überschrift steht versuche ich eine Logdatei in ein StringGrid zu laden, die Spalten sind fest auf 20 und die Zeilen können variiren. Da habe ich schon mein 1 Problem, wie Realisiere ich das wenn ich die Datei lade das, das StringGrid Automatisch sich anpasst.

Die andere Frage ist wie bekomme ich die Überschriften in der Logdatei in die Fixed.Rows auch zur Laufzeit.

Und naturlich die wichtigste Frage wie bekomme ich überhaupt die Datei in das StringGrid und auch noch richtig Formatiert

Die Datei hänge ich mal an.

Danke euch schonmal

Gruß sascha

marabu 2. Jun 2008 14:33

Re: Logdatei in StringGrid laden
 
Hallo Sascha,

Zitat:

Zitat von fuknersascha
... Die Datei hänge ich mal an. ...

weißt du schon wann?

Freundliche Grüße

mkinzler 2. Jun 2008 14:34

Re: Logdatei in StringGrid laden
 
Wäre da nicht ein Memo eher geeignet

SaFu 2. Jun 2008 14:40

Re: Logdatei in StringGrid laden
 
Liste der Anhänge anzeigen (Anzahl: 1)
ah deswegen gings nicht .log ist verboten(einfach umbennenen in .log

raiguen 2. Jun 2008 14:42

Re: Logdatei in StringGrid laden
 
*angestrengt gugg und such* ja wo ist sie denn, die angehängte Datei :gruebel:

zur ersten Frage:
Anzahl der Zeilen der darzstellenden Logdatei ermitteln und darauf hin die Zeilen des StringGrid einstellen:
Delphi-Quellcode:
StringGrid1.RowCount := AnzahlFesteZeilen + AnzahlDerLogdateiZeilen;
zweite Frage:
Auch die (per Desingner oder per Code ) eingestellten FixedRows können direkt per Index angesprochen werden:
Delphi-Quellcode:
StringGrid1.Rows[0] := ... // erste feste Zeile
dritte Frage, 1.Teil:
Logdatei zeilenweise auslesen und je nach Aufbau der Zeile diese entsprechend splitten
gesplitte ZeilenFragmente in die entsprechenden Zellen schreiben
Delphi-Quellcode:
...
while not Logdatei.Eof do
begin
  Zeile auslesen;
  Zeile splitten;
  StringGrid1.Cells[Spalte, Zeile] := TeilInhalt der gespliiten Zeile
  Zeile := Zeile +1; //Zeilennummer erhöhen
...
end;
dritte Frage, 2.Teil:
präzisiere [quote] richtig Formatiert [/qoute]

Gruss Rainer
[EDIT] kaum das man schreibt und noch keine Antworten da sind, schon ist der rote kasten da*grr*[/EDIT]

mkinzler 2. Jun 2008 14:42

Re: Logdatei in StringGrid laden
 
Gibt es auch Zeilen, in den alle Felder Werte haben?

Larsi 2. Jun 2008 14:44

Re: Logdatei in StringGrid laden
 
Du könntest auch die gesamte Komponente abspeichern:

Speichern:

Delphi-Quellcode:
FileStream:= TFileStream.Create(extractfilepath(Application.ExeName)+'data.txt', fmCreate);
  try
    FileStream.WriteComponent(Stringgrid1);
  finally
    FileStream.Free;
  end;
Laden:

Delphi-Quellcode:
FileStream:= TFileStream.Create(extractfilepath(Application.ExeName)+'data.txt', fmopenread);
  try
    FileStream.WriteComponent(Stringgrid1);
  finally
    FileStream.Free;
  end;
MFG Lars Wiltfang

SaFu 2. Jun 2008 14:48

Re: Logdatei in StringGrid laden
 
Zitat:

Zitat von mkinzler
Gibt es auch Zeilen, in den alle Felder Werte haben?

ja alle Zeile haben Werte für die Felder (kann Sie aber leider nicht anhängen)

Das mit dem FileStrem habe ich schon versucht geht leider nicht.

Das mit dem Formatieren meine ich das auch alles richtig untereinander steht und nicht verschoben ist

mkinzler 2. Jun 2008 14:53

Re: Logdatei in StringGrid laden
 
Deshalb musst du die Zeilen auch aufspalten

SaFu 2. Jun 2008 14:55

Re: Logdatei in StringGrid laden
 
Zitat:

Zitat von mkinzler
Deshalb musst du die Zeilen auch aufspalten

Wie meinst du das
Sorry das ich mich mal wieder so blöd anstelle aber hab das noch nie gemacht

marabu 2. Jun 2008 14:57

Re: Logdatei in StringGrid laden
 
Hallo Sascha,

dein Logfile ist ein Tab Delimited Textfile:

Delphi-Quellcode:
procedure ShowLog(const fn: TFileName; sg: TStringGrid; delimiter: Char = #9);
var
  log: TextFile;
  line: string;
begin
  AssignFile(log, fn);
  Reset(log);
  with sg do
  begin
    RowCount := 1;
    while not Eof(log) do
    begin
      ReadLn(log, line);
      Rows[Pred(RowCount)].Text := StringReplace(line, delimiter, sLineBreak, [rfReplaceAll]);
      RowCount := RowCount + 1;
    end;
    FixedRows := 1;
  end;
  CloseFile(log);
end;
Getippt und nicht getestet.

Freundliche Grüße

SaFu 2. Jun 2008 15:09

Re: Logdatei in StringGrid laden
 
Zitat:

Zitat von marabu
Hallo Sascha,

dein Logfile ist ein Tab Delimited Textfile:

Was sagt mir das wo bekomme ich sowas raus

ich komme mit diesen ganzen Antorten irgenwie nicht weiter.

Z.B mit dem anpassen der Zeilen dazu muss doch erst die Datei Formatiert weden um die richtige Zeilen anzahl heraus zu bekommen oder??

SaFu 2. Jun 2008 15:12

Re: Logdatei in StringGrid laden
 
Ok Sorry nicht schlagen es Funzt doch aber kann mir das einer mit dieser

Tab Delimited Textfile:

noch erklären nur abtippen und nicht verstehn ist blöd

mkinzler 2. Jun 2008 15:13

Re: Logdatei in StringGrid laden
 
Zitat:

Was sagt mir das wo bekomme ich sowas raus
Na die Felder sind durch Tab getrennt.
Zitat:

Z.B mit dem anpassen der Zeilen dazu muss doch erst die Datei Formatiert weden um die richtige Zeilen anzahl heraus zu bekommen oder??
Nein, weil die Zeilenanzahl ja gleich beliebt.
Du musst Zeile für Zeile durchgehen, diese abhand des Trenner auf trennen (explode, StringListe) und dann darstellen

marabu 2. Jun 2008 15:20

Re: Logdatei in StringGrid laden
 
Sascha,

Zitat:

Zitat von fuknersascha
... aber kann mir das einer mit dieser Tab Delimited Textfile noch erklären - nur abtippen und nicht verstehn ist blöd

das gibt es nur eine einzige Zeile in meinem Beispiel, über die du nachdenken musst:

Delphi-Quellcode:
// ...
Rows[Pred(RowCount)].Text := StringReplace(line, delimiter, sLineBreak, [rfReplaceAll]);
// ...
Der Text einer Row[] enthält die Spaltenwerte als einzelne Zeilen - und nimmt sie auch so auf. Aber das hast du inzwischen bestimmt schon selbst erkannt.

Freundliche Grüße

SaFu 2. Jun 2008 15:32

Re: Logdatei in StringGrid laden
 
So einigermaßen hab ich verstanden.

! Frage noch kann man die Cellenbreite auch Automatisch anpassen lassen also so lang wie die längstebreite in der Spalte ich denke ich habe schonmal einen Code hier gesehen aber ich find den nicht mehr

DeddyH 2. Jun 2008 15:42

Re: Logdatei in StringGrid laden
 
Mal für eine Spalte:
- Breite auf 0 setzen
- beim zeilenweisen Einfügen Canvas.TextWidth mit aktueller Breite vergleichen
- wenn größer, Breite neu setzen

Das Ganze kannst Du auch in einem Array für alle Spalten machen, ist ja immer dasselbe Prinzip.

marabu 2. Jun 2008 16:04

Re: Logdatei in StringGrid laden
 
Hallo,

Zitat:

Zitat von DeddyH
... wenn größer, Breite neu setzen ...

eventuell ist es besser, erstmal nur die maximale Textbreite einer Spalte zu ermitteln und die Spaltenbreite dann zum Schluß zu setzen.

Freundliche Grüße

DeddyH 2. Jun 2008 18:45

Re: Logdatei in StringGrid laden
 
Mit Breite war eigentlich eine Variable zur Ermittlung der aktuellen maximalen Breite gemeint, aber das ging aus meiner Beschreibung nicht eindeutig hervor, muss ich zu meiner Schande zugeben.

SaFu 3. Jun 2008 08:22

Re: Logdatei in StringGrid laden
 
meint ihr sowas

Delphi-Quellcode:
StringGrid1.DefaultCol.Widht:= StringGrid1.Canvas.TextWidth(zellen Position);
und das alles in eine schleife gelegt

DeddyH 3. Jun 2008 08:27

Re: Logdatei in StringGrid laden
 
Wie marabu bereits sagte: leg Dir besser eine Variable an, belege sie mit 0 vor und vergleiche innerhalb der Schleife (-> Ermittlung des Maximums). Zum Schluss setzt Du dann die Breite entsprechend des Werts dieser Variablen.

SaFu 3. Jun 2008 08:35

Re: Logdatei in StringGrid laden
 
Ja das meine ich das maximum des Textes oder (sorry steh auf dem schlauch)

DeddyH 3. Jun 2008 08:39

Re: Logdatei in StringGrid laden
 
Im Prinzip so (aus dem Kopf dahergetippt):
Delphi-Quellcode:
function MaxBreite(const cv: TCanvas; const sl: TStrings): integer;
var i, Current: integer;
begin
  Result := 0;
  for i := 0 to Pred(sl.Count) do
    begin
      Current := cv.TextWidth(sl[i]);
      if Current > Result then
        Result := Current;
    end;
end;

SaFu 3. Jun 2008 08:45

Re: Logdatei in StringGrid laden
 
Sorry wenn ich blöd frage aber Result ist doch keine Variable sondern gibt den Rückgabe wert an oder hab ich da was falsch verstanden??

Sharky 3. Jun 2008 08:46

Re: Logdatei in StringGrid laden
 
Zitat:

Zitat von fuknersascha
Sorry wenn ich blöd frage aber Result ist doch keine Variable sondern gibt den Rückgabe wert an oder hab ich da was falsch verstanden??

Hai,

Result ist eine automatisch generierte Variable bei Funktionen die den Rückgabewert beinhaltet. ;-)

DeddyH 3. Jun 2008 08:47

Re: Logdatei in StringGrid laden
 
Du kannst Result auch als Variable betrachten. Außerdem war das ja nur ein Beispiel.

SaFu 3. Jun 2008 08:50

Re: Logdatei in StringGrid laden
 
Deswegen frag ich hab langenung abgetippt ohne es zu vertehen langsam wird es auchmal Zeit um es auch zu verstehen.
Und an fertigen beispielen kann ich besser lernen und verstehen.

mkinzler 3. Jun 2008 08:54

Re: Logdatei in StringGrid laden
 
Für das Verständnis wäre es besser selber zu machen.

SaFu 3. Jun 2008 08:57

Re: Logdatei in StringGrid laden
 
Das denke ich auch und ich versuchs ja schon seit gestern aber irgendwie will das alles net so wie ich mir das vorstelle,das Prinzip wie Ihr das meint habe ich auch bereits verstanden bei mir scheitert es gerade an der Umsetzung :oops:

mkinzler 3. Jun 2008 08:58

Re: Logdatei in StringGrid laden
 
Fang mit kleinen Aufgabestellungen an.

SaFu 3. Jun 2008 09:02

Re: Logdatei in StringGrid laden
 
Das ist doch eigentlich ne kleine Aufgabe beziehungsweise eine Standart Aufgabe für ein StringGrid und wenn ich mir mal meine 1 Posts angucke bin ich der Meinung das ich mit meinem blöden fragen :-D schon weit gekommen bin.
Und das meiste habe ich ja auch immer verstanden dauert bei mir halt immer sorry :lol:

SaFu 3. Jun 2008 10:06

Re: Logdatei in StringGrid laden
 
Hab es zwar immer noch nicht mit dem Code von euch verstanden aber hab da was gefunden nur falls mal jemand das noch braucht.

Zellengröße anpassen

Danke Trotzdem für die Mühe

taaktaak 3. Jun 2008 10:19

Re: Logdatei in StringGrid laden
 
Aber das ist ja (natürlich) prinzipiell die gleiche Lösung wie in #23 von DeddyH - was hast du denn daran nicht verstanden?

SaFu 3. Jun 2008 10:35

Re: Logdatei in StringGrid laden
 
Z.b welchen TStrings soll ich der funktion übergeben

Delphi-Quellcode:
function MaxBreite(const cv: TCanvas; const sl: TStrings): integer;

taaktaak 3. Jun 2008 10:39

Re: Logdatei in StringGrid laden
 
Die Liste aller Grid-Einträge der anzupassenden Spalte, also z.B. Grid.Cols[1] für die zweite Spalte (i.d.R. die erste Spalte neben der fixen Spalte)

// edit: Cols nicht Rows!

DeddyH 3. Jun 2008 10:39

Re: Logdatei in StringGrid laden
 
Wie gesagt, das war nur ein Beispiel, ich würde diese Funktion nicht nutzen, sondern nur das Prinzip beim Befüllen der einzelnen Spalten anwenden. Wenn es aber unbedingt diese Funktion sein soll, kannst Du als Canvas den des StringGrids und als sl StringGrid.Cols[Index] angeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz