AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi StringGrid mit Daten füllen und farblich Darstellen

StringGrid mit Daten füllen und farblich Darstellen

Ein Thema von Jens Hartmann · begonnen am 29. Jan 2009 · letzter Beitrag vom 6. Apr 2009
Antwort Antwort
Seite 2 von 11     12 34     Letzte » 
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#11

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 30. Jan 2009, 21:50
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:
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;
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.

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
Miniaturansicht angehängter Grafiken
oberfl_che_188.jpg  
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#12

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 31. Jan 2009, 08:02
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:
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;
MFG

Jens
Miniaturansicht angehängter Grafiken
oberfl_che_neu_173.jpg  
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.304 Beiträge
 
Delphi 10.4 Sydney
 
#13

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 1. Feb 2009, 00:09
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;
Angehängte Dateien
Dateityp: zip test_193.zip (2,4 KB, 30x aufgerufen)
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#14

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 2. Feb 2009, 19:48
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.304 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 2. Feb 2009, 20:52
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#16

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 2. Feb 2009, 21:30
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
Angehängte Dateien
Dateityp: zip allgemein_177.zip (297,5 KB, 16x aufgerufen)
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.304 Beiträge
 
Delphi 10.4 Sydney
 
#17

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 4. Feb 2009, 16:54
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#18

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 4. Feb 2009, 20:53
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.304 Beiträge
 
Delphi 10.4 Sydney
 
#19

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 9. Feb 2009, 18:51
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.
Angehängte Dateien
Dateityp: zip test_neu_144.zip (243,5 KB, 19x aufgerufen)
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#20

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 9. Feb 2009, 19:42
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf