


09/12/2021(版本1.7)
03/13/2021(版本1.6)
02/01/2021(版本1.5)
12/18/2020(版本1.4)
10/31/2020(1.3版)
10/27/2020(版本1.2)
10/26/2020(版本1.1)
05/03/2020
2019年2月11日
2019年2月8日
2019年2月7日
当您使用ListBox时,通常在将对象分配给ListBox项目时,您需要使用OnDrawItem事件在列表框中显示/绘制列。
没关系,但是您没有标题控件可以显示列,也不允许用户调整大小,移动和显示/隐藏列。
TheaderControl(Delphi默认控件)允许其中一些操作,但是您需要为每个列表框编写大量代码,负责重新粉刷项目并计算列位置。而且,当然,您没有可用的隐藏/显示列功能。
因此,我一直在研究此组件,因此我决定分享它,因为它非常有用。
此外,当列超过可见区域时,dzlistheader将显示一个滚动条。 ?
支持delphi xe3..delphi 11
将dzlistheader放在形式中,然后在dzlistheader中放置一个列表框。
设置dzlistheader.listbox = ListBox。
在dzlistheader.columns属性上创建所需的列(您应该在设计时看到列)。
然后编写dzlistheader的OnDrawItem(不是listbox的on Drawitem-留下这个未分配的)。调用方法dzlistheader.dwcol轻松绘制每个列。
请参阅示例文件夹以了解基本功能。
您应该编写dzlistheader(不是列表框)的OnDrawItem,遵循此想法:
procedure TForm1.DzListHeaderDrawItem (Control: TWinControl; Index: Integer; Rect: TRect;
State: TOwnerDrawState);
var P: TPerson;
begin
P := TPerson(ListBox.Items.Objects[Index]);
DzListHeader.DwCol( 0 , Rect, P.ID);
DzListHeader.DwCol( 1 , Rect, P. Name );
DzListHeader.DwCol( 2 , Rect, P.Gender);
end ;只是这样!
该组件提供了第二种使用的选择,因此您无需使用对象,也无需编写代码即可绘制项目。在此选项中,您应该添加带有选项卡字符的文本单元格的项目。
假设您有下表:
| ID | 姓名 | 电话 |
|---|---|---|
| 1 | 朱恩 | 1111-2222 |
| 2 | 莎拉 | 3333-4444 |
| 3 | 阿尔弗雷德 | 5555-6666 |
因此,您只需启用autodrawtabbedText属性,然后将项目添加到列表框中,其中像这样分开的单元格,例如:
1[TAB]JHON[TAB]1111-2222
2[TAB]SARAH[TAB]3333-4444
3[TAB]ALFRED[TAB]5555-6666
注意:[TAB]代表#9字符
然后只需配置所需的列即可。在此示例中,将是列:ID,名称,电话。没有任何代码行,这将打印列表中的所有项目,并按列参数对齐。
如果要在运行时添加项目,则可以使用AddItem函数,指定将在选项卡式分离的文本中转换的一系列字符串。
您可能需要将on Drawitem与选项卡式文本一起自定义绘制。在这种情况下,您应该将禁用的自动介质tabbedText放置并编写事件OnDrawItem,然后使用getIteMarray提取当前项目的数组,并使用dwcol方法分开单元格进行绘制。
要打开自定义对话框,只需在标题或列的任何部分右键单击即可。在自定义对话框中,您可以重新排序列,显示/隐藏列并设置默认顺序。
AllowMoving: Boolean =启用/禁用列重新定位
AllowResize: Boolean = enable/disable列移动(如果为false,列。可算无关紧要)
AutoDrawTabbedText: Boolean =使用autodrawtabbedtext时,您无需使用对象或on DrawtItem。您可以将项目添加到列表框中,其中带有选项卡定界符以拆分列。在这种情况下,您无需代码即可绘制项目。有两种方法可与选项卡式文本一起使用:addItem(添加项目数组,因此组件自动将其转换为选项卡式文本); getArrayText(返回请求的索引数组)。您仍然可以将此属性保留,并使用选项卡式文本,编写事件on Drawitem并使用getArrayText读取分离的列的文本。
ColorNormalCol: TColor =列背景颜色
ColorHoverCol: TColor =列鼠标列在列上的列背景颜色
ColorLineNormal: TColor =线背景颜色(在列表框上)不是奇数行(或useodd disabled),而不是选择行
ColorLineOdd: TColor =启用奇数线和useodd时线背景颜色
ColorLineSel: TColor =选择行时线背景颜色
ColorShape: TColor =指示移动或调整定向的仪表板的颜色
Columns: TDzListHeaderColumns =列集合
HeaderHeight: Integer =固定标头高(如果需要的话,可以在列标题中输入多线)
LineCenter: Boolean =表示DWCOL函数根据行高垂直绘制文本集中式绘制
LineTop: Integer =表示LineCenter为False时,表示文本对DWCOL的位置
ListBox: TCustomListBox = ListBox对象(必需!)
TextMargin: Integer =列的左右像素中的空间
TitleFont: TFont =列标题标题标题
UseOdd: Boolean =使用特定的颜色背景(请参阅colorlineodd属性)
Alignment: TAlignment =表示DWCOL功能上使用的文本对齐
Caption: String =列标题的字幕文本
CaptionEx: String =此字幕是可选的,如果要指定一个完整的字幕以在自定义对话框中显示(例如:标题:“ id”,catchionex:“ of Person of Person”),则使用
Customizable: Boolean =允许该列在自定义对话框中进行自定义
CustomTextFont: Boolean =确定为TextFont属性存储的存储(在TextFont更改时将自动设置)
Hint: String =列提示
MaxWidth: Integer =调整大小时列最大宽度
MinWidth: Integer =调整大小的列最小
Name: String =列名称以查找列(ColbyName函数)和用于保存/加载自定义(SaveCustom/LoadCustom函数)。自定义需要列名称,因为您可以更改项目,在这种情况下,该列将根据列名的正确顺序保存。
Sizeable: Boolean =允许列调整大小
TextFont: TFont =画布用来绘制此列的项目文本的字体(如果不更改,帆布使用ListBox字体来绘制项目)
Visible: Boolean = show/hide列
Width: Integer =列宽度
Data: Pointer =指针免费使用(非公开属性)
procedure LoadCustom ( const A: String);从字符串中加载列自定义,包括位置,大小和可见性。您可以从注册表/INI文件加载。
function SaveCustom : String;将列定制为字符串,包括位置,大小和可见性。您可以保存到注册表/INI文件。
function ColByID (ID: Integer): TDzListHeaderCol;通过列ID返回tdzlistheadercol。移动列(列的位置由索引属性定义)时,ID保持固定。
function ColByName ( const aName: String): TDzListHeaderCol;按列名返回tdzlistheadercol。
procedure DwCol (ID: Integer; Rect: TRect; const Value : Variant; Margin: Integer = 0 );在OnDrawItem上使用,绘制列项目文本。 ID代表考虑集合中的顺序的列号。因此,即使列在运行时移动,ID也始终保持不变。这是列的主要标识。该值表示要打印的文本。请注意,该值是变体类型,因此您当然不需要转换为字符串,除非您要格式化值。您可以在列的左侧指定边距,以绘制图标或其他自定义绘制(请参阅示例源)。
function AddItem ( const Ar: TArray<String>): Integer;此功能可帮助您将项目添加到ListBox,并自动将数组字符串与Tab字符分开。仅当您使用选项卡式定界符方法将数据存储到列表框中时,才应使用此功能。通常,您将需要与AutoDrawTabbedText属性一起使用,因此您无需编写OnDrawItem。
function GetItemArray (Index: Integer): TArray<String>;返回列表框中索引的字符串数组,考虑到项目文本的数据由选项卡字符分开。您可以使用GetItemArray(Index)[Column]快速读取单元格。
function GetLeft : Integer;返回列的左侧位置,根据RECT边界。
function GetRight : Integer;根据RECT界限返回列的正确位置。
procedure OnColumnClick (Sender: TObject; Col: TDzListHeaderCol);当在列上左键单击时发生。
procedure OnColumnDraw (Sender: TObject; Col: TDzListHeaderCol; Canvas: TCanvas; Rect: TRect; Hover: Boolean);如果设置此事件,则可以捕获列标题绘制的时间,从而使您可以更改画布或将一些添加到当前的涂漆列中。事件发射时,列已经绘制,但没有涂在屏幕上,因为使用了内部位图。因此,此事件使您可以更改此位图画布。事件终止时,将位图涂在屏幕中。悬停参数表示鼠标目前在列上。
procedure OnColumnRClick (Sender: TObject; Col: TDzListHeaderCol);当在列上右键单击时发生。
procedure OnColumnResize (Sender: TObject; Col: TDzListHeaderCol);在调整列大小后发生。
procedure OnDrawItem (Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);您应该使用此事件使用DWCOL方法来编写所有列(请参阅示例源)。
如果您使用的是autodrawtabbedtext = true,此事件将不会发射
procedure MouseEnterCol (Sender: TObject; Col: TDzListHeaderCol);当鼠标进入列区域时发生。
procedure MouseLeaveCol (Sender: TObject; Col: TDzListHeaderCol);当鼠标离开列区域时,就会发生。