Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
Delphi 12 Athens
|
Re: Textdatei (txt) in Stringgrid einlesen
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
|
|
Zitat
|