原文:http://www.cnblogs.com/spider518/archive/2010/12/27/1917546.html

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中

转载于:https://www.cnblogs.com/chuangyiyuan/p/6444976.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. 技巧:设置程序默认安装到D盘
  2. 查看swintransformer的网络结构
  3. Android 引用模块中的类,解决Android项目中找不到Module中的封装类或引用的第三方类库...
  4. 成年人不懂这些道理,会吃很多亏
  5. android des ecb加密_Android逆向 | 基础知识篇 01
  6. vue+django2.0.2-rest-framework 生鲜项目(五)
  7. 计算机导论中如何求模,计算机导论作业答案
  8. 软件工程(吕云翔第二版)部分知识点
  9. 龙芯2F处理器PMON的编译、加载
  10. python根据经纬度计算两点之间距离
  11. 张亮:Sharding-Sphere成长记
  12. nand flash地址机制
  13. 将计算机设置成交换机主机,如何将路由器变成交换机功能 路由器变成交换机运用方式介绍【详解】...
  14. ble协议栈从零开始七(linklayer 之 privacy)
  15. 快看你的达标没!充电宝新国标只有这20家合格
  16. fastposter v2.6.2 发布 程序员专属海报生成器
  17. IAR中使用IELFTOOL进行软件代码checksum的生成和添加
  18. 微信小程序加载并且编译显示富文本编辑器内容
  19. 面试AI算法岗,你被要求复现顶会论文了嘛?
  20. win7打不开计算机网络连接,win7系统有网络但是打不开网页的解决方法【图文】...

热门文章

  1. php之通过curl模仿表单提交(get,post)抓取其他页面的内容
  2. 二十五、JAVA多线程(六、线程控制操作)
  3. pve网卡直通虚拟机pve失联打不开解决方案,不用重新安装pve
  4. 2.8.PHP7.1 狐教程-【控制语句 Switch】
  5. RedisTemplate 概述 与 操作 Redis 5 种数据类型
  6. LayaAir 事件处理器 Handler
  7. 搭建kafaka集群
  8. Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框(转载)
  9. 数据库TCPIP协议开了,但还是远程连不上
  10. Distance Dependent Infinite Latent Feature Model 阅读笔记1