3.Delphi字符串列表及应用

Delphi应用程序经常要处理字符串列表,如组合框和列表框中的字符串,TMemo部件的文本行,屏幕支持的字体列表,TNotebook部件的tabs属性,字符串网格的行、列等等。

  虽然应用程序以不同的方法使用这些列表,但Delphi通过一个叫字符串列表(Tstrings)的对象提供统一的界面,并且在不同场合可相互转化。例如,可以在TMemo部件中编辑某一字符串,并把它当成列表框中列表项使用。

  在Delphi集成开发环境中也经常要使用字符串列表。如在Object Inspector窗体的取值栏中常列有Tstrings字符,双击该字符,将弹出字符列表编辑器,如图3.1,在编辑器中可进行编辑、加入、删除等操作 。

  在运行状态时也可以操作字符串列表,常见的字符串列表操作如下:

  ● 列表中操作字符串

  ● 装载、保存字符串列表

  ● 创建字符串列表

  ● 在字符串列表中加入对象

本章将介绍字符串列表的常用操作及简单应用。

3.1 字符串列表的常用操作 

3.1.1 列表中操作字符串 

  在Delphi应用程序中,经常要对列表中的字符串进行操作。例如,设计时修改字符串列表属性。

  常见的字符串操作如下:

  ● 计算列表中字符串数目

  ● 访问指定字符串

  ● 查找字符串的位置

● 往列表中加入字符串

  ● 删除列表中的字符串

  ● 在列表中移动字符串

  ● 复制一个完整的字符串列表

  ● 复制列表中的字符串 

3.1.1.1 计算列表中的字符串数目 

  使用Count属性可计算列表中的字符串数目。Count是只读属性,用以指示列表中字符串列表数目。因为字符串列表是以零开始索引,因而Count比列表的最大索引数大一。

  例如,应用程序想计算当前屏幕支持的字体数目,可查找屏幕对象的字体列表,该列表包含了屏幕支持的所有字体的名字。

      FontCount:=Screen.Fonts.Count;

3.1.1.2 访问指定字符串 

  字符串列表有一个可索引的Strings属性,可象使用字符串数组一样使用Strings。例如,列表中第一个字符串为Strings[0]。因为Strings属性为字符串列表中最常用的属性,Strings属性可做为字符串列表的缺省属性,即使用时可省略Strings标识符。

  要访问字符串中的指定字符,可查找该字符的起始位置或索引。字符串数目是以零开始记数的。如果列表中有三个字符串,其索引范围为0..2。

  以下代码是等价的: 

    Memol.Lines.Strings[0]:='This is the first line.';

                Memol.Lines[0]:='This is the first line.'; 

3.1.1.3 查找字符串的位置 

   Indexof方法可查找指定字符串的位置。Indexof有一个字符串类型的参数,方法返回列表中匹配字符串的位置。如果列表中无匹配字符串,将返回- 1。

             Indexof方法只能查找完整字符串,即必须完全匹配整个字符串。如果只匹配部分字符串,必须编写相应代码。

   以下代码判定列表中是否有指定字符串:

if FileListBox1.Items.IndexOf('AUTOEXEC.BAT') > -1 then

begin

Color := clYellow;

Label1.Caption := 'You are in the root directory!';

end; 

3.1.1.4 在列表中加入字符串 

  有两种方式往列表中加入字符串:可把字符串加到列表的最后,也可插入列表之中。

  要把字符串加至列表尾部,使用Add方法,把字符串作为参数传递。

  要把字符串插入列表中,使用Insert方法,传递两个参数:插入的位置和字符串。

  例如,要把“Three”插入至列表中的第三个位置,使用代码Insert(2,'Three')。如果列表中的字符不到2个,Delphi将产生超出索引范围的异常(关于异常详见十二章)。 

3.1.1.5 在列表中移动字符串 

  应用程序可以在列表中把指定字符串移至另一个位置,如果字符串与某个对象相连,则该对象与字符串同步移动。

  Move方法可实现字符串的移动,它有两个参数:现行位置和要移动的位置。以下代码把第三个字符串移至第五的位置: 

   Move(2,4); 

3.1.1.6 删除列表中的字符串 

  使用Delete方法可以删除指定的字符串。Delete的参数是指定字符串的位置,如果不知道字符串的位置,可使用Indexof方法。

  要删除字符串列表中所有的字符串,可使用Clear方法。

  以下代码删除列表框中的指定字符串: 

    With ListBox1.Items do

begin

if Indexof('bureaucracy')>-1 then

Delete (Indexof('bureaucracy'));

end; 

3.1.1.7 复制完整的字符串列表 

  把一个列表复制到另一个列表相当于把源列表赋值给目标列表,即使列表从属于不同的部件,Delphi也可以进行这种复制。

  复制列表将覆盖掉目标列表,如果要把源列表加到目标列表的尾部,使用Addstrings方法。

  以下代码分别为复制列表和连接列表: 

Outline1.Lines:=ComboBox1.Items;

Outline1.Addstrings(ComboBox1.Items); 

3.1.1.8 重复操作列表中的字符串 

  很多情况需要对表中的每一个字符串进行操作,如改变字符串的大小写。象这种重复操作可以用 for 循环来实现,同时使用列表的整数类型的索引。

  以下代码对列表框的字符串进行重复操作。当用户按下按钮时,对列表框中的字符串进行大小写转换。 

procedure TForm1.Button1Click(Sender: TObject);

var

I: Integer;

begin

for I := 0 to ListBox1.Items.Count -1 do

ListBox1.Items[I] := UpperCase(ListBox1.Items[I]);

end;

3.1.2 装载、保存字符串列表 

  应用程序可以非常方便的把Delphi字符串列表存入文本文件,或者从文本文件中重新装载(或装入另一个不同的列表),字符串列表有专门的方法处理这类操作。

  使用LoadFromFile方法从文件中装载字符串列表,LoadFromFile从文本文件中把每一行字符串装入列表中。

  把列表保存在文件中使用SaveToFile方法,使用时传递文件名的参数。如果文件不存在,SaveToFile将创建它,否则将用列表覆盖现有文件内容。

  以下代码装入AUTOEXEC.BAT的文件,并以AUTOEXEC.BAK为文件名进行备份。 

  procedure TForm1.FormCreat(sender:TObject);

var

FileName:String;

begin

FileName:='C:\AUTOEXEC.BAT';

With Memo1 do

begin

LoadFromFile(FileName)

SaveToFile(ChangeFileExt(FileName,'BAK'));

end;

end; 

3.1.3 创建新的字符串列表 

  大多数情况下,应用程序使用的字符串列表是做为部件的某一部分,因此不必创建列表,但Delphi允许创建不依赖部件的字符串列表。

  值得注意的是程序创建的字符串列表必须在使用完之后,释放列表所占用的内存空间。有两种不同的情况需要处理:一是程序以简单的方式创建、使用、释放字符串列表;二是由程序创建,在运行期间均可能使用,在程序终止前释放。这两种情况主要取决于是创建短期字符串列表还是长期字符串列表。 

3.1.3.1短期字符串列表 

  短期字符串列表用于处理简单事物。程序在同一处创建、使用、释放列表。这是最安全的使用字符串列表的方法。

  因为字符串列表要为自己和它的字符串分配内存,所以要用try..finally对列表进行保护,以确保发生异常后释放列表所占用的内存空间。

  创建短期字符串列表的基本步骤为:

  1. 构造字符串列表对象;

  2. 在try..finally块中使用列表;

  3. 在finally后释放列表空间。

  以下代码创建列表、使用列表、最后释放列表空间: 

  procedure TForm1.Button1Click(Sender:Tobject);

var

TemList:TStrings;

begin

Templist:=TStringList.Create;

try

{ use the string list }

finally

Templist.Free;

end;

end; 

