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