Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Pascal и Delphi / Иллюстрированный самоучитель по Delphi 6 / Часть III. Компоненты и программы / Использование компонентов общего назначения / Компоненты страницы Standart /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


TListBox - список выбора - Программирование от RIN.RU
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);
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  Обсудить в чате

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь