VCL组件之TStrings

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按钮编译并运行程序,运行如下:

0185

当程序运行时,列表框中含有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)是不能直接使用的类,使用抽象基类必须建立派生类,而用的是派生类的实例。

posted on 2012-01-23 13:24  pchmonster  阅读(1820)  评论(1编辑  收藏  举报

导航