Шаг 11.
Вкладка Standard. Компонент TListBox

    На этом шаге мы рассмотрим компонент TListBox

    Компонент TListBox (Список) очень часто применяется в программах для Windows. Он позволяет выбрать одну или несколько строк в списке. Строки могут содержать как текст, так и рисунки.

    Первоначально компонент TListBox, размещенный в форме, изображается в виде пустого квадрата. Его размеры можно настроить с помощью мыши.

    Список может иметь несколько столбцов. Это не означает, что каждый столбец представляет собой отдельный список, просто при заполнении видимой части списка строками донизу очередная строка отображается в следующем столбце. В остальном работать такой список будет так же, как обычный список.

    Свойства компонент TListBox перечислены в таблице.

   
Таблица 1. Свойства компонента TListBox
Свойство Описание
property AutoComplete: Boolean; Если содержит значение True, выбранный элемент в списке заменяется на тот, начальные буквы которого вводит пользователь
type TBorderStyle = bsNone..bsSingle;

property BorderStyle: TBorderStyle

Определяет стиль рамки:
  • bsNone - нет рамки;
  • bsSingle - рамка толщиной 1 пиксель
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;

Определяет способ прорисовки элементов:
  • lbStandard - стандартный список (стиль по умолчанию);
  • lbOwnerDrawFixed - каждый элемент списка имеет фиксированную высоту, но способ его отображения определяется программистом;
  • lbOwnerDrawVariable - кроме способа рисовать, в тексте программы необходимо явно задать размер каждого элемента списка (что позволяет создать списки с элементами разных размеров);
  • lbVirtual - список является виртуальным, все элементы имеют одинаковую высоту;
  • lbVirtualOwnerDraw - список является виртуальным, можно связать индексы списка с дополнительными объектами
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




Предыдущий шаг Содержание Следующий шаг