3.1.3.2 长期字符串列表 

  如果要在程序运行的任何时候使用字符串列表,则需在程序开始运行时就创建列表,并在程序终止前释放。

  运行时创建字符串列表的步骤为:

  1. 在程序主窗体对象的域中加入TStringsList类型的域;

  2. 在主窗体的OnCreate事件中创建句柄,该事件句柄在主窗体显示前运行;

  3. 在创建事件句柄后,创建字符串列表对象;

  4. 在主窗体的OnDestroy事件创建句柄,该事件句柄在主窗体消失之前运行。

  这样,在程序运行过程中,任何过程、事件均能访问该字符串列表。

  以下代码在程序中加入了一个Clicklist的字符串列表,用户每按一次鼠标键,程序往Clicklist中加入一字符串,程序结束前把该列表存入文件。 

unit Unit1; 

interface 

uses WinTYpes, WinProcs, Classes, Graphics, Forms, Controls, Apps; 

type

TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

private

{ Private declarations }

public

{ Public declarations }

ClickList: TStrings; {declare the field}

end; 

var

Form1: TForm1; 

implementation 

{$R *.DFM} 

procedure TForm1.FormCreate(Sender: TObject);

begin

ClickList := TStringList.Create; {construct the list}

end; 

procedure TForm1.FormDestroy(Sender: TObject);

begin

ClickList.SaveToFile(ChangeFileExt(Application.ExeName, '.LOG'));

{save the list}

ClickList.Free; {destroy the list object}

end; 

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

ClickList.Add(Format('Click at (%d, %d)', [X, Y])); {add a

string to the list}

end; 

end.

3.1.4 往字符串列表中加入对象 

  字符串列表除了能在Strings属性中贮存字符串外,还可以在Objects属性中贮存对象。与Stings一样,Objects也是可以索引的,它是对象的索引。

  在应用程序使用列表中的字符串与列表中是否有对象没有多大关系。除非程序特地访问对象,否则Objects中的内容不变,Delphi只是保存了这些信息,应用程序在必要时对其进行操作。

  有些字符串列表忽略加入的对象。如TMemo部件中代表行的列表对加入其中的对象不保存。还有一些字符串列表,把对象与字符串联系起来,如TNotebook部件的Pages属性,它同时保存着页的名字和代表页的对象。如果应用程序往Pages中加入或删除字符串,Delphi自动的加入或删除与之相应的对象。

  虽然程序可分配任何类型的对象到列表中,但最常用的是在自画式控制中把位图与字符串联系起来,注意位图与字符串成对使用。

  Delphi在释放对象的内存空间时并不破坏与之相应的字符串。 

3.1.4.1 操作字符串列表中的对象 

  对于字符串的每一种操作方法,列表中的对象均有相应的方法。例如,应用程序可利用对象的索引来访问对象。与字符串不同的是,不能省略Objects,因为Strings才是列表的缺省属性。

  表3.1中总结了字符串对字符串和对象操作的方法。 

表3.1 TStrings的字符串属性和对象操作属性的方法

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

                操 作    字 符 串        对   象

───────────────────────────────

   访  问      Strings属性                    Objects属性

   加入项目      Add 方法       AddObjects方法

   插入项目      Insert方法      InsertObjects方法

           项目定位      Indexof方法                  IndexofObject方法

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

  Delete,Clear,More操作整个项目,即删除字符串时把相应的对象也删除了。但LoadFromFile,SaveToFile方法只对字符串进行操作。 

3.1.4.2 加入对象 

  如果把对象与已存在的字符串联系起来,Delphi将分配给该对象同样的索引号。例如,一个叫Fruits的列表中有字符串('apple'),程序可将名为AppleBitmap的位图与apple字符相联系。 

  With Fruits do Objects[Indexof('apple')]:=AppleBitmap; 

另一种方法是调用列表的AddObject方法,AddObject有两个参数:字符串和对象,如下: 

  Fruits AddObject('Apple',AppleBitmap); 

