Шаг 14.
Вкладка Win32. Компонент TListView

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

    Компонент TListView (Комбинированный список) расширяет возможности ранее рассмотренного компонента TListBox, представляющего собой простой список строк. Комбинированный список содержит значительно больше возможностей представления информации. Компонент TListView ориентирован на представление данных в виде структуры "объект-набор свойств", как, например, файлов вместе со своими атрибутами: размером, датой создания и т.д. Использовать его как список однородной информации неэффективно.

    Сразу после создания в списке не содержится ни одного элемента. Режим его будущей работы определяется значением свойства ViewStyle, для которого допустимы следующие значения.

    Значения свойства VIewStyle:

    Для подробного знакомства с комбинированным списком разместите в форме компоненты TListView, TImageList и TComboBox. В список изображений необходимо поместить несколько изображений из файлов с расширениями *.bmp или *.ico, которые можно взять из каталога Images\Icons.

    В обработчике события OnCreate для формы происходит создание элементов для компонента ListView1 и их связывание с изображениями ImageList1.

    Затем в обработчике OnCreate заполняется компонент ComboBox1, при этом используются все четыре стиля типа TViewStyle. Программа приведена ниже.

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ImgList, ComCtrls;
type
  TForm1 = class(TForm)
    ListView1: TListView;
    ImageList1: TImageList;
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
  I : Integer;
  ListItem : TListItem;
  NewColumn : TListColumn;
begin
  // Создание элементов ListView для каждого изображения в ImageList.
  with ListView1 do
  begin
    SmallImages := ImageList1;
    LargeImages := ImageList1;
    for I :=1 to ImageList1.Count-1 do
    begin
      ListItem := Items.Add;
      ListItem.Caption := 'Изобр.' + IntToStr(I);
      ListItem.ImageIndex := I;
    end;
    //Создание двух колонок отображения в режиме vsReport.
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Колонка 1';
    NewColumn := Columns.Add;
    NewColumn.Caption := 'Колонка 2';
    //Добавление стилей View и констант в ComboBox.
    ComboBox1.Items.AddObject('vsIcon', TObject (vsIcon));
    ComboBox1.Items.AddObject('vsList', TObject (vsList));
    ComboBox1.Items.AddObject('vsReport', TObject (vsReport));
    ComboBox1.Items.AddObject('vsSmallIcon', TObject (vsSmallIcon));
    //Отображение первого элемента ComboBox.
    ComboBox1.ItemIndex := 0;
  end;
end;

procedure TForm1.ComboBox1Click(Sender: TObject);
begin
  with ComboBox1 do
    ListView1.ViewStyle := TViewStyle (Items.Objects [ItemIndex]);
end;
end.
Текст этого примера можно взять здесь.


Рис.1. Для структурного списка установлен режим vsIcon (vsReport)

    То же самое можно получить, заполнив все элементы на этапе проектирования с помощью редакторов, как для компонента ListItem1, так и для компонента ComboBox1. Редактор для ListItem1 вызывается после двойного щелчка на поле свойства Items или двойного щелчка непосредственно на изображении комбинированного списка. Для компонента ComboBox1 необходимо будет связать элементы с соответствующими объектами, поэтому обработчик OnCreate будет выглядеть так.

procedure TForm1.FormCreate (Sender: Tobject);	
begin	
  ComboBox1.Items.Objects [0]:= TObject (vsIcon);
  ComboBox1.Items.Objects [1]:= TObject (vsList);
  ComboBox1.Items.Objects [2]:= TObject (vsReport);	
  ComboBox1.Items.Objects [3]:= TObject (vsSmallIcon);
end;

    В редакторе новый элемент создается после щелчка на кнопке NewItem, для которого в свойстве Caption (Заголовок) задается его имя, в свойстве ImageIndex (Номер рисунка) - номер рисунка из списка рисунков для свойств LargeImages или SmallImages, а для свойства StateIndex (Номер состояния) - номер рисунка из списка рисунков свойства StateImages. Каждый элемент, в свою очередь, может состоять из нескольких вложенных элементов, представляющих собой свойства этого элемента.

    Настройка структуры и внешнего вида комбинированного списка осуществляется с помощью свойств, приведенных ниже.

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

