博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi字符串列表及应用(二)(转)
阅读量:2496 次
发布时间:2019-05-11

本文共 4930 字,大约阅读时间需要 16 分钟。

Delphi字符串列表及应用(二):

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

 

 

 

       

Varible 每个项目有不同的高度    

1bOwnweDrawVarible

 

       

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 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);

  例程中响应

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的声明如下:

  

其中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;

DrawItem( Control: TWinControl; Index:integer; Rect: TRect; State: TOwnerDraw); 
OnMeasureItem事件的代码如下:  

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

由运行数据决定  
csOwnerDrawVarible
高度由
ItenHeight
属性决定  
csOwnerDrawFixed

  每个能进行自画式控制的部件都有一个叫

  对于列表框和组合框,也有自画式风格选项,表

  自画式控制有一个共同特点:它们都包含有项目列表,缺省情况下这些列表就是字符串列表,

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

  

  

  

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

  表

  字符串列表除了能在

  在应用程序使用列表中的字符串与列表中是否有对象没有多大关系。除非程序特地访问对象,否则

  有些字符串列表忽略加入的对象。如

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

  

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-123285/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-123285/

你可能感兴趣的文章
Android 面试题整理总结(二)Java 集合
查看>>
学习笔记_vnpy实战培训day02
查看>>
学习笔记_vnpy实战培训day03
查看>>
VNPY- VnTrader基本使用
查看>>
VNPY - CTA策略模块策略开发
查看>>
VNPY - 事件引擎
查看>>
MongoDB基本语法和操作入门
查看>>
学习笔记_vnpy实战培训day04_作业
查看>>
OCO订单(委托)
查看>>
学习笔记_vnpy实战培训day06
查看>>
回测引擎代码分析流程图
查看>>
Excel 如何制作时间轴
查看>>
股票网格交易策略
查看>>
matplotlib绘图跳过时间段的处理方案
查看>>
vnpy学习_04回测评价指标的缺陷
查看>>
ubuntu终端一次多条命令方法和区别
查看>>
python之偏函数
查看>>
vnpy学习_06回测结果可视化改进
查看>>
读书笔记_量化交易如何建立自己的算法交易01
查看>>
设计模式03_工厂
查看>>