有些类不是组件,但它们支持存在的组件。这些类是其他组件的典型属性,直接由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中

转载于:https://www.cnblogs.com/delphi7456/archive/2011/01/10/1932388.html

Delphi之TStrings和TStringLists类[转]相关推荐

  1. TStrings和TStringLists类(经典有时间整理做个小例子)

    Delphi之TStrings和TStringLists类 有些类不是组件,但它们支持存在的组件.这些类是其他组件的典型属性,直接由TPersistent派生,如TStrings.TCanvas和TC ...

  2. 在delphi中如何动态建立类的实例

    在面向对象语言中,用两种方法建立类的实例:静态建立和动态建立.静态建立就是在程序中显式地建立类的实例,如c1 = TClass1.Create().而动态建立是在只知道类名的前题下建立类的实例.动态建 ...

  3. 重温Delphi之:如何定义一个类

    先谈谈工具问题: 虽然d7很经典,但毕竟是02年出的开发工具了,对于习惯了vs2008被微软宠坏的.net程序员来讲,重返d7已经有点找不着感觉了(起码连最基本的代码折叠功能都没有),还好delphi ...

  4. c++中实现delphi的按类名生成类对象

    c++中用模板,则很容易实现DELPHI中的getclass ,newinstance,create的功能.简单介绍如下(摘自我的另一篇文章<<c++按类名生成对象>>: /* ...

  5. Delphi语言如何对自定义类进行持久化保存及恢复 (性能远比json/xml高)

    Delphi的RTL自身就带有一套很好的资源持久化保存(IDE设计窗体时,保存为DFM格式及编译到EXE里面的资源文件)及恢复机制(EXE启动时对窗体资源的加载),那么应没必要再额外用xml/json ...

  6. Delphi的类与继承

    既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...

  7. delphi 类的写法 和 控制台程序的制作---深入Delphi编程

    刚刚接触的Delphi的朋友,可能最感兴趣的就是它丰富.强大的VCL(可视化构件库).仅仅向窗体上扔几个构件,甚至不用动手写代码,就能很容易地做出一个有实用价值的程序,真是令人激动.但是,VCL只是D ...

  8. delphi 类class自定义类方法虚方法

    刚刚接触的Delphi的朋友,可能最感兴趣的就是它丰富.强大的VCL(可视化构件库).仅仅向窗体上扔几个构件,甚至不用动手写代码,就能很容 易地做出一个有实用价值的程序,真是令人激动.但是,VCL只是 ...

  9. Delphi中的容器类(二)

    TStrings类 出于效率的考虑,Delphi并没有象C++和Java那样将字符串定义为类,因此TList本身不能直接存储字符串,而字符串列表又是使用非常广泛的,为此Borland提供了TStrin ...

  10. Delphi中的容器类

    Delphi中的容器类 Posted on 2008-11-15 11:30 YangHe 阅读(122) 评论(0) 编辑 收藏 从Delphi 5开始VCL中增加了一个新的Contnrs单元,单元 ...

最新文章

  1. linux服务器之间调用反应慢,Linux使用ssh远程登录服务器反应慢的解决办法
  2. 二叉树的深度_Golang面试题:二叉树的最大深度
  3. Java中的实现马赛克效果以及灰度效果----整张图片
  4. 帝国备份语法错误问题
  5. JAVA基础5——与String相关的系列(1)
  6. Citus数据分片分布研究(一 在工作节点直接操作表)
  7. 一个RGB-T工作的小小感悟与总结
  8. 常见Java面试题 抽象类能使用 final 修饰吗?
  9. Synchronized方法锁、对象锁、类锁区别
  10. 帝国7.2 php5.2,帝国CMS7.2版升级到7.5版的详细步骤方法(已测)
  11. doors dxl 遍历object 查找
  12. 计算机的使用编码,计算机中使用的编码
  13. 正则表达式匹配所有以小写字符开头的单词
  14. AutoCAD Civil 3D-路线-断链的处理
  15. 51单片机 IIC OLED屏幕驱动+Proteus仿真+实物验证示例程序
  16. 教你秒建受信任的本地 SSL 证书,彻底解决开发测试环境的无效证书警告烦恼!...
  17. 谷歌账户剩余余额如何退回。
  18. 华硕 PRIME X570-Pro+AMD Ryzen 7 3700X + macos12.0+oc7.1
  19. LTE CSG小区概念
  20. 【iapp源码】UI界面很简洁的方盒子iapp源码

热门文章

  1. tensorflow:卷积函数----tf.nn.conv2d
  2. setInterval()与setTimeout()
  3. 为什么使用事务?如何实现声明式事务?
  4. Cmax最优但∑Ci不一定最优 例子
  5. 证明独立集合问题是NP-complete
  6. chainmaker-go-sdk get cert hash failed, get cert hash failed, send QUERY_SYSTEM_CONTRACT failed
  7. VMware Ubuntu虚拟机卡顿慢 解决方法大全
  8. Php的入栈,PHP实现的栈数据结构示例【入栈、出栈、遍历栈】
  9. 深度神经网络反向传播算法
  10. 人口会一直增长下去吗_想要一直美下去?护肤雷区你避开了吗?