Таблица 1. Свойства компонента TListView
Свойство Описание
property AllocBy: Integer; Число элементов списка, хранимое в памяти. Управляя этим значением, можно существенно повысить быстродействие некоторых операций по работе со списком, например сортировки
property Checkboxes: Boolean; При значении True в начале каждой строки списка отображается флажок
property ColumnClick: Boolean; При значении True заголовкам столбцов разрешено работать в режиме кнопок: допустимы щелчки на заголовках и обработка этих щелчков. Такая возможность полезна для сортировки содержимого списка, если щелкнуть на его заголовке/TD>
property Columns: TListColumns; Содержит объекты-колонки. Используйте это свойство для удаления или добавления колонок, а также для изменения их свойств. Колонки видны только в режиме ViewStyle=vsReport. И наоборот: элементы в этом режиме видны, только если определена хотя бы одна колонка
property FlatScrollBars: Boolean; При значении True полосы прокрутки должны выглядеть плоскими
property GridLines: Boolean; При значении True между элементами списка рисуются разделительные линии
property HideSelection: Boolean; При значении True выделение текущего элемента списка автоматически сбрасывается при переключении фокуса на другой элемент формы. Такая возможность используется, когда ведется одновременная работе с несколькими списками, что позволяет быстро определить, какой список имеет фокус
property HotTrack: Boolean; При значении True выбор элемента осуществляется наведением на него указателя (без щелчка)
property HotTrackStyles: TListHotTrackStyles; Если значение свойства HotTrack равно True, то способ выделения элемента определяется комбинацией значений свойства (множества):
  • htHandPoint (указатель мыши принимает вид руки),
  • htUnderlineCold (невыделенные элементы подчеркиваются),
  • htUnderlineHot (выделенный элемент подчеркивается)
property HoverTime: Integer; При значении свойства HotTrack равном True свойство HoverTime определяет время (в миллисекундах), по истечении которого после наведения на элемент указателя он будет считаться выделенным
property IconOptions: TIconOptions; Способ упорядочения значков в списке. Имеет три свойства:
  • Arrangement - определяет порядок выравнивания (слева направо или сверху вниз);
  • AutoArrange - определяет, будут ли пиктограммы переупорядочиваться автоматически;
  • WrapText - определяет, будет ли заголовок выравниваться по ширине пиктограммы или располагаться слева от нее
property Items: TListItems; Содержит список всех элементов
property LargeImages: TCustomImageList; Список изображений. Стиль отображения определен значением vsIcon
property MultiSelect: Boolean; При значении True разрешается выбирать несколько элементов списка
property OwnerData: Boolean; При значении True обработка содержимого списка выполняется в тексте программы. Подобный список называется виртуальным, и разработчик берет на себя программирование его основных функций, связанных с динамическим формированием значений элементов. Это необходимо при обработке больших наборов данных
property OwnerDraw: Boolean; При значении True рисование списка и его элементов явно выполняется в тексте программы по алгоритму разработчика
property ReadOnly: Boolean; Запрещает/разрешает редактирования надписей
property RowSelect: Boolean; При значении True разрешается выделять целую строку списка
property ShowColumnHeaders: Boolean; При значении True отображаются заголовки столбцов
property SmallImages: TCustomImageList; Список изображений. Стиль тображения определен значением, отличающимся от vsIcon
property SortType: TSortType; Способ автоматической сортировки списка. Возможные значения:
  • stNone - сортировка не выполняется;
  • stData - сортировка выполняется на основе значений свойства Data каждого элемента списка;
  • stText - сортировка выполняется на основе значений свойства Caption каждого элемента списка;
  • stBoth - сортировка выполняется на основе значений как свойства Data, так и свойства Caption
property StateImages: TCustomImageList; Список изображений, отражающих промежуточное состояние объекта

    В заключение приведен перечень наиболее важных методов и событий для класса TListView. Некоторые методы (например, получение элемента, ближайшего к указанной точке клиентской области) могут показаться на первый взгляд странными. Не надо забывать, что основное назначение данного компонента - отображение каталогов в стиле Windows, когда пользователь может щелкать на значке или рядом с ним.

    Основные методы класса TListView.

