Delphi列表框组件(TListBox)详解

2/10/2017来源:ASP.NET技巧人气:839

列表框组件(TListBox)

此组件为一个标准的Windows 列表框组件,它用于显示一系列的列表,用户可以选择、加入、删除或修改其中的项目。

1.TLlistBox 组件的典型用法

在Windows 应用程序中,经常要用到列表框。列表框能够在一个可翻滚的窗口中列出多个项让用户选择。例如在Delphi 的IDE 中,当使用“View”菜单上的“Component List”命令时,Delphi 将列出VCL 中的所有组件。 程序中主要利用Items 属性进行各种项目的控制,例如用Items.Strings[]获取某个选项的内容,Items.Add()和Items.Delete()增加或删除选项条目。通过ItemIndex 属性指定或者获取当前选项。

2.TListBox 组件的重要属性

·Columns 列表框的栏数 ·ExtendedSelect 此属性用于设置是否允许使用Shift 键和Ctrl 键同时选择多个项 ·IntegralHeight 列表框的高度总是列表框中项的高度的整数倍 ·ItemHeight 此属性用于设置列表框中每一项的高度 ·ItemIndex 此属性用于设置返回列表框中被选择的项的序号 ·Items 列表框中所有的项都是通过Items 属性访问的 ·MultiSelect 允许同时选择多项 ·SelCount 返回当前选择的项的个数 ·Selected 此属性用于判断指定的项是否被选择 ·Sorted 此属性用于设置列表框中的项是否要按字母顺序排序 ·Style 此属性用于设置列表框的风格 下面介绍程序中TListBox 组件常用的属性。

(1)Columns 属性

此属性默认值为0,列表框以单栏显示,如果内容太多,列表框将自动加上一个垂直方向的滚动条。 如果此属性设为大于0 的值,列表框将首先填满一栏。如果在一栏中不能完全显示,就显示在第2 栏、第3 栏,依次类推,但屏幕上最多只显示Columns 属性设置的栏数。 如果此属性设为2,屏幕上只显示两栏,如果实际内容不止两栏,将自动加上一个水平方向的滚动条。

(2)ExtendedSelect 属性

此属性用于设置是否允许使用Shift 键和Ctrl 键同时选择多个项,前提是MultiSelect 属性必须设为True,如果ExtendedSelect 属性设为True,当用户按下并保持住Shift 键时就可以选择多个连续的项,按下并保持住Ctrl 键就可以选择多个项(不一定连续)。

(3)IntegralHeight 属性

如果此属性设为True,且Style 属性设为IsOwnerDrawFixed 时,列表框的高度将自动调整到列表框中项的高度的整数倍。如果此属性设为False,列表框的最后一项可能不能完整地显示,因为列表框的高度不一定正好是ItemHeight 属性的整数倍。

(4)ItemHeight 属性

当Style 属性设为IsOwnerFixed(用户自定义)时,此属性用于设置列表框中每一项的高度。如果IntegralHeight 属性设为True,整个列表框的高度将随着ItemHeight 属性的值自动调整。如果Style属性设为IsStandard 或IsOwnerDrawVariable,ItemHeight 属性将无意义。

(5)ItemIndex 属性

此属性用于设置返回列表框中被选择的项的序号。如果MultiSelect 属性设为True,并且用户选择了多个项,此属性返回其中有输入焦点的项的序号。程序示例代码如下:

[delphi] view plain copy PRocedure TForm1.FormCreate(Sender: TObject);   var     I: Integer;   begin     ListBox1.MultiSelect: = False;     Button.Caption = ’Move to Top’;     for I: = 1 to 10 do       ListBox1.Items.Add(’Item’ + IntToStr(I));   end;      procedure TForm1.Button1Click(Sender: TObject);   begin     ListBox1.Items.Move(ListBox1.ItemIndex, 0);   end;  

(6)Items 属性

列表框中所有的项都是通过Items 属性访问的,Items 属性是个典型的TStrings 对象,通过这个对象,可以在运行期操纵列表框中的项,程序示例代码如下:

[delphi] view plain copy var     F: file;     i: integer;   begin     for i := 0 to (FileListBox1.Items.Count - 1) do     begin       try         if FileListBox1.Selected[i] then         begin           if not FileExists(FileListBox1.Items.Strings[i]) then           begin             MessgeDlg(’File: ’ + FileListBox1.Items.Strings[i] +               ’not found’, mtError, [mbok], 0);             continue;           end;           AssignFile(F, FileListBox1.Items.Strings[i]);           Reset(F, l);           ListBox1.Items.Add(IntToStr(FileSize(F)));           CloseFile(F);         end;       finally       {do something here}       end;     end;   end;  

(7)MultiSelect 属性

如果此属性设为True,表示允许同时选择多项。用户可以按住Ctrl 或Shift 键不放,用鼠标选择项目,或直接用鼠标拖拽进行选择。

(8)Sorted 属性

此属性用于设置列表框中的项是否要按字母顺序排序。对于排序的列表框,通过调用Add()或Insert()所增加的项将自动移到合适的地方。程序示例代码如下: [delphi] view plain copy procedure TForm1.FormCreate(Sender: TObject);   begin     ListBox1.Items.Add(’Item2’);     ListBox1.Items.Add(’Item3’);     ListBox1.Items.Add(’Item1’);     ListBox1.Items.Add(’Item4’);   end;  

(9)Style 属性

此属性用于设置列表框的风格。它设定了如下3 个用户可选值。 • lbStandard:每一个项是一个字符串,每一项高度相同。 • lbOwnerDrawFixed:项不一定是字符串,也可以是图像,项的高度是由ItemHeight 属性指定。 在显示每一项之前都会触发OnDrawItem 事件。 • lbOwnerDrawVariable:项不一定是字符串,也可以是图像,项的高度可以不同。在显示每一项之前都要触发两个事件,第1 个是OnMeasureItem 事件,让程序指定每一项的高度,第2 个是OnDrawItem 事件,让程序画出每一项。

3.TListBox 组件的重要事件

·OnDrawItem 如果Style 属性设为lbOwnerDrawFixed 或lbOwnerDrawVariable,且列表框的项需要重画时,触发该事件 ·OnMeasureItem 如果Style 属性设为lbOwnerDrawVariable,且列表框的项需要重画时,触发该事件

4.TListBox 组件的重要方法

TListBox 组件在程序中常用的方法是Clear,它的功能是将列表框内所有的选项删除。

Listbox中的item如何根据内容的不同而显示不同的颜色

1、ListBox1 的 Style 属性改为 lbOwnerDrawVariable 2、在ListBox的OnDrawItem事件裡,根据item的值,改变Canvas属性即可。

例如:

[delphi] view plain copy procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;     Rect: TRect; State: TOwnerDrawState);   begin       //字体用原来默认的颜色        if Odd(index) then     //当items的index为奇数时的颜色        begin           listbox1.Canvas.Brush.Color:=clwindow;           ListBox1.Canvas.TextRect(Rect,rect.Left,Rect.Top,ListBox1.Items[index]);        end        else         //当items的index为偶数时的颜色        begin           listbox1.Canvas.Brush.Color:=clinactivecaptiontext;           ListBox1.Canvas.TextRect(Rect,rect.Left,Rect.Top,ListBox1.Items[index]);        end;        if   odSelected   in   state   then        //当选定时的颜色           begin             listbox1.Canvas.Brush.Color:=clhighlight;             ListBox1.Canvas.TextRect(Rect,rect.Left,Rect.Top,ListBox1.Items[index]);           end;   end;