8288分类目录 8288分类目录 8288分类目录
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

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

来源:本站原创 浏览:153次 时间:2021-09-11
写了一个字符串的二维表: TSta    


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



unit STA;interfaceuses System.SysUtils, System.Classes;type  TSta = record    FSeparator: Char;    FArr: TArray<TArray>;    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);    procedure SetSeparator(const Value: Char);    function GetRowCount: Integer;    procedure SetRowCount(const Value: Integer);    function ToString: string;    procedure Clear;    procedure LoadFromFile(const aFileName: string; aEncoding: TEncoding = nil);    procedure SaveToFile(const aFileName: string; aEncoding: TEncoding = nil);    property Separator: Char read FSeparator write SetSeparator;    property RowCount: Integer read GetRowCount write SetRowCount;    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;  i: Integer;begin  FSeparator := aSeparator;  tArr := aStr.Split([sLineBreak], ExcludeEmpty);  SetLength(FArr, Length(tArr));  for i := 0 to High(FArr) do  begin    FArr[i] := tArr[i].Split([FSeparator]);  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 FSeparator := ';';  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  Result := '';  if i < Length(FArr) then  begin    if Length(FArr[i]) > 0 then      Result := Result.Join(FSeparator, FArr[i]);  end;end;function TSta.GetRowCount: Integer;begin  Result := Length(FArr);end;procedure TSta.SetRow(i: Integer; Value: string);var  k,n: Integer;begin  if Value.Trim = '' then Exit;  if Length(FArr) = 0 then FSeparator := ';';  n := Length(FArr);  if i >= n then  begin    SetLength(FArr, i+����,����1);    for k := n to i - 1 do SetLength(FArr[k], 1);  end;  FArr[i] := Value.Split([FSeparator]);end;procedure TSta.SetRowCount(const Value: Integer);begin  SetLength(FArr, Value);end;procedure TSta.SetSeparator(const Value: Char);begin  FSeparator := Value;  if Length(FArr) = 0 then SetLength(FArr, 1); //直接使用索引赋值时, 会根据 Length(FArr) 是否为 0 来设置默认分隔符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;


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net