![]() |
Re: StringGrid mit Daten füllen und farblich Darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo nochmal zusammen,
So ich habe jetzt den ganzen Nachmittag mich mit dem StringGrid auseinnander gesetzt und habe jetzt schon so ein paar Sachen rausgefunden, wie ich es mit Daten füllen kann. Leider bekomme ich diese Funktion nicht in mein Programm integriert. Mit folgender Funktion fülle ich momentan mein Memo und eine Textdatei als Datensicherung:
Delphi-Quellcode:
Um einer Frage vorzubeugen, ich weiß das das Speicherziel so momentan noch nicht in Ordnung ist (Schreibrechte etc.) Ist nur hier auf meinem Testsystem so.
procedure TForm1.DatenverarbeitungMB256;
Var Datum :String; Jahr :String; Monat :String; Sicherung :String; SL :TStringList; I :Integer; begin Datum := DatetoStr(Date); Jahr := FormatDateTime('yyyy',strtodatetime(Datum)); Monat := FormatDateTime('mmmm',strtodatetime(Datum)); CreateDir('..\Daten\'); CreateDir('..\Daten\'+Jahr); CreateDir('..\Daten\'+Jahr+'\'+Monat); sl := TStringList.Create; try MMUEZ2000.Lines.Add(Zeile); sl.AddStrings(MMUEZ2000.Lines); for i := 0 to sl.Count -1 do begin sl[i] := trim(StringReplace(sl[i], #$D, '', [rfReplaceAll])); sl[i] := StringReplace(sl[i], #129, 'ü', [rfReplaceAll]); sl[i] := trim(StringReplace(sl[i], #132, 'ä', [rfReplaceAll])); sl[i] := StringReplace(sl[i], #142, 'Ä', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #148, 'ö', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #153, 'Ö', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #154, 'Ü', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #10#13, ' ', [rfReplaceAll]); if sl[i] <> '' then Zeile:=''; Memo.Lines.Append(SL[I]); Speichermemo.Lines.Append(SL[I]); MMUEZ2000.Clear; end; finally sl.Free; end; Zeile:=''; Sicherung := ('..\Daten\'+Jahr+'\'+Monat+'\'+Datum+'.txt'); Speichermemo.Lines.SaveToFile(Sicherung); Label1.Caption := Sicherung; end; Der Text in meinem Memo wird Zeilenweise über eine COM-Schnittstelle eingelesen. Mein Grid habe ich jetzt so wie im Anhang zusammengestellt und die Daten sollen wie in dem Bild gezeigt eingefügt werden. Wie kann ich den das jetzt alles angehen. MFG Jens |
Re: StringGrid mit Daten füllen und farblich Darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
so, habe heute Nacht noch ein bißchen probiert und gespielt, und habe es zumindestens schon mal geschaft, die Daten ins Grid zu übernehmen.
Allerdings so wie im Anhang (Chaos).
Delphi-Quellcode:
MFG
Zelle := Zelle+1;
for i := 0 to sl.Count -1 do begin sl[i] := trim(StringReplace(sl[i], #$D, '', [rfReplaceAll])); sl[i] := StringReplace(sl[i], #129, 'ü', [rfReplaceAll]); sl[i] := trim(StringReplace(sl[i], #132, 'ä', [rfReplaceAll])); sl[i] := StringReplace(sl[i], #142, 'Ä', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #148, 'ö', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #153, 'Ö', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #154, 'Ü', [rfReplaceAll]); sl[i] := StringReplace(sl[i], #10#13, ' ', [rfReplaceAll]); if sl[i] <> '' then Zeile:=''; Memo.Lines.Append(SL[I]); Speichermemo.Lines.Append(SL[I]); for IA := 0 to sl.Count -1 do begin sl[IA] := StringReplace(sl[IA], 'Ereignis', '', [rfReplaceAll]); sl[IA] := StringReplace(sl[IA], ':', '', [rfReplaceAll]); AppendStr(Ereignisnummer,(SL[IA])); Label7.Caption := Ereignisnummer; SGMBSerie.Cells[Zelle,Spalte] := Label7.Caption; end; MMUEZ2000.Clear; end; sl.Free; Finally; if Zelle >=6 then begin Spalte := Spalte+1; Zelle := 0; end; Jens |
Re: StringGrid mit Daten füllen und farblich Darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe wie angekündigt mich eben noch kurz drangesetzt, das Projekt liegt im Anhang. Ich habe das jetzt einfach nur schnell heruntergeschrieben und nicht besonders optimiert oder elegant geschrieben, funktionieren tut es aber. ;-)
Der Quelltext sieht so aus, ich denke der sollte auch ohne Kommentare verständlich sein:
Delphi-Quellcode:
type
TMyDataEntry = record Index: Integer; DateString, IdString, Line1, Line2: String; end; TMySimpleParser = class private Data: String; DataPointer: Integer; function OemToAnsi(const OemStr: string): string; procedure SkipSpaces; procedure SkipTrash; function GetTextLength(UpToLineEnd: Boolean): Integer; public Entries: array of TMyDataEntry; procedure Parse(Text: String); end;
Delphi-Quellcode:
{ TMySimpleParser }
function TMySimpleParser.OemToAnsi(const OemStr: string): string; begin SetLength(Result, Length(OemStr)); if Length(Result) > 0 then OemToCharBuff(PChar(OemStr), PChar(Result), Length(Result)); end; procedure TMySimpleParser.SkipSpaces; begin while (DataPointer < Length(Data)) and (Data[DataPointer] = ' ') do Inc(DataPointer); end; procedure TMySimpleParser.SkipTrash; begin while (DataPointer < Length(Data)) and (Data[DataPointer] in [#13, #10, #32]) do Inc(DataPointer); end; function TMySimpleParser.GetTextLength(UpToLineEnd: Boolean): Integer; function IsTerminatingChar(CharIndex: Integer): Boolean; begin if UpToLineEnd then Result := Data[CharIndex] in [#13, #10] else Result := Data[CharIndex] in [#13, #10, #32]; end; var CurPointer: Integer; begin Result := -1; CurPointer := DataPointer; while Result < 0 do begin while (CurPointer < Length(Data)) and not IsTerminatingChar(CurPointer) do Inc(CurPointer); if (CurPointer + 1 < Length(Data)) and not IsTerminatingChar(CurPointer + 1) then Inc(CurPointer) else Result := CurPointer - DataPointer; if CurPointer = Length(Data) then Result := CurPointer - DataPointer + 1; end; end; procedure TMySimpleParser.Parse(Text: String); var CurEntry: ^TMyDataEntry; TextLen: Integer; begin Data := Text; DataPointer := 1; SetLength(Entries, 0); SkipTrash; while DataPointer < Length(Data) do begin SetLength(Entries, Length(Entries) + 1); CurEntry := @Entries[High(Entries)]; TextLen := GetTextLength(False); CurEntry.Index := StrToInt(Copy(Data, DataPointer, TextLen)); DataPointer := DataPointer + TextLen; SkipSpaces; TextLen := GetTextLength(False); CurEntry.DateString := Copy(Data, DataPointer, TextLen); DataPointer := DataPointer + TextLen; SkipSpaces; if Data[DataPointer] <> #13 then begin TextLen := GetTextLength(False); CurEntry.IdString := Copy(Data, DataPointer, TextLen); DataPointer := DataPointer + TextLen; end; SkipTrash; TextLen := GetTextLength(True); CurEntry.Line1 := Copy(Data, DataPointer, TextLen); DataPointer := DataPointer + TextLen; SkipTrash; TextLen := GetTextLength(True); CurEntry.Line2 := OemToAnsi(Copy(Data, DataPointer, TextLen)); DataPointer := DataPointer + TextLen; SkipTrash; end; end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Parser: TMySimpleParser; FileStream: TFileStream; FileContents: TStringStream; i: Integer; begin FileStream := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'test.txt', fmOpenRead); FileContents := TStringStream.Create(''); FileContents.CopyFrom(FileStream, FileStream.Size); FileStream.Free; Parser := TMySimpleParser.Create; Parser.Parse(FileContents.DataString); FileContents.Free; StringGrid1.RowCount := Length(Parser.Entries); for i := 0 to High(Parser.Entries) do begin StringGrid1.Cells[0, i + 1] := IntToStr(Parser.Entries[i].Index); StringGrid1.Cells[1, i + 1] := Parser.Entries[i].DateString; StringGrid1.Cells[2, i + 1] := Parser.Entries[i].IdString; StringGrid1.Cells[3, i + 1] := Parser.Entries[i].Line1; StringGrid1.Cells[4, i + 1] := Parser.Entries[i].Line2; end; Parser.Free; end; |
Re: StringGrid mit Daten füllen und farblich Darstellen
Hallo zusammen, also das Beispiel ist echt super und Funktioniert auch wunderbar. Leider muss ich zu meiner Schande gestehen, das ich es echt nicht verstehe.
MFG Jens |
Re: StringGrid mit Daten füllen und farblich Darstellen
Ist dir denn klar, was ich grundsätzlich mache?
Ich lese den Text in ein dynamisches Array ein. Jeweils ein Datensatz wird in einem Record TMyDataEntry gespeichert. Mein Vorgehen: Ich verändere den String nicht, lösche also bereits bearbeitete Bereiche nicht, sondern gehe zeichenweise durch den Text. Wo ich im Text Data gerade bin speichere ich in DataPointer. So, jetzt zur Analyse selbst: Teilweise gehen die einzelnen Teile des Datensatzes bis zum Zeilenende, teilweise bis zum nächsten Leerzeichen. GetTextLength gibt das nächste Leerzeichen oder explizit das nächste Zeilenumbruchzeichen (wenn UpToLineEnd True ist) zurück. Mit Hilfe dieser Funktion weiß ich also die Länge des nächsten Teils des aktuellen Datensatzes. Den kopiere ich aus dem String, danach setze ich die Position dahinter (bis dahin bin ich ja fertig), und überspringe danach alle Leerzeichen (SkipSpaces) oder auch Leerzeichen und Zeilenumbruchszeichen (SkipTrash). Dann bin ich jeweils beim nächsten Bestandteil des Datensatzes. Am Ende sorge ich mit SkipTrash dafür, dass ich direkt vor dem nächsten Datensatz stehe, also alle folgenden Zeilenumbruchszeichen und Leerzeichen übersprungen habe (oder am Ende des Textes). Das mache ich bis ich am Ende des Textes angekommen bin. Danach kann ich das Array Entries auslesen, in dem die Datensätze gespeichert sind. |
Re: StringGrid mit Daten füllen und farblich Darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich will es mal so erklären, Verstanden habe ich schon, was Du da gemacht hast und wie das ganze so ungefähr ablaufen könnte. Das Problem ist nur, ich habe das ganz dann mal mit einer anderen Datei versucht anzupassen und da komme ich einfach nicht mit klar.
Ich bekomme schon dirrekt beim Compilieren die Meldung, das "Ereignis" kein Integer Wert ist. Das ist auch logisch, weil er wenn ich deinen weg verstanden habe nach der Ereignisnummer sucht, die bei dem Datensatz den du genutz hast am Anfang einer Zeile steht: Deine genutzt Datei: 102 01.02.00 21:05 ID: 2 Codebetrieb EIN Codebetrieb Andere Datei Ereignis: 0840 Datum: 25.11.2008, Uhrzeit: 17:45:56 Schalteinrichtung: 001 GESCHLOSSEN Hauptbereich: 001, Unterbereich: 000 Die Datei die Du genommen hast, hast du vermutlich aus einem anderen Tread von mir. Das Problem ist allerdings, das die Datensätze von Zentraletyp zu Zentralentyp unterschiedlich sind. Ich hänge dir mal eine Übungsprojekt von mir an, wo ich mich schon selber (vor unserem ersten Kontakt)mit dem Problem beschäftigt habe. In dem Zuge, kannst du ja auch mal sagen was Du von dem Übungsprojekt so hälst, da ich eigendlich selber Anfänger bin, habe ich in den letzten Tage mal angefangen Problem von mir in einem Übungsprojekt zu beschreiben und würde Sie gerne Später als Beitrag der Nachwelt zur Verfügung stellen. (Als Anfänger Übungstool). so jetzt wieder zum wichtigen Thema. Also wie Du sehen wirst unter Textdateien einlesen, gibt es ein SGTextdatei in dem ich michh versucht habe. Im Anhang dabei ist auch mal ein andere Datensatz. Achso, Die Daten lese ich Übrigens über eine COM-Schnittstelle ein. Jetzt ist für mich allein die Frage, Speicher ich die Daten dann erst in eine Textdate zwischen und bearbeite Sie oder bearbeiter ich Sie direkt und füge Sie ins Grid ein. Danke Übrigens nochmal für deine Mühe. MFG Jens |
Re: StringGrid mit Daten füllen und farblich Darstellen
Dort könntest du ähnlich vorgehen. Je nachdem ob da auch Leerzeichen / Zeilenumbruchszeichen drin stehen. Bis zum ersten : gehen, schauen ob da Ereignis steht. Bis zum Zeilenende lesen. Wieder bis zum : lesen, usw.
Du könntest das natürlich auch ohne Prüfung machen und einfach immer zeilenweise in einer TStringList vorgehen. In deiner neuen Testdatei sind ja keine weiteren Leer- oder Steuerzeichen drin. Den Text könntest du entweder direkt beim Empfang auswerten oder in einem String speichern und komplett in StringList.Text legen um die einzelnen Zeilen zu analysieren. // EDIT: Ach ja: Und wegen den verschiedenen Datenformaten könntest du jeweils eine Leseklasse mit einer gemeinsamen Hauptklasse schreiben, die du dann entsprechend benutzen kannst. |
Re: StringGrid mit Daten füllen und farblich Darstellen
Hallo Sebastian,
das ist ja genau mein Problem, was ich nicht verstehe, wie genau mache ich das mit dem suchen z.B. nach : oder soo und sage dann ließ davor oder ließ so lange. Also ich habe echt verstanden wie du das machst. Mein großes Problem, ist allerdings mein bescheidens Englisch und daher, versteh ich halt nicht genau wo du in den Funktion was und wie genau machst. Ich habe jetzt noch lange mit POS, POSEX, SEEK und StringReplaced gespielt, ich komme aber leider zu keinem Erfolgsbringenden Ergebnis. MFG Jens |
Re: StringGrid mit Daten füllen und farblich Darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, ich habe das Beispiel mal kurz umgeschrieben, es liegt im Anhang. Ich habe jetzt je eine Klasse für die beiden Formate erstellt, beide abgeleitet von einer Basisklasse. So kannst du möglichst viel wiederverwenden.
Ich hab das noch ein wenig mehr modularisiert, vielleicht hilft das beim Verständnis. Ohne konkrete Fragen weiß ich nicht so recht was ich erklären muss und was klar ist. Denn eigentlich sollte auch der Debugger beim Verständnis helfen. ;-) |
Re: StringGrid mit Daten füllen und farblich Darstellen
Alles klar, werde das später noch durcharbeiten und mich dann heute oder morgen mal mit konkreten Fragen melden.
Ich hoffe das ist OK MFG Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 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