Hi!
Tolles Forum habt ihr hier!!!
Ich hatte früher mal einwenig mit Delphi herumgespielt und bin jetzt wieder mit der Starter Edition eingestiegen...
und stehe gleich mal for dem ersten Problem. Ich wollte so zum Üben ein TCSVFile<T> - Klasse machen mit der man ganzahlige aber auch reelle Dateien lesen/schreiben kann.
Daher habe ich dann sowas:
Code:
TCSVFileExt<T> = Class
private
fData: Array Of Array Of T;
function GetData(Col, Row: Integer): T;
procedure SetData(Col, Row: Integer; const Value: T);
public
procedure Clear;
procedure LoadFromFile(FileName: String);
property Data[Col, Row: Integer]: T read GetData write SetData;
End;
Das is nur ein aufs wesentliche beschränkter Auszug, denn es scheitert bereits beim LoadFromFile:
Code:
procedure TCSVFileExt<T>.LoadFromFile(FileName: String);
var
LTmp: TStringList;
i, LEnd: Integer;
sa: TStringDynArray;
j: Integer;
LFmtSet: TFormatSettings;
begin
LTmp := TStringList.Create;
try
LTmp.LoadFromFile(FileName);
TrimData(LTmp);
fColCount := CalcColCount(LTmp);
fRowCount := LTmp.Count;
if (fColCount > 0) And (fRowCount > 0) then
begin
SetLength(fData, fColCount, fRowCount);
for i := 0 to fRowCount-1 do
begin
sa := SplitString(LTmp[i], ',');
LEnd := Min(fColCount, Length(sa));
if (T= Integer) then //<---- geht nicht
begin
for j := 0 to LEnd-1 do
begin
fData[i,j] := StrToIntDef(sa[j], 0);
end;
end
else if (T Is Double) Or (T Is Extended) Or (T Is Single) then //<---- geht auch nicht
begin
LFmtSet := FormatSettings.Create;
LFmtSet.DecimalSeparator := '.';
for j := 0 to LEnd-1 do
begin
fData[i,j] := StrToFloatDef(sa[j], 0.0, LFmtSet);
end;
end;
// more types here... -> else if (T Is Cardinal) then ... else if (T Is Int64) ... UInt64 ... usw.
end;
end
else
Clear;
finally
LTmp.Free;
end;
end;
Das selbe würde dann ja auch für SaveToFile nötig sein.
Gibts da eine Lösung oder habe ich den Wurm im Kopf und sehe vor lauter Wald die Bretter nicht?