procedure Arrange (Code:  TListArrangement);
Задает способ выравнивания пиктограмм при значении свойства ViewStyle равном vsIcon или vsSmallIcon.
function FindCaption (StartIndex: Integer; Value: string; Partial, 
          Inclusive Wrap: Boolean): TListItem;
Поиск элемента списка, заголовок которого совпадает со значением параметра Value. Если параметр Inclusive имеет значение True, то поиск выполняется начиная с элемента с номером, хранящимся в параметре StartIndex. При этом если параметр Wrap также имеет значение True, то поиск по достижении конца списка продолжается с его начала. Параметр Partial разрешает не искать полное совпадение заголовков, а использовать значение Value как подстроку.
function  FindData (StartIndex: Integer:  Value: Pointer; 
          Inclusive, Boolean): TListItem; 
Аналогично предыдущему, только производится сравнение не заголовков, а связанных с объектом данных (свойство Data).
function GetHitTestInfoAt (X, У; Integer): THitTests; 
Используется для определения нахождения элемента под указанной (X,Y) точкой. Тип THitTests описывает различные местоположения точки.
function GetItemAt (X, Y: Integer): TListItem; 
Возвращает элемент списка, области которой принадлежит указанная точка.
function GetNearestItem (Point; TPoint; Direction; 
       TSearchDirection): TListItem; 
Возвращает элемент списка, ближайший к указанной точке по заданному направлению (параметр Direction).
function GetNextItem (StartItem: TListItem; Direction: TSearchDirection; 
         States: TItemStates):  TListItem; 
Возвращает элемент списка, следующий за указанным в параметре StartItem в направлении Direction. Если используется список StateImages, то можно учитывать и наличие свойства State.
function   GetSearchString:  String;   
Возвращает текущую строку, которую пользователь ввел для поиска нужного элемента.
procedure Scroll (DX, DY: Integer);
Прокрутка содержимого списка на DX пикселей по горизонтали и DY - по вертикали.
function StringWidth (S: string): Integer; 
Возвращает ширину строки S в пикселях с учетом текущего шрифта списка.
procedure UpdateItems (First Index, LastIndex: Integer);
Прорисовка элементов списка в диапазоне от FirstIndex до LastIndex.

    События класса TListView.

   
Таблица 2. События класса TListView
Событие Описание
property OnCustomDraw: TLVCustomDrawEvent;
property OnAdvancedCustomDraw: TLVAdvancedCustomDrawEvent;
Программная прорисовка внешнего вида списка
property OnCustomDrawItem: TLVCustomDrawItemEvent;
property OnAdvancedCustomDrawItem: TLVAdvancedCustomDrawItemEvent;
Программная прорисовка элемента списка
property OnCustomDrawSubItem: TLVCustomDrawSubItemEvent;
property OnAdvancedCustomDrawSubItem: TLVAdvancedCustomDrawSubItemEvent;
Программная прорисовка вложенного элемента (свойства) списка
property OnChange: TLVChangeEvent; Элемент списка был изменен
property OnChanging: TLVChangingEvent; Происходит изменение элемента списка
property OnColumnClick: TLVColumnClickEvent; Щелчок мышью на заголовке столбца
property OnColumnDragged: TNotifyEvent; Заголовок столбца был перемещен (с помощью мыши) на новое место
property OnColumnRightClick: TLVColumnRClickEvent; Щелчок на заголовке столбца правой кнопкой мыши
property OnData: TLVOwnerDataEvent; Генерируется перед тем, как элемент списка должен быть нарисован. Данное сообщение обрабатывается, когда содержимое каждого элемента формируется программно (режим "виртуального списка")
property OnDataFind: TLVOwnerDataFindEvent; Запрос на поиск данных от метода FindData
property OnDataHint: TLVOwnerDataHintEvent; Изменен диапазон видимых на экране элементов (например, при прокрутке)
property OnDataStateChange: TLVOwnerDataStateChangeEvent; Изменение состояния элемента (событие возникает, только если значение свойства OwnerData равно True)
property OnDeletion: TLVDeletedEvent; Пользователь отдал команду на удаление элемента
property OnDrawItem: TListViewDrawItemEvent; Программная прорисовка содержимого элемента (событие возникает, только если значение свойства OwnerData равно True)
property OnEdited: TLVEditedEvent; Завершено редактирование элемента
property OnEditing: TLVEditingEvent; Происходит редактирование элемента
property OnGetImageIndex: TLVNotifyEvent; Генерируется перед отображением элемента на экране. Его можно обрабатывать, чтобы динамически задавать номер изображения из списка
property OnGetSubItemImage: TLVSubItemImageEvent; То же для вложенного элемента (SubItem)
property OnInfoTip: TLVInfoTipEvent; Пользователь навел указатель мыши на элемент и задержал его
property OnInsert: TLVDeletedEvent; В список добавлен новый элемент
property OnSelectItem: TLVSelectItemEvent; Из списка выбран элемент

    Ниже приводятся методы, свойства и методы класса TListItems, который характеризует конкретный элемент списка.

    Методы класса TListItems.

