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中则是: 




在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目录下

时间: 2025-01-05 12:28:46

Delphi 中 TStrings 一些用法的相关文章

Delphi中ClientDataSet的用法小结

TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和操作的控件.该控件封装了对数据进行操作处理的接口和功能,而本身并不依赖上述几种数据库驱动程序,基本上能满足单机"瘦"数据库应用程序的需要. 一.TClientDataSet的基本属性和方法介绍 1.FieldDefs: 字段定义列表属性 开发者可通过单击属性编辑器中该属性编辑按钮,或在该控件上单击右键选择弹出菜单中的"Fields Editor"菜单进

delphi 中 delete的用法

delete 是删除一个 字符串中的 某部分字符用法是 delete(str,//被删除的字符串               index,//从第几个字符开始删除              count //删除几个              );Delete(S, 2, 2); 就是从S中的第二个开始删除,删除2个字符即2.3. Delphi Help: var s: string; begin   s := 'Honest Abe Lincoln';   Delete(s,8,4);   Ca

delphi中webbrowser的用法

WebBrowser1.GoHome; //到浏览器默认主页 WebBrowser1.Refresh; //刷新 WebBrowser1.GoBack; //后退 WebBrowser1.GoForward; //前进 WebBrowser1.Navigate('...'); //打开指定页面 WebBrowser1.Navigate('about:blank'); //打开空页面 //打开空页面, 并写入... WebBrowser1.Navigate('about:<head><ti

delphi中try的用法1

try...except..end;查询异常 try edHH.Visible := False; ListBox.Visible := not edHH.Visible; listBox.Clear; I := 0; while not Eof do begin SendToExeLog('H11'); listBox.Items.Add(IntToStr(ZSBID) + ' ' + ZNAME); setlength(myPP, i + 1); myPP[I].myInx := (ZBAS

DELPHI中MessageBox的用法 (转)

MessageBox对话框 输入控件的   ImeName属性把输入法去掉就默认为英文输入了 MessageBox对话框是比较常用的一个信息对话框,其不仅能够定义显示的信息内容.信息提示图标,而且可以定义按钮组合及对话框的标题,是一个功能齐全的信息对话框信息提示图标,而且可以定义按钮组合及对话框的标题,是一个功能齐全的信息对框. 1.函数原型及参数 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer

delphi中一切皆指针

unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls,TypInfo,ObjAuto; type  TForm1 = class(TForm)    btn1: TButton;    btn2: TButton;    btn3: TButton;    btn4: TButton;    btn5: TB

Delphi中stringlist分割字符串的用法

Delphi中stringlist分割字符串的用法 TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 1.CommaText 2.Delimiter &DelimitedText 3.Names &Values &ValueFromIndex 先看第一个:CommaText.怎么用呢? const constr :String = 'aaa,bbb,ccc,ddd'; var strs :TStrin

delphi中的XML解析控件TXMLDocument的用法

Delphi中TXMLDocument控件的用法 Delphi中对XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很多,现称述于下面. 在讲之前先给出一个XML实例,在讲某些部分是要结合实例比较容易理解. 1<?xmlversion="1.0"encoding="gb2312"?><!--文档版本信息,注释格式同HTML--> 2<XMLPackage> 3<clinetinfoip=”202.1

Delphi中 StrToIntDef函数的用法

Delphi中 StrToIntDef函数的用法: 比如我要判断一个文本框里输入的字符串能不能转换为integer类型,如果能,则返回转换后的整型数据,如果不能,则返回整数0,那么我就可以用strtointdef这个函数. 写法如下: 假设edit1.text:='1000'; 则strtointdef(edit1.text,0)返回值为1000. 如果edit1.text:='fdafds',则返回值为0. (如果你用strtoint(edit1.text)当edit1.text:='fdad