Einzelnen Beitrag anzeigen

magnusp

Registriert seit: 1. Apr 2017
3 Beiträge
 
#1

Generics Type feststellen?

  Alt 1. Apr 2017, 11:57
Delphi-Version: 10 Berlin
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?
  Mit Zitat antworten Zitat