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

------------------------------------------------------------------------------------------------------------------------------------------

unit STA;

interface

uses System.SysUtils, System.Classes;

type
TSta = record
FSeparator: 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);
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, );
end; constructor TSta.Create(const aStr: string; const aSeparator: Char);
var
tArr: TArray<string>;
i: Integer;
begin
FSeparator := aSeparator;
tArr := aStr.Split([sLineBreak], ExcludeEmpty);
SetLength(FArr, Length(tArr));
for i := to High(FArr) do
begin
FArr[i] := tArr[i].Split([FSeparator]);
end;
end; function TSta.GetItem(i,j: Integer): string;
begin
Result := '';
if (i < ) or (j < ) 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) = then FSeparator := ';';
n := Length(FArr);
if i >= n then
begin
SetLength(FArr, i+);
for k := n to i - do SetLength(FArr[k], );
end;
if j >= Length(FArr[i]) then SetLength(FArr[i], j+);
FArr[i,j] := Value.Trim;
end; function TSta.GetRow(i: Integer): string;
begin
Result := '';
if i < Length(FArr) then
begin
if Length(FArr[i]) > 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) = then FSeparator := ';';
n := Length(FArr);
if i >= n then
begin
SetLength(FArr, i+);
for k := n to i - do SetLength(FArr[k], );
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) = then SetLength(FArr, ); //直接使用索引赋值时, 会根据 Length(FArr) 是否为 来设置默认分隔符
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) = then Exit('');
Result := Rows[];
for i := 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[,]; //AAA
str := S[,]; //
str := S[,]; //越界读取返回空 str := S.Rows[]; //AAA;BBB;CCC
str := S.Rows[]; //;; str := S.ToString; //AAA;BBB;CCC
//;: S.Separator := '&'; //更换分隔符; 默认是分号; 也可在 Create 时指定
str := S.Rows[]; //&&
ShowMessage(str);
end; procedure TForm1.Button2Click(Sender: TObject);
var
S: TSta;
str: string;
begin
S[,] := 'aaa';
S[,] := 'bbb';
S[,] := 'ccc';
S[,] := 'zzz'; str := S.ToString; //aaa;bbb;ccc
//
//;;zzz S.Rows[] := '111;222;333';
str := S.ToString; //aaa;bbb;ccc
//;;
//;;zzz
// ShowMessage(str);
end; procedure TForm1.Button3Click(Sender: TObject);
const
nFileName = 'c:\temp\staTest.txt';
var
S: TSta;
str: string;
begin
S[,] := 'aaa';
S[,] := 'bbb';
S[,] := 'ccc';
S[,] := '';
S[,] := '';
S[,] := '';
S[,] := '';
S.SaveToFile(nFileName); //保存到文件
S.Clear;
str := S[,]; //空
// ShowMessage(str); S.LoadFromFile(nFileName); //从文件读取
str := S[,]; //aaa
str := S.Rows[]; //aaa;bbb;ccc
// ShowMessage(str);
end;

http://www.cnblogs.com/del/

												

写了一个字符串的二维表: TSta的更多相关文章

  1. 自己封装的一个简易的二维表类SimpleTable

    在QT中,QTableWidget处理二维表格的功能很强大(QTableView更强大),但有时我们只想让它显示少量数据(文字和图片),这时,使用QTableWidget就有点不方便了(个人感觉).所 ...

  2. 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)

    最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...

  3. Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)

    因为面试时问了我这道题,导致我想去了解信号槽到底是如何实现的,于是贴着顺序看了下源码,大致了解了整个框架.网上关于信号槽的文章也很多,但是大部分都是将如何应用的,这里我就写一下我所理解的如何实现吧, ...

  4. java_web学习(四) 二维表的制作(初步接触MVC)

    我们需要做一个jsp页面,动态显示信息表的内容. 一.需求分析 1.  做一个实体类:StudentInfo (包含4个字段) 2.  如图模拟生成3条数据,本质上就是new StudentInfo ...

  5. Excel:一维表和二维表 互转

    一.一维表转二维表 数据源: 一份流水账式的值班表,为了便于打印张贴,现在需要使其变成这样的样式: 也就是从一维表变成传说中的二维表. 1.新建查询 依次单击[数据]→[新建查询] →[从文件]→[从 ...

  6. linux 进阶2--C++读取lua文件中的变量、一维表、二维表

    lua 语言非常灵活,一般把lua 作为脚本文件,会用C++与之进行交互.最重要的是C++代码能读取到脚本中的变量.一维表.二维表. 这样有些参数就可以在lua文件进行更改,而不用重新更改C++代码. ...

  7. Oracle【二维表管理:约束】

    1.简单的表创建和字段类型最简单的方式去创建表(没有添加主键之类的约束条件)[Oracle的字段类型]number:数值类型--整数类型:number(a) 总长度a--小数类型:number(a,b ...

  8. 数据可视化之PowerQuery篇(四)二维表转一维表,看这篇文章就够了

    https://zhuanlan.zhihu.com/p/69187094 数据分析的源数据应该是规范的,而规范的其中一个标准就是数据源应该是一维表,它会让之后的数据分析工作变得简单高效. 在之前的文 ...

  9. 议:如何将树形菜单形式的数据转化成HTML的二维表(相同内容需合并单元格)

    一般做OA类管理系统,经常涉及到“组织架构”的概念,那么像这种有上下层级关系的数据一般会做成树形菜单的方式显示,底层代码必定会用到递归算法.这篇随笔的目的就是要谈谈除了用树形菜单来显示这种上下层级关系 ...

随机推荐

  1. Java基础-四大特性理解(抽象、封装、继承、多态)

    抽象: 象就是有点模糊的意思,还没确定好的意思. 就比方要定义一个方法和类.但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口.具体怎么用,要做什么,我不用关心,由使用的人自己去定义去 ...

  2. 【CodeForces 624C】Graph and String

    题 题意 n个表示abc三个字符的点,所有a和b是相连的,所有b和c是相连的,所有相同的是相连的,现在给你n个点和他们之间的m条边,判断是否存在这样的字符串,存在则给出一个符合条件的. 分析 我的做法 ...

  3. GMM算法k-means算法的比较

    1.EM算法 GMM算法是EM算法族的一个具体例子. EM算法解决的问题是:要对数据进行聚类,假定数据服从杂合的几个概率分布,分布的具体参数未知,涉及到的随机变量有两组,其中一组可观测另一组不可观测. ...

  4. opencv笔记4:模板运算和常见滤波操作

    time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...

  5. 【uoj222】 NOI2016—区间

    http://uoj.ac/problem/222 (题目链接) 题意 有n个区间,当有m个区间有公共部分时,求m个区间长度的最大值与最小值之差的最小值. Solution 线段树+滑动窗口.这道题很 ...

  6. mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题

    我们公司的项目使用spring+mybatis组合.所以就必须得使用mybatis-spring了.所以此处就昨日mybatis-spring从1.1升级到1.2所带来的dao层级的编写问题,做了一个 ...

  7. params参数的调用

    namespace params参数的用法 { class Program { public static void Test(string name,params int[] score) { ; ...

  8. PRML Chapter 1. Introduction

    PRML Chapter 1. Introduction 为了防止忘记,要把每章的重要内容都记下来,从第一章开始 2012@3@28 今天又回去稍微翻了一下第一章内容,发现第一次看的时候没有看透,每次 ...

  9. Bootstrap 新手学习笔记——布局组件

    1.字形图标: <button type="button" class="btn btn-primary btn-lg" style="font ...

  10. 我的前端MVC之路

    大约十几个月前,了解到时下前端MVC之火爆,同事推荐我了解一下angular.当时也不是特别在意,只是稍稍阅读了一遍官方文档,并尝试了文档上的例子.其实当时也颇有震惊之感的,原来代码还可以这么写!看完 ...