На этом шаге мы рассмотрим компонент TListBox
Компонент TListBox (Список) очень часто применяется в программах для Windows. Он позволяет выбрать одну или несколько строк в списке. Строки могут содержать как текст, так и рисунки.
Первоначально компонент TListBox, размещенный в форме, изображается в виде пустого квадрата. Его размеры можно настроить с помощью мыши.
Список может иметь несколько столбцов. Это не означает, что каждый столбец представляет собой отдельный список, просто при заполнении видимой части списка строками донизу очередная строка отображается в следующем столбце. В остальном работать такой список будет так же, как обычный список.
Свойства компонент TListBox перечислены в таблице.
Свойство | Описание |
---|---|
property AutoComplete: Boolean; | Если содержит значение True, выбранный элемент в списке заменяется на тот, начальные буквы которого вводит пользователь |
type TBorderStyle = bsNone..bsSingle;
property BorderStyle: TBorderStyle |
Определяет стиль рамки:
|
property Canvas: TCanvas; | Канва для программной прорисовки пунктов списка |
property Columns: Longing; | Определяет количество колонок пунктов в списке |
property Count: Integer; | Содержит количество строк в компоненте |
property ExtendedSelect: Boolean; | Если ExtendedSelect=True и MultiSelect=True, выбор пункта без одновременного
нажатия клавиши |
property IntegralHeight:Boolean; | Если IntegralHeight=True и Style<>lbOwnerDrawVariabe, в списке отображается целое количество пунктов |
property ItemHeight: Integer; | Определяет высоту элемента в пикселях для Style=lbOwnerDrawFixed |
property ItemIndex: Integer; | Содержит индекс элемента, имеющего фокус ввода. Если MultiSelect=False, совпадает с индексом выделенного пункта |
property Items: TStrings; | Содержит набор строк, показываемых в компоненте |
property MultiSelect: Boolean; | Разрешает/отменяет возможность выбора нескольких пунктов |
property SelCount: Integer; | Содержит количество выбранных пунктов |
property Selected[X: Integer] : Boolean; | Содержит признак выбора для элемента с индексом X (первый элемент имеет индекс 0) |
property Sorted: Boolean; | Разрешает/отменяет сортировку строк в алфавитном порядке |
type TListBoxStyle = (lbStandard, lbOwnerDrawFixed, lbOwnerDrawVariable);
property Style: TListBoxStyle; |
Определяет способ прорисовки элементов:
|
property TabWidth: Integer; | Задает ширину табуляционного пробела |
property Toplndex: Integer; | Индекс первого видимого в окне пункта списка |
Создание элементов (пунктов) списка компонента реализуется с помощью методов его свойства Items - Add, Append, Insert или LoadFromFile.
Для компонента определены два события OnDrawItem и OnMeasureItem, связанные с программной прорисовкой элементов списка:
type TOwnerDrawState = set of (odSelected, odGrayed, odDisabied, odChecked, odFocused); TDrawItemEvent = procedure (Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState) of object; property OnDrawItem: TDrawItemEvent; type TMeasureItemEvent = procedure (Control: TWinControl; Integer; var Height: Integer) of object; property OnMeasureItem: TMeasureItemEvent;
Первое событие возникает в момент, когда программа должна нарисовать очередной элемент. Обработчик события получает ссылку на список выбора Сontrol, индекс изображаемого элемента Index, границы элемента Rect и его состояние State. Прорисовка ведется с помощью свойства Canvas.
Поскольку программная прорисовка обычно связана с изображением рисунков, параметр Control задан как абстрактный объект TWinControl, поэтому в обработчике должно проводиться необходимое преобразование типов.
Событие OnMeasureItem возникает только для Style=lbOwnerDrawVariabie. Оно предшествует событию onDrawItem, и в ходе его обработки программа должна установить нужную высоту очередного элемента. Обработчику передается индекс элемента Index и переменная Height, в которой он должен вернуть высоту элемента.
Как образец использования списка приведем небольшую программу, где в качестве объекта TString используется перечень шрифтов, находящихся на вашем компьютере.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class (TForm) ListBox1: TListBox; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure ListBox1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin ListBox1.Items:=Screen.Fonts; ListBox1.ItemIndex:=-1; ListBox1.Style:=lbOwnerDrawFixed; ListBox1.ItemHeight:=24; ListBox1.Font.Height:=18; Form1.Font.Height:=36; Memo1.ParentFont:=True; Memo1.Clear; Memo1.Lines.Add ('Аа Бб Вв Гг Дд Ее Жж Зз'); end; procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin TListBox(Control).Canvas.FillRect(Rect); TListBox(Control).Canvas.Font.Name:=TListBox(Control).Items[Index]; TListBox(Control).Canvas.TextOut(Rect.Left, Rect.Top, TListBox(Control).Items[Index]); end; procedure TForm1.ListBox1Click(Sender: TObject); begin Form1.Caption:='Выбран щрифт '+ListBox1.Items [ListBox1.ItemIndex]; Form1.Font.Name:=ListBox1.Items [ListBox1.ItemIndex]; end; end.
Эта программа позволяет просмотреть начертание русских букв всех шрифтов, установленных на компьютере. Результат работы программы показан на рисунке.
Рис.1.Программа просмотра шрифтов
На следующем шаге мы рассмотрим компонент TComboBox