一个功能增强的Delphi TListView组件
lixif
www.netgocn.com
在Windoes编程中列表视图(ListView)是一个通用控件,当将其样式设为Report时,系统将自动为它加上一个表头控件(以下简称表头),但通常我们不能直接对这个表头控件进行操作。同样Delphi的TListView组件也没有为我们提供可以直接对该表头进行控制的方法,这篇文章介绍一种通过自定义组件的方法,对Delphi的TListView组件进行功能增强,做一个通用的列表视图但是它增加了以下功能:
1) 增加一个可以从外部调用的排序方法,当视图的显示样式为Report时,点击各列的表头按钮可按其列值进行排序;
2) 点击各列的表头按钮进行排序的同时在视图的表头上按排序方向绘制一个箭头,其效果类似Outlook Express;
3) 增加视图表头的字体属性;
4) 增加一个背景图属性。
通过代码编写增强了Delphi通用列表视图的功能,但它仍是一个通用的列表视图控件。
自定义组件的基本步骤请参见有关文章,但是在此我们选择的基类是TListView,下面我们直接从Delphi自动生成的组件单元文件的数据类型定义部份开始(本文代码在Delphi 4.0下完成)。
一、将Delphi自动生成的单元文件的数据类型定义部份修改为:
type
TListView1 = class(TListView)
private
FaToz :Boolean;
FoldCol :Integer;
FPicture :TPicture;
FHeaderFont:TFont;
procedure SetHeaderFont(Value:TFont);
procedure SetHeaderStyle(phd:PHDNotify);
procedure DrawHeaderItem(pDS:PDrawItemStruct);
procedure SetPicture(Value: TPicture);
procedure PictureChanged(Sender: TObject);
procedure LVCustomDraw(Sender:TCustomListView;const ARect:TRect;var DefaultDraw:Boolean);
procedure DrawBack;
protected
procedure WndProc(var Message : TMessage); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure SortColumn(Column: TListColumn);
published
property BackPicture: TPicture read FPicture write SetPicture;
property HeaderFont: TFont read FHeaderFont write SetHeaderFont;
end;
说明:
a). 在published段我们定义了两个属性。背景图属性BackPicture,其数据类型是TPicture;表头字体属性HeaderFont,其数据类型是Tfont;
b). 为了读/写BackPicture属性的值,在private段分别定义了它的私有数据FPicture和属性的写方法SetPicture;同理,在private段为HeaderFontn属性分别定义了它的私有数据FHeaderFont和属性的写方法SetHeaderFont;
c). 在public段重载了TListView的构造函数和析构函数;
d). 在 protected段重载了TListView的WndProc过程;
e). 为了能在设计期间动态改变视图的背景图,我们自定义了二个事件响应过程,PictureChanged和LVCustomDraw。PictureChanged是背景图属性BackPicture的私有数据FPicture(TPicture)的OnChange事件响应过程,设计期间当我们通过Delphi的Object Inspector面板改变BackPicture的值时,将产生OnChang事件而执行该过程重绘列表视图(过程就是这样写的),这又将产生视图的OnCustomDraw事件而执行我们自定义的LVCustomDraw事件响应过程,也即LVCustomDraw是列表视图的OnCustomDraw事件响应过程;
f).