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类的更多相关文章

  1. delphi 控制音量 静音的类

    delphi 控制音量 静音的类 unit ttSound; interface uses winapi.windows, winapi.Messages; type SimpleSoundContr ...

  2. Delphi 跨单元进入(访问)类的私有成员,protected ,private部分

    http://blog.sina.com.cn/s/blog_5f8861b60102v1nl.html Delphi 跨单元进入(访问)类的私有成员,protected ,private部分 (20 ...

  3. DELPHI XE MYSQL数据库操作类 MYSQLHELPER

    注: 无需odbc配置 {* * MySQL Helper v1.0 * 2015.6.19 * 说明: * 这是一个操作MySQL的类,该类必须和libmysql.dll,dbxmys.dll两个文 ...

  4. delphi 类方法、类变量、类常量、类属性的研究,自己的研究

    群里我师傅给我的答案: unit Unit4; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Vari ...

  5. Delphi使用TStringHash实现建立类(有点像反射)

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  6. Delphi简单的数据操作类

    unit MyClass; uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,   VCL ...

  7. 转:Delphi的类与继承(VB与delphi比较)

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

  8. 比较C++、Java、Delphi声明类对象时候的相关语法

    同学们在学习的时候经常会遇到一些问题,C++.Java.Delphi他们到底有什么不一样的呢?今天我们来比较C++.Java.Delphi声明类对象时候的相关语法.希望对大家有帮助! C++中创建对象 ...

  9. Delphi子类调用祖父类的虚函数

    因为看Delphi书的时候,就产生了疑惑.老讲调用父类虚函数,但是万一需要调用祖父虚函数怎么办?后来又经常在C++里看到,就更疑惑了 type TA = class procedure ShowMsg ...

随机推荐

  1. ESP32入门示例 - SD卡Web服务器

    这个是来自ESP32官方示例的改版,官方的示例由于存在一些问题所以我进行了修改原本的示例有点逻辑上的问题,所以进行了一些修改 主要修改有:1.新增SD卡测试部分 复制自官方SD卡示例2.新增一个根目录 ...

  2. Spring Security(十八):5.9 Post Processing Configured Objects

    Spring Security’s Java Configuration does not expose every property of every object that it configur ...

  3. face alignment[Ordinary Procrustes Analysis]

    人脸识别,大致可以分为以下四个步骤: 人脸检测:从图片中准确定位到人脸,并以矩形框将其裁剪出来: 人脸矫正(对齐): 检测到的人脸,可能角度不是很正,需要使其对齐,比如旋转,缩放: 特征提取:对矫正后 ...

  4. Spring-boot 编写hello world

    项目启动时出现如下报错信息: Unrecognized VM option 'TieredStopAtLevel=1' Could not create the Java virtual machin ...

  5. GFF高仿QQ客户端及服务器

    一.GFF简介 GFF是仿QQ界面,通信基于SAEA.MessageSocket.SAEA.Http.SAEA.MVC实现包含客户端和服务器的程序,源码完全公开,项目源码地址:https://gith ...

  6. Docker镜像构建

    一.简介 在构建容器化应用时,相当重要的步骤莫过于镜像制作,本文将介绍镜像制作方法以及镜像制作的建议.通常镜像的制作有两种方式: 使用现有的容器使用docker commit 生成镜像 使用Docke ...

  7. JqGrid分页按钮图标不显示的bug

    开发中遇到的一个小问题,记录一下,如果有朋友也遇到了相同的问题,可以少走些弯路少花点时间. 如图: 分页插件使用了JqGrid,但是分页栏里出现了问题,上一页.下一页这些按钮的图标都显示为空,记得以前 ...

  8. 一文看懂Transformer内部原理(含PyTorch实现)

    Transformer注解及PyTorch实现 原文:http://nlp.seas.harvard.edu/2018/04/03/attention.html 作者:Alexander Rush 转 ...

  9. Jmeter(三十六)_运行过程中改变负载

    顾名思义,jmeter在做性能测试时,可以在不停止脚本的情况下修改负载压力,达到期望的测试效果.我们将通过Constant Throughput Timer(吞吐量计时器)和Beanshell服务器来 ...

  10. 剑指offer--4.重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...