3.2 字符串列表应用 

          Delphi应用程序经常要用到字符串列表,我们编写的strlist. dpr是应用字符串列表的简单程序。程序运行状态如图3.2所示。列表框列出了屏幕支持的各种字体名称,并且以名称所代表的字体显示在列表中;Tabs的标签不只以字符串来表示,而且附有位图。这就是所谓的自画式控制。下面介绍字符串列表在自画式控制中的应用。

         列表框、组合框、Tabset部件中有一个叫“自画(Ownerdraw)”的风格,它能替代Windows的文本输出,部件的自画式控制在运行状态对每个项目进行重新绘制。最常用的是用图像代替文本输出。

  自画式控制有一个共同特点:它们都包含有项目列表,缺省情况下这些列表就是字符串列表,Windows把它们当成文本显示。Delphi可以把字符串列表与某一对象相联系,这就使得应用程序能用对象来绘制项目。

  通常,创建自画式控制有以下三个步骤:

  1. 设置自画风格;

  2. 把图像对象加入字符串列表中;

  3. 绘制自画项目。 

3.2.1 设置自画风格 

  每个能进行自画式控制的部件都有一个叫Style的属性,Style决定部件是以缺省方式还是以自画方式绘制项目。

  对于列表框和组合框,也有自画式风格选项,表3.2列出了Style的取值及含义。 

表3.2 Style的取值及含义

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

 Style              含  义         举   例

─────────────────────────────────

 

 Fixed          每个项目有相同的高度      1bOwnerDrawFixed

 

        高度由ItenHeight属性决定   csOwnerDrawFixed

Varible          每个项目有不同的高度     1bOwnweDrawVarible

 

        由运行数据决定                      csOwnerDrawVarible

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

  tab-set与字符串网格的Style属性通常是Varible.

在Strlist程序中,列表框与tab-set取值如表3.3: 

表3.3 列表框与tab-set的取值

━━━━━━━━━━━━━━━━━━━━━━━━━━

    名称         style

──────────────────────────

ListBox1                              lbOwnerDrawVariable

Tabset1                                tsOwnerDrawVariable

━━━━━━━━━━━━━━━━━━━━━━━━━━━

3.2.2 把图像加入字符串列表 

  上节已介绍如何把对象加入字符串列表,例程把位图对象加入Tabset1的Tabs中: 

procedure TForm1.FormCreate(Sender: TObject);

var

Bitmap: TBitMap;

begin

Listbox1.Items := Screen.Fonts;

Bitmap := TBitmap.Create;

Bitmap.LoadFromFile('PHONE.BMP');

Tabset1.Tabs.AddObject('phone',Bitmap);

Bitmap := TBitmap.Create;

Bitmap.LoadFromFile('PRINTER.BMP');

Tabset1.Tabs.AddObject('printer ',Bitmap);

end; 

3.2.3 绘制自画项目 

  当部件的Style属性是自画式时,Windows不再绘制部件,相反Windows为每个可视项目产生事件,而应用程序必须在事件中绘制项目。

  在应用程序绘制自画控制之前,Windows产生测量项目事件,这个事件告诉程序项目显示的位置 。

  通常由Windows决定项目显示的大小,但应用程序可以处理这个事件并自己选择显示区域。例如,程序要用位图代替文本显示,则需要把区域设置成位图的大小。测量项目事件的名称随部件的名称不同而不同,对于列表框和组合框,该事件叫OnMeasureItem。对于Tabset,该事件叫OnMeasureTab。

  测量项目事件有两个重要参数: 项目索引号与项目的大小。这个大小是变化的。后继项目的输出位置由前面项目的大小决定。例如,在自画式列表框中,如果应用程序把第一个项目的高度设置成5个象素点,则第二个项目在第六个象素点开始输出。列表框和组合框中,应用程序只能设置成项目的高度,而项目的宽度就是部件的高度。在Tabset中,tabs的宽度是可变的,而高度则是固定的。自画式网格允许应用程序改变网格单元的高度和宽度。

  OnMeasureItem的声明如下:

