18.1.10. TListBox - список выбора

Компонент класса TListBox представляет собой стандартный для Windows список выбора, с помощью которого пользователь может выбрать один или несколько элементов выбора. В компоненте

предусмотрена возможность программной прорисовки элементов, поэтому список может содержать не только строки, но и произвольные изображения.

Свойства компонента:

property AutoComplete: Boolean;

Определяет, будет ли компонент автоматически получать фокус ввода при нажатии пользователем на клавиатуру

type TBorderStyle = bsNone..-bsSingle; property Border-Style: TBorderStyle;

Определяет стиль рамки: bsNone - нет рамки; bssingle - рамка толщиной 1 пиксель

property Canvas: TCanvas; property Columns: Longing;

Канва для программной прорисовки элементов Определяет количество колонок элементов в списке

property Count: Integer;

Содержит количество строк в компоненте

property ExtendedSelect: Boolean;

Если ExtendedSelect =True и MultiSelect==True, выбор элемента без одновременного нажатия Crtl или Alt отменяет предыдущий выбор

property IntegralHeight:Boolean;  

Если IntegralHeight=True и Style<>lb0wner-DrawVariabe, в списке показывается целое число элементов

property ItemHeight: Integer; 

Определяет высоту элемента в пикселях для Style=lbOwnerDrawFixed

property Itemlndex: Integer;  

 

Содержит индекс сфокусированного элемента. Если MultiSelect=False, совпадает с индексом выделенного элемента

property Items: TStrings; 

Содержит набор строк, показываемых в компоненте

property MultiSelect: Boolean;

Разрешает/отменяет выбор нескольких элементов 

property SelCount: Integer;

Содержит количество выбранных элементов

property Selected[X: Integer] : Boolean;

Содержит признак выбора для элемента с индексом х (первый элемент имеет индекс 0)

property Sorted: Boolean; 

Разрешает/отменяет сортировку строк в алфавитном порядке

type TListBoxStyle =

(IbStandard, IbOwnerDrawFixed, IbOwnerDrawVariable) ;

property Style: TListBoxStyle; 

Определяет способ прорисовки элементов:

IbStandard - элементы рисует Windows; ibOwnerDrawFixed - рисует программа, все элементы имеют одинаковую высоту, определяемую свойством ItemHeight;IbOwnerDrawVariable -рисует программа, элементы имеют разную высоту

property TabWidth: Integer;

Задает ширину табуляционного пробела

property Toplndex: Integer;

Индекс первого видимого в окне элемента

 Создание элементов (опций) списка компонента реализуется с помощью методов его свойства Items - Add, Append, Insert млм LoadFromFile (CM. П. 16.3.1).

Для компонента определены два события, связанные с программной прорисовкой элементов списка:

type

TOwnerDrawState = set of (odSelecred, 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;

Первое событие возникает в момент, когда программа должна нарисовать очередной элемент. Обработчик события получает ссылку на список выбора control, индекс изображаемого элемента index, границы элемента Rect и его состояние State. Прорисовка ведется с помощью свойства Canvas.

Примечание

Поскольку программная прорисовка обычно связана с изображением рисунков, сохраняемых вместе с текстом в наборе Items; параметр Control задан как абстрактный объект TWinGontrol, поэтому в обработчике должно проводиться необходимое преобразование типов.

В следующем примере в каждом элементе рисуется растровое изображение и текст.

procedure TFormI.ListBoxIDrawItem(Control: TWinControl;

Index: Integer; Rect: TRect; State: TOwnerDrawState);

var

Bitmap: TBitmap;// Временная переменная для растра

Offset: Integer;

// Расстояние от растра до текста

begin

{Свойство Canvas имеет не только список ListBox, но и форма, на которую он помещен! Поэтому нужно явно указать канву. Преобразуем тип и указываем канву:}

with Control as TListBox, Canvas do

begin

FillRect(Rect);

// Очищаем прямоугольник

// Получаем из списка растр:

Bitmap := TBitmap(Items.Objects[Index]);

if Bitmap <> nil then

begin

// Вычерчиваем растр:

BrushCopy(Bounds(Rect.Left + 2, Rect.Top, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), cIRed);

// Вычисляем смещение текста (4 пикселя от растра):

Offset := Bitmap.width + 6;

end

else Offset := 2;

// Если нет растра, 2 пикселя слева

// Выводим текст:

TextOut(Rect.Left + Offset, Rect.Top, Items[Index]);

end;

end;

Обратите внимание: обработчик не учитывает состояния элемента. Окантовка сфокусированного элемента пунктиром, установка нужного цвета кисти и шрифта для выбранного элемента осуществляются автоматически. Если вас не устраивают стандартные цвета, следует проверять параметр state. Например, если перед

PillRect(Rect); // Очищаем прямоугольник в предыдущем примере вставить

if odSelected in State then

begin

Brush.Color := clYellow;

Font.Color := clBlack;

Font.Style := [fsBold];

end;

выбранные элементы будут подсвечены желтым фоном, а текст в них будет выведен черным утолщенным шрифтом.

Событие OnMeasureItem возникает только для Style=lbOwnerDrawVariabie. Оно предшествует событию onDrawItem, и в ходе его обработки программа должна установить нужную высоту очередного элемента. Обработчику передается индекс элемента Index и переменная Height, в которой он должен вернуть высоту элемента. Например:

procedure TForm1.ListBoxIMeasureItem(Control: TWinControl;

Index: Integer;

var Height: Integer);

var

Bitmap: TBitmap;

begin

Bitmap := TBitmap((Control as TListBox).Items.Objects[Index]) ;

if Bitmap <> nil then

Height := Bitmap.Height

else

Height := abs(ListBoxl.Font.Height)

end;