Borland har lavet TStringList til at løse dette (og det står vist også i det link som stoney har lagt):
procedure TfrmMain.Button1Click(Sender: TObject);
var
i, j : integer;
Lines : TStringList;
Fields : TStringList;
begin
Lines := TStringList.Create;
Fields := TStringList.Create;
try
Fields.Delimiter := ';';
Lines.LoadFromFile('test.txt');
for i := 0 to Lines.Count - 1 do
begin
Fields.CommaText := Lines[i]; // Nu er felterne separeret i feltlisten
for j := 0 to Fields.Count - 1 do
begin
// Behandl' liniens felter her
case j of
0 : fFornavn := Fields[j];
1 : fEfternavn := Fields[j];
2 : fValuta := StrToFloat(Fields[j]);
// osv, osv
end;
end;
end;
finally
Fields.Free;
Lines.Free;
end;
end;
03. september 2006 - 12:46
#4
Håber du fandt ud af at bruge de to lister; hvis ikke så kan det efterfølgende være lidt værre... Kom lige til at sidde og nørde lidt med opgaven og resultatet (som ikke er testet, da jeg blev "ramt" af familien igen) er her. Det kunne godt være mere objektorienteret, men til gengæld er det ret funktionelt idet du med en instans af TValutaList kan tilgå felterne helt vilkårligt hvis du skulle ønske det: ValutaList[Linie,Felt]. Ideelt set burde man lave en TValutaData der indeholdt hvert enkelt felt udspecificeret, eksempelvis Valuta, Kurs, Beloeb ...
unit UValuta;
interface
uses
SysUtils, ContNrs, Classes, Math;
type
TValutaData = class(TStringList);
TValutaList = class
private
fLines : TObjectList;
fFieldsCount : integer;
function GetField(const aLine, aField: integer): string;
public
constructor Create;
destructor Destroy; override;
property Items[const aLine, aField : integer] : string read GetField; default;
function Count : integer;
property FieldsCount : integer read fFieldsCount;
procedure Clear;
procedure LoadFromStream(aStream : TStream);
procedure SaveToStream(aStream : TStream);
procedure LoadFromFile(const aFilename : string);
procedure SaveToFile(const aFilename : string);
end;
implementation
{ TValutaList }
procedure TValutaList.Clear;
begin
fLines.Clear;
end;
function TValutaList.Count: integer;
begin
result := fLines.Count;
end;
constructor TValutaList.Create;
begin
inherited Create;
fFieldsCount := -1;
fLines := TObjectList.Create(true);
end;
destructor TValutaList.Destroy;
begin
try
fLines.Free;
finally
inherited;
end;
end;
function TValutaList.GetField(const aLine, aField: integer): string;
begin
result := TStringList(fLines[aLine])[aField];
end;
procedure TValutaList.LoadFromFile(const aFilename: string);
var
fs : TFileStream;
begin
fs := TFileStream.Create(aFilename,fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(fs);
finally
fs.Free;
end;
end;
procedure TValutaList.LoadFromStream(aStream: TStream);
var
i : integer;
List : TStringList;
Fields : TStringList;
begin
List := TStringList.Create;
try
fLines.Clear;
List.LoadFromStream(aStream);
for i := 0 to List.Count - 1 do
begin
Fields := TStringList.Create;
Fields.Delimiter := ';';
Fields.CommaText := List[i];
fFieldsCount := max(fFieldsCount,Fields.Count); // Registrér max antal felter
fLines.Add(Fields);
end;
finally
List.Free;
end;
end;
procedure TValutaList.SaveToStream(aStream: TStream);
var
i : integer;
begin
for i := 0 to fLines.Count - 1 do
TStringList(fLines[i]).SaveToStream(aStream);
end;
procedure TValutaList.SaveToFile(const aFilename: string);
var
fs : TFileStream;
begin
fs := TFileStream.Create(aFilename,fmCreate);
try
SaveToStream(fs);
finally
fs.Free;
end;
end;
end.