Einzelnen Beitrag anzeigen

Benutzerbild von Jens Hartmann
Jens Hartmann

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

Re: StringGrid mit Daten füllen und farblich Darstellen

  Alt 17. Feb 2009, 18:05
Hab es hinbekommen, den kompletten Datensatz auszuwerten. Und bekomme auch alle Rückgaben in mein Unit zurück. Leider habe ich jetzt ein anderes Problem.

Die Daten werden nur dann in mein StringGrid eingetragen, wenn ich im Debugmodus im Unit Parsen einen Breakpoint setze.
Nehme ich dann den Breakpoint weg, sind meine Daten sauber und auch richtig sortiert in meinem StringGrid.

Lass ich mein Programm normal laufen, gelangen keine Einträge in mein StringGrid, In einem Memo kann ich aber sehen, das Daten kommen und auch übergeben werden.

Ich häng mal die komplette fertige Unit Parsen und die Übergabe an.. bzw füge sie als Code bei:

Delphi-Quellcode:
unit Parsen;

interface

uses
  Windows, SysUtils;

type
  TMyDataEntry = record
    LfdNr: Integer;
    Datum, Uhrzeit, Ereignis, Teilnehmer, Bereich : String;
  end;

  TMyBaseParser = class
  private
    Data: String;
    DataPointer: Integer;
    function OemToAnsi(const OemStr: string): string;
    procedure SkipSpaces;
    procedure SkipTrash;
    function GetTextLength(UpToLineEnd: Boolean): Integer;
    function ReadLine: String;
  public
    Entries: array of TMyDataEntry;
    procedure Parse(Text: String); virtual; abstract;
  end;

  TMyParserMB256plus = class(TMyBaseParser)
  private
  public
    procedure Parse(Text: String); override;
  end;

var
Zähler : integer;

implementation

{ TMySimpleBaseParser }

function TMyBaseParser.OemToAnsi(const OemStr: string): string;
begin
  SetLength(Result, Length(OemStr));
  if Length(Result) > 0 then
    OemToCharBuff(PChar(OemStr), PChar(Result), Length(Result));
end;

procedure TMyBaseParser.SkipSpaces;
begin
  while (DataPointer < Length(Data)) and (Data[DataPointer] = ' ') do
    Inc(DataPointer);
end;

procedure TMyBaseParser.SkipTrash;
begin
  while (DataPointer < Length(Data)) and (Data[DataPointer] in [#13, #10, #32]) do
    Inc(DataPointer);
end;

function TMyBaseParser.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
  CurPointer := DataPointer;

  while (CurPointer <= Length(Data)) and not IsTerminatingChar(CurPointer) do
    Inc(CurPointer);

  Result := CurPointer - DataPointer;
end;

function TMyBaseParser.ReadLine: String;
var
  TextLen: Integer;
begin
  TextLen := GetTextLength(True);
  Result := Copy(Data, DataPointer, TextLen);
  DataPointer := DataPointer + TextLen;
  SkipTrash;
end;

{ TMyParserMB256plus }


procedure TMyParserMB256plus.Parse(Text: String);
var
  CurEntry : ^TMyDataEntry;
  CurLine : String;
  TempDatum : String;
  Temp1 : String;
  Temp2 : String;

begin
  Data := Text;
  DataPointer := 1;
  SetLength(Entries, 0);
  SkipTrash;
  while DataPointer < Length(Data) do
  begin
    SetLength(Entries, Length(Entries) + 1);
    CurEntry := @Entries[High(Entries)];

{Indexbehandlungsroutine}
    CurLine := ReadLine;
    if Pos('Ereignis:', CurLine) = 1 then
      begin
        Delete(CurLine, 1, 10);
        CurEntry.LfdNr := StrToInt(CurLine);
        CurLine := ReadLine;
      end;

{Datum & Uhrzeitbehandlungsroutine}
    if Pos('Datum:', CurLine) = 1 then
      begin
        TempDatum := CurLine;
        Delete(CurLine, 1, 7);
        Delete(CurLine, 11, 19);
        CurEntry.Datum := CurLine;
        CurLine := TempDatum;
        Delete(Curline,1, 28);
        CurEntry.Uhrzeit := Curline;
        {Ende Datumseintrag}

{Ereignisbehandlungsroutine}
        CurEntry.Ereignis := ReadLine;
        CurLine := ReadLine;
      if Pos('Hauptbereich:', CurLine) <> 1 then
        begin
          if Pos('AP', CurLine)
          or Pos('IE', CurLine)
          or Pos('Makro', CurLine)
          or Pos('Modem', CurLine)= 1 then
            begin
              CurEntry.Teilnehmer := CurLine;
              CurEntry.Bereich := ReadLine;
            end;
        end
      else
        begin
          CurEntry.Bereich := CurLine;
        end;
      end;
  end;
end;
end.
Hier die Übernahme in mein Unit

Delphi-Quellcode:
procedure TForm1.TreeViewResult(ParserTreeView: TMyBaseParser);
var
  i: Integer;
begin
  for i := 0 to High(ParserTreeView.Entries) do
  begin
  if ParserTreeView.Entries[i].LfdNr = 0 then
    begin
      RCount := RCount+1;
      SGMB256plus.RowCount := RCount+1;
      Memo2.Lines.Add(IntToStr(ParserTreeView.Entries[i].LfdNr));
      SGMB256plus.Cells[0, RCount + 1] := IntToStr(ParserTreeView.Entries[i].LfdNr);
    end;
  if ParserTreeView.Entries[i].Datum <> 'then
    begin
      Memo3.Lines.Add(ParserTreeView.Entries[i].Datum);
      SGMB256plus.Cells[1, RCount + 1] := ParserTreeView.Entries[i].Datum;
    end;
  if ParserTreeView.Entries[i].Uhrzeit <> 'then
    begin
      Memo4.Lines.Add(ParserTreeView.Entries[i].Uhrzeit);
      SGMB256plus.Cells[2, RCount + 1] := ParserTreeView.Entries[i].Uhrzeit;
    end;
  if ParserTreeView.Entries[i].Ereignis <> 'then
    begin
      Memo5.Lines.Add(ParserTreeView.Entries[i].Ereignis);
      SGMB256plus.Cells[3, RCount + 1] := ParserTreeView.Entries[i].Ereignis;
    end;
  if ParserTreeView.Entries[i].Teilnehmer <> 'then
    begin
      Memo6.Lines.Add(ParserTreeView.Entries[i].Teilnehmer);
      SGMB256plus.Cells[4, RCount + 1] := ParserTreeView.Entries[i].Teilnehmer;
    end;
  if ParserTreeView.Entries[i].Bereich <> 'then
    begin
      Memo7.Lines.Add(ParserTreeView.Entries[i].Bereich);
      SGMB256plus.Cells[5, RCount + 1] := ParserTreeView.Entries[i].Bereich;
    end;
  end;
end;
Und im Anhang mal noch ein Bild im DebugModus, wo man sieht, das die Daten auch wirklich so sind, wie sie sein sollen.

Danke schon mal. Vieleicht weiß ja jemand woran es liegen kann..

MFG


Jens
Miniaturansicht angehängter Grafiken
_bergabeok_746.gif  
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat