Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Textdatei (txt) in Stringgrid einlesen

  Alt 10. Nov 2009, 17:45
Ich würde mir einen Record oder noch besser eine Klasse deklarieren, die die zusammenhängenden Daten beinhaltet. Dann die Textdatei einlesen, die einzelne Zeile parsen und dem Record/der Klasse die Einzelwerte zuweisen. Die Records/Objekte werden dann in einer Liste verwaltet, sortiert und im StringGrid ausgegeben. Hier das Ganze einmal in Code gepackt:
Delphi-Quellcode:
uses math;

//Deklaration der Klasse
type
  TDatensatz = class
  private
    FBuchstabe: Char;
    FZahl: Double;
  public
    property Buchstabe: Char read FBuchstabe write FBuchstabe;
    property Zahl: Double read FZahl write FZahl;
  end;

//Sortierfunktion
function CompareFunc(Item1, Item2: Pointer): integer;
begin
  if SameValue(TDatensatz(Item1).Zahl, TDatensatz(Item2).Zahl) then
    Result := 0
  else if TDatensatz(Item1).Zahl < TDatensatz(Item2).Zahl then
    Result := -1
  else
    Result := 1;
end;

procedure TfrmStringGridDemo.Button1Click(Sender: TObject);
const Pfad = 'C:\Test\Test.txt'; //nur zum Testen hartkodiert
var aObject: TDatensatz;
    aList: TStringlist;
    i, FirstBracket, SecondBracket: integer;
    s: string;
begin
  //evtl. bereits enthaltene Objekte löschen
  FObjects.Clear;

  //Stringliste erzeugen und aus Datei einlesen
  aList := TStringlist.Create;
  try
    aList.LoadFromFile(Pfad);

    //Dafür sorgen, dass genügend Zellen im StringGrid verfügbar sind
    if (StringGrid1.ColCount - StringGrid1.FixedCols) < aList.Count then
      StringGrid1.ColCount := aList.Count + StringGrid1.FixedCols;
    if (StringGrid1.RowCount - StringGrid1.FixedRows) < 5 then
      StringGrid1.RowCount := StringGrid1.FixedRows + 5;

    //Datei zeilenweise auswerten, Objekt erzeugen, Werte zuweisen
    for i := 0 to aList.Count - 1 do
      begin
        aObject := TDatensatz.Create;
        if trim(aList[i]) <> 'then
          aObject.Buchstabe := trim(aList[i])[1];
        FirstBracket := Pos('(',aList[i]);
        SecondBracket := Pos(')',aList[i]);
        s := Copy(aList[i],FirstBracket + 1, SecondBracket - FirstBracket - 1);
        aObject.Zahl := StrToFloatDef(s,0);

        //... und der Liste hinzufügen
        FObjects.Add(aObject);
      end;

    //Liste sortieren
    FObjects.Sort(@CompareFunc);
    StringGrid1.Rows[StringGrid1.FixedRows + 3].BeginUpdate;
    StringGrid1.Rows[StringGrid1.FixedRows + 4].BeginUpdate;
    try
      //... und Werte in der StringGrid ausgeben
      for i := 0 to FObjects.Count - 1 do
        begin
          StringGrid1.Cells[StringGrid1.FixedCols + i,StringGrid1.FixedRows + 3] := TDatensatz(FObjects[i]).Buchstabe;
          StringGrid1.Cells[StringGrid1.FixedCols + i,StringGrid1.FixedRows + 4] := FloatToStr(TDatensatz(FObjects[i]).Zahl);
        end;
    finally
      StringGrid1.Rows[StringGrid1.FixedRows + 3].EndUpdate;
      StringGrid1.Rows[StringGrid1.FixedRows + 4].EndUpdate;
    end;
  finally
    //Stringliste wieder freigeben
    aList.Free;
  end;
end;

//mit dem Formular Objektliste erzeugen
procedure TfrmStringGridDemo.FormCreate(Sender: TObject);
begin
  FObjects := TObjectList.Create;
end;

//und am Ende entsorgen
procedure TfrmStringGridDemo.FormDestroy(Sender: TObject);
begin
  FObjects.Free;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat