Компонент класса 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); 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;
8 8 8
| |