ListBox1 MeasureItem(Control: TwinControl;Index: Integer; var Height: Integer);

  例程中响应OnMeasureItem事件的代码如下:  

procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;

var Height: Integer);

begin

with ListBox1.Canvas do

begin

Font.Name := ListBox1.Items[Index];

Height := TextHeight('A');

end;

end; 

procedure TForm1.TabSetMeasureTab(Sender: TObject; Index: Integer;

var TabWidth: Integer);

var

BitmapWidth: Integer;

begin

BitmapWidth := TBitmap( TabSet1.Tabs.Objects[Index]).Width;

Inc(TabWidth, 2 + BitmapWidth);

end; 

 在OnMeasureItem事件发生后,Windows激发一个叫OnDrawItem的事件,这个事件也随部件名称不同而不同,常见的有OnDrawItem、OnDrawTab、OnDrawCell。

  OnMeasureItem的声明如下:

  DrawItem( Control: TWinControl; Index: integer; Rect: TRect; State: TOwnerDraw); 

其中Control是包含项目的部件引用

    Index 是项目的索引号

    Rect  是绘制的矩形

    State 是项目的状态,如选中,得到焦点等。 

  在例程的列表框中,所列项目是屏幕支持的各种字体名称,当列表框发生OnDrawItem事件时,程序把输出字体设置成该项目所代表的字体,因而列表框的项目呈现出不同的字体,其代码如下:  

procedure TForm1.DrawItem(Control: TWinControl; Index: Integer;

Rect: TRect; State: TOwnerDrawState);

begin

with ListBox1.Canvas do

begin

FillRect(Rect);

Font.Name := ListBox1.Items[Index];

TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);

end;

end;

  在Tabset部件中,则把位图与文本同时输出,其代码如下: 

procedure TForm1.TabSet1DrawTab(Sender: TObject; TabCanvas: TCanvas;

R: TRect; Index: Integer; Selected: Boolean);

var

Bitmap: TBitmap;

begin

Bitmap := TBitmap(TabSet1.Tabs.Objects[Index]);

with TabCanvas do

begin

Draw(R.Left, R.Top + 4, Bitmap);

TextOut(R.Left + 2 + Bitmap.Width,

R.Top + 2, TabSet1.Tabs[Index]);

end;

end;

 

转载于:https://www.cnblogs.com/peiruijun/archive/2010/02/14/1668164.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi 10.3是一种流行的集成开发环境(IDE),用于开发跨平台的应用程序。在Delphi 10.3中,使用资源编译器(RC)字符串来实现多语言支持。 RC字符串是一种用于存储和管理应用程序中的文本的机制。它允许开发人员将应用程序中的所有文本(如标签、按钮、菜单项等)存储在单独的资源文件中,而不是直接在代码中硬编码。这样做的好处是使应用程序易于本地化,即使在运行时更改语言设置,也可以动态加载正确的文本。 在Delphi 10.3中,可以使用RES文件来存储和管理RC字符串。使用资源编辑器可以方便地将应用程序中的文本添加到RES文件中。可以为每种语言创建不同的RES文件,以便为不同的目标语言提供正确的文本。 在应用程序的代码中,可以使用特殊的函数或指令来加载和显示RC字符串。例如,可以使用LoadResString函数来加载特定ID的RC字符串,并将其分配给相关的控件。这使开发人员能够根据用户的语言设置动态加载正确的文本。 Delphi 10.3还提供了一些工具和资源管理器,帮助开发人员管理和本地化RC字符串。例如,可以使用资源导入器来导入和导出RC字符串,以便翻译和本地化应用程序的文本。此外,还有一些第三方库和工具可以帮助开发人员更容易地管理和实现多语言支持。 总之,Delphi 10.3通过使用RC字符串和相关的工具来提供多语言支持。这使得开发人员能够轻松地本地化应用程序,并根据用户的语言设置加载适当的文本。这是一个重要的特性,使得应用程序更加友好和适应不同语言环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值