`

Delphi 中 TStrings 一些用法

 
阅读更多
Delphi TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。
常规的用法大家都知道,现在来讨论它的一些高级的用法。
先把要讨论的几个属性列出来:
1、CommaText
2、Delimiter & DelimitedText
3、Names & values & valueFromIndex
先看第一个:CommaText。怎么用呢?用代码说话:
const
constr :String = 'aaa,bbb,ccc,ddd';
var
strs :TStrings;
i :Integer;
begin
strs := TStringList.Create;
strs.CommaText := constr;
for i := 0 to Strs.Count-1 do
ShowMessage(Strs);
end;
执行了这段代码后,可以看到ShowMessage显示出来的分别是:aaa bbb ccc ddd。
也就是说,strs.CommaText := constr这一句的作用,就是把一个字符串以','为分割符,分段添加到TStrings中。
那么如果不是以','来分割,又该怎么做呢?现在看第二个例子。使用Delimiter和DelimitedText。
const
constr :String = 'aaa\bbb\ccc\ddd';
var
strs :TStrings;
i :Integer;
begin
strs := TStringList.Create;
strs.Delimiter := '\';
strs.DelimitedText := constr;
for i := 0 to Strs.Count-1 do
ShowMessage(Strs);
end;
可以看到, 显示的效果和第一个例子是一模一样的。解释一下:
Delimiter为分隔符,默认为:','。DelimitedText就是按Delimiter为分隔符的一个串,得到赋值后回把这个字符串按Delimiter的字符添加到TStrings中。
说到这里,有想起一个属性,QuoteChar。其默认值为:'"'(不包括单引号)
有何用呢?看例子:
const
constr :String = '"aaa"\"bbb"\"ccc"\"ddd"';
var
strs :TStrings;
i :Integer;
begin
strs := TStringList.Create;
strs.Delimiter := '\';
strs.DelimitedText := constr;
for i := 0 to Strs.Count-1 do
ShowMessage(Strs);
end;
显示出来的仍然是aaa bbb ccc ddd。为什么不是:"aaa" "bbb" "ccc" "ddd"呢?
再来看一个例子:
const
constr :String = '|aaa|\|bbb|\|ccc|\|ddd|';
var
strs :TStrings;
i :Integer;
begin
strs := TStringList.Create;
strs.Delimiter := '\';
strs.QuoteChar := '|';
strs.DelimitedText := constr;
for i := 0 to Strs.Count-1 do
ShowMessage(Strs);
end;
显示出来的又是aaa bbb ccc ddd。对比一下,应该不难明白吧?这个就不多说了,用得也不多。
但是还要多说一句,当Delimiter为:','而QuoteChar为:'"'时,DelimitedText和CommaText是同等的。
最后要说的三个是:Names & values & valueFromIndex。
看看下面的代码:
const
constr :String = '0=aaa,1=bbb,2=ccc,3=ddd';
var
strs :TStrings;
i :Integer;
begin
strs := TStringList.Create;
strs.CommaText := constr;
for i := 0 to strs.Count-1 do
begin
ShowMessage(strs.Names);
ShowMessage(strs.values[strs.Names]);
ShowMessage(strs.valueFromIndex);
end;
end;
通过这个例子不难看出:
这个时候strs中的内容是:
0=aaa
1=bbb
2=ccc
3=ddd
而Names中则是:
0
1
2
3
在values中则是:
aaa
bbb
ccc
ddd
在网上看到了.原来可以这样的:

先StringReplace用一个特殊字符替代空格,然后StringReplace回来

ss:='aa|bb c| c';

ss:= StringReplace(ss,' ','#',[rfReplaceAll]);

s:= TStringList.Create;

s.Delimiter:= '|';

s.DelimitedText:= ss;

for i:= 0 to s.Count - 1 do

begin

s[i]:= StringReplace(s[i],'#',' ',[rfReplaceAll]);

memo1.Lines.Add(s[i]);

end;





DelimitedText空格也默认为分割符的原因很简单:

Borland的程序员把这个属性对应的write方法的一行代码写错了而已,

你找到classes文件中的

procedure TStrings.SetDelimitedText(const Value: string);

var

P, P1: PChar;

S: string;

begin

BeginUpdate;

try

Clear;

P := PChar(Value);

while P^ in [#1..' '] do

{$IFDEF MSWINDOWS}

P := CharNext(P);

{$ELSE}

Inc(P);

{$ENDIF}

while P^ <> #0 do

begin

if P^ = QuoteChar then

S := AnsiExtractQuotedStr(P, QuoteChar)

else

begin

P1 := P;

// while (P^ > ' ') and (P^ <> Delimiter) do

while (P^ > '') and (P^ <> Delimiter) do

看到我修改的地方了吧,大家读读代码就知道那位写源代码的大侠本意也应该如此,他多加个空格而已,所以就变成一遇到空格切分了.对了改完后要重新编译classes.pas文件,然后把输出的Dcu放到Lib目录下
分享到:
评论

相关推荐

    delphi 字符串、数组函数

    关于 Delphi字符串、数组的函数,包含【Copy】、【Concat】等函数

    json4delphi:JSON for Delphi,支持较早版本的Delphi(6或更高版本)

    json4delphi JSON for Delphi,支持较早版本的Delphi(6或更高版本) 对象-pascal本机代码,仅使用TList,TStrings和TStringList类例子: var Json: TJson; Str: Stringbegin Json := TJson.Create(); // put Json....

    详细的Delphi属性,新手

    delphi:子符串替换函数 delphi:TStrings的详细用法

    自定义控件之StringList

    vs2005自定义控件,实现了delphi中TStrings(TStringList)一样的效果

    DELPHI执行DOS命令控件.rar

    执行DOS命令的DELPHI控件: property StdOutRead :THandle read fOutputRead; property StdInWrite :THandle read fInputWrite; property StdErrRead :THandle read fErrorRead; procedure ...

    Delphi动态建立数据库别名.rar

    Delphi动态建立数据库别名的源码实例,源码包中一共介绍了4种在Delphi程序中动态地建立和使用别名的方法,每种方法都附有完整的源码文件,AliasN为数据库别名,DbLocat为数据库别名对应的目录,DriverN为驱动类型,对...

    Delphi将TableToClass 表文件转换成类文件.rar

    Delphi将TableToClass 表文件转换成类文件,//刷新数据库procedure RefreshDB;  //读取数据库名称列表  function ReadDBNameList: TStringList;  //读取数据表名称列表  function ReadTableNameList: ...

    Delphi 7以来的新语法特性

    在Delphi中,对对象的调用实际上采用了两个步骤,首先是把对象地址放入eax寄存器中,然后call类方法,所以如果不使用继承类增加数据的话,用父类调用继承类的方法是没问题的,所以其实这样的方法在D7中也可以使用,...

    delphi TStringList的使用

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。 常规的用法大家都知道,现在来讨论它的一些高级的用法。

    Delphi 2005 Reviewers Guide 2005

    很是奇怪,Delphi 9的What's New很长,但演示中却公布了为数不多的几个,希望到时下载好后使用这款软件的网友补充上。 1、新增For ... in 语法 类似Visual Basic的For Each : procedure ...

    Delphi网络公用函数

    //用NewToken替换S中所有Token bCaseSensitive:=true大小写敏感 function StrReplaceString(var S: string; const Token, NewToken: string; bCaseSensitive: Boolean): Boolean; //从第Index个起以Substr替换...

    Delphi编写的日志文件记录组件源程序

    Delphi编写的日志记录组件源代码,从中可以学习自定义组件的一些技巧,如注册到组件面板、添加自定义图标等。 日志组件具有以下属性及方法: public { Public declarations } procedure AddLog(p_Info: string); /...

    delphi通用函数单元

    procedure GetDisks(Strings: TStrings { TStringList ??? }); //获取所有盘符 procedure HideApp; //隐藏程序 function GetTmpPath: String; //取得WINDOWS的Temp路径 function GetSysPath: String; //取得...

    delphi通用函数单元一

    //▎====================...Filter,FileList:TStrings;ContainSubDir:Boolean; lb: TLabel=nil); { 功能说明:查找一个路径下的所有文件。 参数: path:路径,filter:文件扩展名过滤,FileList:文件列表, ContainSubDir...

    delphi 开发经验技巧宝典源码

    0034 在Delphi中禁止使用result 24 0035 如何在Delphi中录制代码 24 0036 如何编译器会提示数组太大时的处理技巧 25 0037 如何对超大数字进行计算 25 0038 强类型的定义及使用 25 2.2 类、函数、重载 25...

    delphi 开发经验技巧宝典源码06

    0034 在Delphi中禁止使用result 24 0035 如何在Delphi中录制代码 24 0036 如何编译器会提示数组太大时的处理技巧 25 0037 如何对超大数字进行计算 25 0038 强类型的定义及使用 25 2.2 类、函数、重载 25...

    GetFilenames

    Delphi中遍历目录和遍历目录及子目录函数 function GetFilenames(FilePath,ExtMask: String):TStrings; //遍历目录 function GetFilenamesEx(FilePath,ExtMask :String):TStrings; //遍历目录及子目录

    DELPHI分级别调试日志类,支持多种类型输出,支持多线程模式.

    ,然后直接使用Debug_WriteLog(),可以使用Debug_StartLog()和Debug_StopLog() 控制日志开关. * *修改记录:2011-05-15 18:15:52 * 2011-06-25 00:05:51 修改直调函数增加控制日志开关函数 2011-07-04 02:39...

    最新Ehlib 5.2.84(含完整源代码,支持delphi XE)

    本人已在Delphi XE中运行通过,在本人编制的进销存软件中应用完全正常。 注:Delphi 2010、XE里面安装不要修改bpl文件的输出路径,采用默认值,否则安装难以成功。 Version 5.2 + Added feature to group data ...

Global site tag (gtag.js) - Google Analytics