Delphi之TStrings和TStringLists类
Delphi之TStrings和TStringLists类
有些类不是组件,但它们支持存在的组件。这些类是其他组件的典型属性,直接由TPersistent派生,如TStrings、TCanvas和TCollection。
TStrings和TStringLists类
TStrings是一个抽象类,使你可以操纵属于组件(如TListBox)的字符串列表。TStrings实际上并不管理字符串的内存(那是由拥有TStrings类的组件管理的),它只是定义了方法和属性来访问和操纵组件的字符串,而不是使用组件的Win32 API函数和消息。
注意,我们所说的TStrings是一个抽象类。这就意味着TStrings并没有真正实现操纵字符串的代码,它只是定义了必要的方法有哪些。TStrings的派生组件实现了实际上的字符串操纵方法。
为了进一步说明这个点,举几个组件的例子,如TListBox.Items、TMemo.Lines、和TComboBox.Items等属性都是TStrings类型。你也许怀疑,如果它们的属性是TStrings类型,当这些属性的方法在代码中尚未实现时,怎么能调用这些方法呢?问得好。答案是,尽管这些属性被定义为TStrings类型,但这些属性的变量(例如设为TListBox.FItems)是被实例化为派生类。为了阐明这点,设FItems是TListBox的Items属性的私有存储域:
TCostomListBox = class(TWinControl)
private
FItem: TStrings;
注意 虽然前述代码片段中的类类型是TCustomListBox,但TListBox是TCustomListBox在同一单元中直接派生的,因此TListBox可以访问它的私有域。
StdCtrls.pas单元是Delphi VCL的一部分,它定义了一个TStrings的派生类TListBoxStrings。 TListBoxStrings类的声明:
TListBoxStrings = class(TStrings)
private
ListBox: TCustomListBox;
protected
procedure Put(Index: Integer; const S: string); override;
function Get(Index: Integer): string; override;
function GetCount: Integer; override;
function GetObject(Index: Integer): TObject; override;
procedure PutObject(Index: Integer; AObject: TObject); override;
procedure SetUpdateState(Updating: Boolean); override;
public
function Add(const S: string): Integer; override;
procedure Clear; override;
procedure Delete(Index: Integer); override;
procedure Exchange(Index1, Index2: Integer); override;
function IndexOf(const S: string): Integer; override;
procedure Insert(Index: Integer; const S: string); override;
procedure Move(CurIndex, NewIndex: Integer); override;
end;
StdCtrls.pas接着实现了这个派生类的每一个方法。当TListBox为其FItems变量创建它的类实例时,实际上就是创建这个派生类的实例并把它提供给FItems属性:
constructor TCostomListBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
. . .
//创建一个TListBoxStrings实例
FItems := TListBoxStrings.Create;
. . .
end;
这里要重申,虽然TStrings类定义了它的方法,但它并没有实现这些方法来操纵字符串。TStrings派生类实现了这些方法。对于组件编写者来说这一点很重要,因为你要知道如何能够像Delphi组件那样来实现这个技术。通过VCL源代码来了解Borland如何实现这些技术,在你迷惑的时候是非常必要的。
如果你不是组件编写者,但希望操纵字符串列表,可以使用另一个TStrings派生类——TStringList,通过它你可以把一个完全独立的类实例化。TStringList管理组件以外的字符串列表。最有用的是TStringList与TStrings完全兼容。这意味着你能够直接把一个TStringList实例赋给一个组件的TStrings属性。下列代码演示了如何创建一个TStringList实例:
var
MyStringList: TStringList;
begin
MyStringlist := TStringList.Create;
要把字符串加入这个TStri n g L i s t实例,如下所示:
如果你要把同样的字符串加入到TMemo组件和TListBox组件,所要做的就是利用不同组件的
TStrings属性的兼容性在代码中进行赋值:
这时用Assign()方法复制TStrings实例,而不是像Memo1.Lines := MyStringList那样直接赋值。TStrings的一些常用方法
Add(const S: String): Integer 把字符串S加入到字符串列表中,并返回字符串在列表中的位置
AddObject(const S: String;AObject: TObject): Integer 把一个字符串和一个对象添加到一个字符串或字符串列表对象中
AddStrings(Strings: TStrings) 从T S t r i n g s 中复制字符串到本字符串列表的后面
Assign(Source: TPersistent) 用S o u r c e参数指定的字符串列表取代自己
Clear 从列表中删除所有字符串
Delete(Index: Integer) 删除由I n d e x指定位置的字符串
Exchange(Index1, Index2: Integer) 交换由两个Index值指定的字符串的位置
IndexOf(const S: String): Integer 返回字符串S在列表中的位置
Insert(Index: Integer; const S: String) 把字符串S插入到列表中由I n d e x指定的位置
Move(CurIndex, NewIndex: Integer) 把CurIndex位置的字符串移动到NewIndex位置
LoadFromFile(const FileName: String) 从文本文件FileName中读取字符串列表
SaveToFile(const FileName: String) 把字符串列表保存到文本文件FileName中
Delphi之TStrings和TStringLists类的更多相关文章
- delphi 控制音量 静音的类
delphi 控制音量 静音的类 unit ttSound; interface uses winapi.windows, winapi.Messages; type SimpleSoundContr ...
- Delphi 跨单元进入(访问)类的私有成员,protected ,private部分
http://blog.sina.com.cn/s/blog_5f8861b60102v1nl.html Delphi 跨单元进入(访问)类的私有成员,protected ,private部分 (20 ...
- DELPHI XE MYSQL数据库操作类 MYSQLHELPER
注: 无需odbc配置 {* * MySQL Helper v1.0 * 2015.6.19 * 说明: * 这是一个操作MySQL的类,该类必须和libmysql.dll,dbxmys.dll两个文 ...
- delphi 类方法、类变量、类常量、类属性的研究,自己的研究
群里我师傅给我的答案: unit Unit4; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Vari ...
- Delphi使用TStringHash实现建立类(有点像反射)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Delphi简单的数据操作类
unit MyClass; uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, VCL ...
- 转:Delphi的类与继承(VB与delphi比较)
既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...
- 比较C++、Java、Delphi声明类对象时候的相关语法
同学们在学习的时候经常会遇到一些问题,C++.Java.Delphi他们到底有什么不一样的呢?今天我们来比较C++.Java.Delphi声明类对象时候的相关语法.希望对大家有帮助! C++中创建对象 ...
- Delphi子类调用祖父类的虚函数
因为看Delphi书的时候,就产生了疑惑.老讲调用父类虚函数,但是万一需要调用祖父虚函数怎么办?后来又经常在C++里看到,就更疑惑了 type TA = class procedure ShowMsg ...
随机推荐
- 【js】鼠标跟随效果
1.实现思想 ①鼠标跟随效果,发生在鼠标移动的时候,故需要使用onmousemove事件 ②当页面内容多于1屏时,就需要考虑滚动距离的问题 ③想实现鼠标跟随的效果需要: 元素的left位置 = 鼠标当 ...
- 如何在关闭ssh连接的情况下,让进程继续运行?
#screen 1 回车后进入Screen子界面,此时putty标题栏会指示处于子界面状态,然后运行你的程序 #应用程序名 1 然后按下Ctrl+A后抬起,然后按下d键,此时切换回主界面,Putty的 ...
- 晓晨高效IP提取工具 附源码
在网上找的几个代理ip网站,抓取下来的.解析网页用的是HtmlAgilityPack,没有用正则.自己重写了ListView使他动态加载的时候不闪烁.效果图 下载地址:http://files.cnb ...
- 每秒高达1.6亿次操作的并发键值存储库 FASTER 诞生
FASTER 在过去十年中,云中的数据密集型应用程序和服务有了巨大的增长.数据在各种边设施(例如,设备,浏览器和服务器)上创建,并由云应用程序处理用来获得数据价值或做出决策.应用程序和服务可以处理收集 ...
- Python-正则表达式总结版
前言: 总是写不好正则表达式,时间长不用就有些忘记了,故此在总结一篇文章以便日后查阅. 一.常用的匹配规则总结表 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字及下划线 \s 匹配任意空 ...
- 1060E Sergey and Subway(思维题,dfs)
题意:给出一颗树,现在,给哪些距离为2的点对,加上一条边,问所有点对的距离和 题解:如果没有加入新的边,距离和就会等于每条边的贡献,由于是树,我们用点来代表点上面的边,对于每条边,它的贡献将是(子树大 ...
- long double
long double 输入输出 scanf("%Lf",&a); printf("%.20Lf\n",a);
- iOS原生实现二维码拉近放大
http://www.cocoachina.com/ios/20180416/23033.html 2018-04-16 15:34 编辑: yyuuzhu 分类:iOS开发 来源:程序鹅 8 300 ...
- iOS开发造轮子 | 通用占位图
https://www.jianshu.com/p/beca3ac24031 实际运用场景: 没网时的提示view,tableView或collectionView没内容时的展示view,以及其它特殊 ...
- p141一致有界原则
1.Mk取sup 为什么只要取∩就好了 不应该是先并后交吗 2.为什么说是闭集?