写了一个字符串的二维表: TSta

    添加时间:2013-7-23 点击量:


    STA 单位 (用到 System.SysUtils.TStringHelper):



    unit STA;

    interface

    uses System.SysUtils, System.Classes;

    type
    TSta = record
    Separator: Char;
    FArr: TArray<TArray<string>>;
    constructor Create(const aStr: string; const aSeparator: Char = ;); overload;
    class operator Explicit(const aStr: string): TSta;
    class operator Implicit(const aStr: string): TSta;
    function GetItem(i,j: Integer): string;
    procedure SetItem(i,j: Integer; Value: string);
    function GetRow(i: Integer): string;
    procedure SetRow(i: Integer; Value: string);
    function ToString: string;
    procedure Clear;
    procedure LoadFromFile(const aFileName: string; aEncoding: TEncoding = nil);
    procedure SaveToFile(const aFileName: string; aEncoding: TEncoding = nil);
    property Items[i,j: Integer]: string read GetItem write SetItem; default;
    property Rows[i: Integer]: string read GetRow write SetRow;
    end;

    implementation

    { TSta }

    procedure TSta.Clear;
    begin
    SetLength(FArr, 0);
    end;

    constructor TSta.Create(const aStr: string; const aSeparator: Char);
    var
    tArr: TArray<string>;
    i: Integer;
    begin
    Separator := aSeparator;
    tArr := aStr.Split([sLineBreak], ExcludeEmpty);
    SetLength(FArr, Length(tArr));
    for i := 0 to High(FArr) do
    begin
    FArr[i] := tArr[i].Split([Separator]);
    end;
    end;

    function TSta.GetItem(i,j: Integer): string;
    begin
    Result := ;
    if (i < 0) or (j < 0) then Exit;
    if (i < Length(FArr)) and (j < Length(FArr[i])) then
    Result := FArr[i, j].Trim;
    end;

    procedure TSta.SetItem(i,j: Integer; Value: string);
    var
    k,n: Integer;
    begin
    if Value.Trim = then Exit;
    if Length(FArr) = 0 then Separator := ;;
    n := Length(FArr);
    if i >= n then
    begin
    SetLength(FArr, i+1);
    for k := n to i - 1 do SetLength(FArr[k], 1);
    end;
    if j >= Length(FArr[i]) then SetLength(FArr[i], j+1);
    FArr[i,j] := Value.Trim;
    end;

    function TSta.GetRow(i: Integer): string;
    begin
    if i < Length(FArr) then
    Result := Result.Join(Separator, FArr[i]).Trim
    else
    Result := ;
    end;

    procedure TSta.SetRow(i: Integer; Value: string);
    begin
    if Value.Trim = then Exit;
    if Length(FArr) = 0 then Separator := ;;
    if i >= Length(FArr) then SetLength(FArr, i+1);
    FArr[i] := Value.Split([Separator]);
    end;

    class operator TSta.Explicit(const aStr: string): TSta;
    begin
    Result := TSta.Create(aStr);
    end;

    class operator TSta.Implicit(const aStr: string): TSta;
    begin
    Result := TSta.Create(aStr);
    end;

    function TSta.ToString: string;
    var
    i: Integer;
    begin
    if Length(FArr) = 0 then Exit();
    Result := Rows[0];
    for i := 1 to High(FArr) do
    Result := Result + sLineBreak + Rows[i];
    end;

    procedure TSta.LoadFromFile(const aFileName: string; aEncoding: TEncoding);
    begin
    if not FileExists(aFileName) then Exit;
    if aEncoding = nil then aEncoding := TEncoding.Default;
    with TStringList.Create do begin
    LoadFromFile(aFileName, aEncoding);
    Self := Text;
    Free;
    end;
    end;

    procedure TSta.SaveToFile(const aFileName: string; aEncoding: TEncoding);
    begin
    if aEncoding = nil then aEncoding := TEncoding.Default;
    with TStringList.Create do begin
    Text := Self.ToString;
    SaveToFile(aFileName, aEncoding);
    Free;
    end;
    end;

    end.




    测试:



    uses STA;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    S: TSta;
    str: string;
    begin
    S := AAA;BBB;CCC + sLineBreak + 111;222;333; //可以从字符串隐式或显式地转换到 TSta

    str := S[0,0]; //AAA
    str := S[1,2]; //333
    str := S[9,9]; //越界读取返回空

    str := S.Rows[0]; //AAA;BBB;CCC
    str := S.Rows[1]; //111;222;333

    str := S.ToString; //AAA;BBB;CCC
    //111;222:333

    S.Separator := &; //调换分隔符; 默认是分号; 初始化时, 也经由过程 Create 办法指定分隔符
    str := S.Rows[1]; //111&222&333
    ShowMessage(str);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var
    S: TSta;
    str: string;
    begin
    S[0,0] := aaa;
    S[0,1] := bbb;
    S[0,2] := ccc;
    S[2,2] := zzz;

    str := S.ToString; //aaa;bbb;ccc
    //
    //;;zzz

    S.Rows[1] := 111;222;333;
    str := S.ToString; //aaa;bbb;ccc
    //111;222;333
    //;;zzz
    // ShowMessage(str);
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    const
    nFileName = c:\temp\staTest.txt;
    var
    S: TSta;
    str: string;
    begin
    S[0,0] := aaa;
    S[0,1] := bbb;
    S[0,2] := ccc;
    S[1,0] := 111;
    S[1,1] := 222;
    S[1,2] := 333;
    S[1,3] := 444;
    S.SaveToFile(nFileName); //保存到文件
    S.Clear;
    str := S[0,0]; //空
    // ShowMessage(str);

    S.LoadFromFile(nFileName); //从文件读取
    str := S[0,0]; //aaa
    str := S.Rows[0]; //aaa;bbb;ccc
    // ShowMessage(str);
    end;

    真正的心灵世界会告诉你根本看不见的东西,这东西需要你付出思想和灵魂的劳动去获取,然后它会照亮你的生命,永远照亮你的生命。——王安忆《小说家的十三堂课》
    分享到: