写了一个字符串的二维表: TSta
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的更多相关文章
- 自己封装的一个简易的二维表类SimpleTable
在QT中,QTableWidget处理二维表格的功能很强大(QTableView更强大),但有时我们只想让它显示少量数据(文字和图片),这时,使用QTableWidget就有点不方便了(个人感觉).所 ...
- 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)
最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...
- Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)
因为面试时问了我这道题,导致我想去了解信号槽到底是如何实现的,于是贴着顺序看了下源码,大致了解了整个框架.网上关于信号槽的文章也很多,但是大部分都是将如何应用的,这里我就写一下我所理解的如何实现吧, ...
- java_web学习(四) 二维表的制作(初步接触MVC)
我们需要做一个jsp页面,动态显示信息表的内容. 一.需求分析 1. 做一个实体类:StudentInfo (包含4个字段) 2. 如图模拟生成3条数据,本质上就是new StudentInfo ...
- Excel:一维表和二维表 互转
一.一维表转二维表 数据源: 一份流水账式的值班表,为了便于打印张贴,现在需要使其变成这样的样式: 也就是从一维表变成传说中的二维表. 1.新建查询 依次单击[数据]→[新建查询] →[从文件]→[从 ...
- linux 进阶2--C++读取lua文件中的变量、一维表、二维表
lua 语言非常灵活,一般把lua 作为脚本文件,会用C++与之进行交互.最重要的是C++代码能读取到脚本中的变量.一维表.二维表. 这样有些参数就可以在lua文件进行更改,而不用重新更改C++代码. ...
- Oracle【二维表管理:约束】
1.简单的表创建和字段类型最简单的方式去创建表(没有添加主键之类的约束条件)[Oracle的字段类型]number:数值类型--整数类型:number(a) 总长度a--小数类型:number(a,b ...
- 数据可视化之PowerQuery篇(四)二维表转一维表,看这篇文章就够了
https://zhuanlan.zhihu.com/p/69187094 数据分析的源数据应该是规范的,而规范的其中一个标准就是数据源应该是一维表,它会让之后的数据分析工作变得简单高效. 在之前的文 ...
- 议:如何将树形菜单形式的数据转化成HTML的二维表(相同内容需合并单元格)
一般做OA类管理系统,经常涉及到“组织架构”的概念,那么像这种有上下层级关系的数据一般会做成树形菜单的方式显示,底层代码必定会用到递归算法.这篇随笔的目的就是要谈谈除了用树形菜单来显示这种上下层级关系 ...
随机推荐
- yii2图片上传
yii2利用自带UploadedFile上传图片 public static function uploadFile($name) { $uploadedFile = UploadedFile::ge ...
- Java编程思想学习(十) 正则表达式
正则表达式是一种强大的文本处理工具,使用正则表达式我们可以以编程的方法,构造复杂的文本模式,并且对输入的字符串进行搜索.在我看来,所谓正则表达式就是我们自己定义一些规则,然后就可以验证输入的字符串是不 ...
- TortoiseSVN客户端如何更改新的URL
问题: 我们的服务器换了新的URL地址,这时候我们本地的SVN访问帐号和地址就要重新定义了. 解决步骤: 1:重新定义SVN的URL,右键(TortoiseSVN) → Relocate → 输入你新 ...
- IIS FTP Server Anonymous Writeable Reinforcement, WEBDAV Anonymous Writeable Reinforcement(undone)
目录 . 引言 . IIS 6.0 FTP匿名登录.匿名可写加固 . IIS 7.0 FTP匿名登录.匿名可写加固 . IIS >= 7.5 FTP匿名登录.匿名可写加固 . IIS 6.0 A ...
- 新建的 web 工程 有红色的惊叹号
新建的 web 工程 有红色的感叹号问题: 在eclipse 中新建一个web工程,但是工程上有红色的感叹号.解决: 1.右键工程,选择Build Path-->Configur ...
- Weka算法Classifier-tree-J48源代码分析(一个)基本数据结构和算法
大约一年,我没有照顾的博客,再次拿起笔不知从何写上,想来想去手从最近使用Weka要正确书写. Weka为一个Java基础上的机器学习工具.上手简单,并提供图形化界面.提供如分类.聚类.频繁项挖掘等工具 ...
- Python初学笔记
一.安装:直接通过软件管理程序,搜索Python,安装:安装过程中自定义路径,有个选项类似“add Python3.5 to Path”,勾选后便可以在cmd命令窗口,通过输入Python,启动Pyt ...
- hibernate提供的5种检索数据方式
一.五种检索数据方式 1.OID检索,即使用session.get或session.load通过类及指定id查询数据,如Customer c=(Customer)session.get("C ...
- Socket 入门- 客户端回射程序
结果输出:------------------------------------------------------客户端:xx@xxxxxx:~/Public/C$ ./postBackCli.o ...
- hdu 1201 18岁生日
#include <stdio.h> int r(int y) { return (y%4==0&&y%100!=0)||(y%400==0); } int f(int y ...