function Add: TListItem; 
Создание нового элемента и его добавление в конец списка. Функция возвращает ссылку на этот элемент.
function AddItem (Item: TListItem; Index: Integer = -1): TListItem; 
Вызывайте AddItem для добавления элемента в любое место списка. Свойства элемента, указанного в параметре Item, копируются во вновь создаваемый элемент. Параметр Index указывает место размещения. Если значение Index отрицательное, то добавление в конец списка. AddItem возвращает добавленный TListItem.
procedure BeginUpdate; 
Процедура BeginUpdate блокирует прорисовку списка, а процедура EndUpdate снимает блокировку.
procedure Clear; 
Удаление всех элементов списка и освобождение занимаемой ими памяти.
procedure Delete (Index: Integer); 
Удаление указанного элемента.
function IndexOf (Value: TListItem): Integer; 
Возвращает номер элемента, указанного в качестве параметра.
function Insert (Index: Integer): TListItem; 
Создание нового элемента и его добавление в указанную позицию списка. Функция возвращает ссылку на этот элемент.
procedure SetCount (Value: Integer); 
Задание числа элементов в списке.

    Свойства класса TListItem.

   
Таблица 3. Свойства класса TListItem
Свойства Описание
property Caption: String; Заголовок элемента
property Checked: Boolean; При значении True флажок элемента включен (свойство Checkboxes имеет значение True)
property Cut: Boolean; Элемент рисуется в виде, показывающем, что он вырезан командой Cut (Вырезать). Все действия по реализации процедуры такого рисования разработчик должен программировать самостоятельно
property Data: Pointer; Свойство, имеющее тип Pointer и указывающее на связанный с элементом объект
property Focused: Boolean; При значении True элемент имеет фокус
propertyIndex: Integer; Положение элемента в коллекции TListItems
property Left: Integer; Горизонтальный сдвиг от левой границы списка
property Position: TPoint; Свойство типа TPoint, определяющее координаты (в пикселях) элемента внутри списка
property Selected: Boolean; При значении True элемент выделен

    Методы класса TListltem.

procedure Delete; 
Удаление элемента из списка. Для освобождения занимаемой им памяти надо использовать метод Free.
function DisplayRect (Code: TDisplayCode): TRect; 
Определяет прямоугольные координаты элемента с учетом параметра Code (границы всего элемента, только пиктограммы, только текст, пиктограммы и текст).
function GetPosition: TPoint;
Определение положения элемента в списке: смещение верхнего левого угла относительно начала списка.
procedure SetPosition (const Value: TPoint); 
Установка нового положения элемента.
procedure MakeVisible (PartialOK: Boolean); 
Прокрутка списка так, чтобы элемент стал видимым. Если значение параметра PartialOK равно True и элемент уже частично виден, то прокрутка не выполняется.
procedure Update; 
Прорисовка элемента.

    На следующем шаге мы рассмотрим компонент THeaderControl.




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