TStrings类是管理字符串列表的VCL类。有几个VCL组件使用TString实例来管理它们的数据(通常是文本)。例如在之前的ScratchPad应用程序时使用了TStrings,你可能不记得使用了Strings类,而实际上是使用了,只不过没有意识到而已。还记得装载文件和保存文件吗?使用了类似下面的语句:
Memo.Lines.SaveToFile(SaveDialog.FileName);
TMemo的Lines属性是TStrings类的实例。TStrings的SaveToFile方法将字符串列表保存到磁盘的文件中。可使用相同的技术将磁盘上的文件装载到列表框中,或者保存列表框的内容到文件中。TListBox类中的Items属性就是TStrings类型,下面做个小练习:
1、建立新的应用程序,安放ListBox组件到窗口上;
2、改变ListBox组件的Name属性为ListBox;
3、双击窗体。Code Editor将显示FormCreate函数,敲入以下代码:
procedure TForm1.FormCreate(Sender: TObject); var WinDir: array[0..255] of Char; FileName: string; begin GetWindowsDirectory(WinDir, SizeOf(WinDir)); FileName := WinDir + '\Win.ini'; ListBox.Items.LoadFromFile(FileName); end;
4、点击Run按钮编译并运行程序,运行如下:
当程序运行时,列表框中含有Windows目录下的Win.ini文件的内容,使用此方法,可以很容易将任何ASCII文本文件装载到列表框中。ComboBox组件也有相同的Items属性,也可以用同样的方法工作。
可以通过调用TStrings类的Add、Append、Delete、Insert及Move方法来增加、删除、插入及在ListBox、ComboBox或Memo中移动。
Note
Add如何执行依赖于Sorted属性的值,如果Sorted属性为True,Add会插入字符串到列表中需要的地方;如果是False,则新字符串会在列表尾增加。
调用Clear方法可以清除组件的内容。单个字符串可用数组下标操作符来访问。例如,在字符串列表中检索第一条字符串,会使用
Edit.Text := ListBox.Items[0];
Note
TStrings类中字符串实际包含在Strings属性中。Strings属性对TStrings类来说作为缺省数组属性(default array property),因此当检索字符串时不必用Strings属性来访问。下面两行的代码对于编译器来说是一样的:
Edit.Text := ListBox.Items[0]; Edit.Text := ListBox.Items.Strings[0];
在TStrings数组中,每个字符串包含字符串本身及额外的4字节存储。这额外的存储可通过Objects属性存取,可以用任意方式使用额外存储。例如,假设建立自绘的列表框(owner-drawn list box)显示位图(bitmap),用通常方法存储字符串,而把指向TBitmap的指针放到Objects数组中,语法如下:
property Objects[Index: Integer]: TObject;
Tip
也许有时需要管理与组件无关的一系列字符串。TStringList类恰好是为此目的提供的。这个类的运作同TStrings类似但可用在组件之外。TStringList类对读、操作及存储文本文件特别方便。
Note
在实际中,TStrings是所谓的抽象类。抽象类从不直接使用,它只作为基类,我们只能使用它的派生类。如上面讲的Memo中的Lines属性实际上是TMemoStrings类实例而不是TStrings实例。你也许会混乱因为Lines属性被声明为TStrings指针,但它实际上是TMemoStrings的实例。Lines属性的声明和建立如下:
var Lines: TStrings; {...Later} Lines := TMemoStrings.Create;这就是为什么Lines属性像TStrings,而实际上并不是这样。
New Term
抽象基类(abstract base class)是不能直接使用的类,使用抽象基类必须建立派生类,而用的是派生类的实例。