Компонент TFastListView

Вернуться к оглавлению

Наследник TListView (на самом деле, является наследником промежуточного класса TColorListView, но этот промежуточный класс не предназначен для самостоятельного использования, и инкапсулирует в основном возможности по рисованию ячеек и заголовка различным цветом и шрифтами). Основное отличие от предка TListView - этот список предназначен для отображения больших наборов данных, обычно загруженных из базы данных, поэтому базовый компонент TListView используется сразу как виртуальный. Причем, отображение всегда подразумевает вид таблицы (lvReport), и другие варианты просто никогда не тестировались.

Имеется довольно значительное число внешних и функциональных улучшений, такие как сортировка и фильтрация значений по колонкам, в том числе сортировка по нескольким колонкам, упрощение сортировки по определенным правилам, запоминание ширины и порядка колонок в реестре, программный доступ к ячейкам по именам полей, сопоставленных колонкам, редактирование ячеек, возможность сохранения содержимого в Excel или текстовой файл, улучшения в отображении заголовка таблицы и многое другое.

Подробное описание

Так как это наследник стандартного TListView, то описывать все унаследованные свойства особого смысла нет. Следует оговорить следующее: при установке на форму следует сразу компоненту задать свойство ViewStyle = vsReport, так как этот визуальный компонент предназначен для работы именно в "детальном", т.е. табличном, режиме.

Важный момент: один и тот же модуль не может использовать и стандартный TListView, и TFastListView. Дело в том, что в интерфейсной части модуля FastListView классы TListView, TListItem и другие переопределяются так, чтобы имя типа TListView означало ссылку на TFastListView (и, соответственно TListItem ссылалось на TFastListItem). Сделано это в целях совместимости (хотя это может это показаться странным), а именно - с целью обеспечения возможности быстрого перехода к использованию TFastListView в программе от TListView. Для чего имеется специальная процедура импортирования свойств. Достаточно положить на форму (в режиме дизайнера) компонент TFastListView, правой кнопкой мыши по нему вызвать контекстное меню, и выбрав пункт "Импорт TListView", выбрать из списка нужный контрол. После чего старый компонент автоматически удаляется, а новый становится на его место.

Данный компонент изначально написан для Delphi5, но может работать и с более новыми версиями компилятора. При установке на палитру компонентов обратите внимание на то, чтобы в опциях пакета присутствовал символ условной компиляции RUSSIAN_LANGUAGE. Этот же символ желательно добавить в свойства каждого использующего приложения. Этот условный символ определяет то, какой набор текстовых ресурсов (русский или английский) используется для формирования текстовых сообщений и текста всплывающего на заголовке меню.

Можете отметить себе выгодную особенность TFastListView по сравнению со стандартным TListView при работе в Delphi5: он нормально работает при подключенном манифесте: нормальность проявляется в том, что не возникает постоянно исключительная ситуация где-то в дебрях программного кода в обработчике сообщения WM_NOTIFY (при наведении курсора мыши на заголовок), что просто не позволяет отлаживать программу (приходится либо отключать манифест, либо переходить к другой версии Delphi).

Обратите внимание на то, что для того, чтобы возможно было использовать методы Assign для присваивания значения из TNewQuery , в свойствах проекта должен быть определён символ условной компиляции USE_NEWQUERY. Если этот символ не определён, то метод Assign может напрямую брать данные только из стандартного TQuery и TADOQuery.

Внимание (проблема!): При использовании TFastListView, может возникать неприятная ситуация, связанная с неправильным помещением первого видимого элемента в неправильную (не первую) позицию после изменения количества элементов в списке. Это поведение полностью "обеспечивается" стандартным list-view контролом, и полностью устранить его вообще для всех случаев не удается. Существуют некоторые способы устранить эту неприятность, в тех случаях, когда она доставляет неудобства. Один из вариантов - перед изменением числа элементов в сторону уменьшения перевести свойство ViewStyle в, например, lvsIcon, а после изменения - вернуть в lvsReport. Но это не всегда помогает. Более правильно обеспечить нулевое положение линейки вертикальной прокрутки до начала изменения количества элементов в списке. Например, выделить первый элемент, сделать его видимым (метод MakeVisible), после чего выполнить необходимые изменения, и восстановить выделение. Поскольку постоянное добавление таких действий может привести к замедлению работы с большими списками, данное "улучшение" не реализовано, и предлагается этот или другой метод устранения сбоев использовать "по месту" - в коде конечной программы.

 
TFastListView TListColumn TFastListItems TFastListItem

Свойства, события и методы класса TFastListView, доступные в Инспекторе объектов и во время исполнения.

Публикуемые свойства (свойства, которые могут быть изменены Инспектором объектов в режиме дизайна формы).
Имя свойства Тип Начальное
значение
Описание
AllowColumnDrag Boolean TRUE Разрешает перетаскивать колонки пользователю (нажимая левой клавишей мыши на заголовке колонке и перетаскивая ее влево или вправо).
Данное свойство работает (перетаскивание включено), только если не установлено свойство многострочной шапки таблицы (см. MultiHeader).
AllowColumnHide Boolean TRUE

Разрешает пользователю скрывать колонки используя контекстное меню, вызываемое на заголовке колонки. Скрытые колонки могут быть из того же меню вновь отображены. Не следует путать временно скрытые пользователем колонки с перманентно невидимыми колонками, которые может иметь TFastListView.

AutoAllocateColumns Boolean FALSE

Разрешает в программе использовать перманентно невидимые колонки, добавляемые автоматически при первом обращении (для записи данных) к колонкам по именам, которые на момент вызова в таблице отсутствуют. В случае, если значение свойства = FALSE, обращение к колонкам, отсутствующим в списке колонок, приводит к программному исключению.

AutoExpandColumn Integer -2

Позволяет автоматически расширять одну из колонок таблицы при изменении размеров таблицы (например, в результате изменения размера формы или при движении сплиттера) или при изменении размеров некоторой колонки пользователем. Специальное значение -2 используется для пропорционального изменения размеров колонок, свойство AutoSize которых равно TRUE. Значение -1 означает запрет на автоматическое изменение размеров колонок. Во всех остальных случаях используется как индекс колонки, размер которой изменяется для того, чтобы общая ширина таблицы оставалась не меньше ширины клиентской части окна контрола (не включая линейку вертикальной прокрутки).

BoldIfFocused Boolean TRUE Элемент в фокусе ввода отображается с утолщенным шрифтом, когда это свойство = TRUE.
CheckBoxes Boolean FALSE

В стандартном TListView позволяет быстро добавить переключаемые пользователем флажки (check box) в 0-й колонке (соответствующей свойству отдельного элемента Caption). В TFastListView свойство не работает и не используется. Для добавления аналогичного поведения следует назначить свойство SmallImages, добавить туда пиктограммы, соответствующие отмеченному и снятому флажку, и обрабатывать событие OnClick (например), получая координаты курсора мыши, находя строку, в которой был клик и проверяя, что они лежат в пределах пиктограммы (TFastListItem.DisplayRect( drIcon )), затем меняя свойство TFastListItem.ImageIndex. Наверное, можно было сделать что-то в этом направлении, но как-то не было особой необходимости.

HdrFont TFont  

Данное свойство позволяет задать отдельный шрифт для заголовка. Масштабирование шрифтов имеет лучший эффект в том случае, если используется шрифт True Type (например, Tahoma).

HdrFontSame Boolean TRUE

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

HdrFontScale Boolean TRUE

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

HdrHeight Integer 0

Данное свойство позволяет установить высоту заголовка в режиме ViewStyle = lvsDetail в пикселях. Высота устанавливается как максимум от HdrHeight и текущей вычисленной высоты (в случае MultiHeader). Так как высоту заголовка нельзя изменить после создания и первого отображения окна, для большей гибкости в вычислении высоты заголовка предоставляется событие OnGetHdrHeight, которое вызывается в тот момент, когда этот параметр требуется в первый (и последний) раз. В обработчике события вычисленное значение следует присвоить свойствк HdrHeight. Значение 0 в этом свойстве означает, что высота заголовка определяется без учета данного свойства.

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

HdrWrapping THdrWrapping hwSyllabels

Данное свойство позволяет управлять способом переноса на другую строку в процессе отображения текста заголовка. Варианты:

hwWords - по словам,
hwLetters - по буквам,
hwSyllabels - по слогам,
hwNone - без переноса (в одну строку)

Items TFastListItems ...

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

Во время исполнения свойство Items доступно, и является необходимым для доступа к элементам списка (строкам таблицы), использование в этом случае аналогично свойству Items в TListView.

ItemAlign TAlignment taLeftJustify Быстрое выравнивание 0-й колонки. Вообще, у каждой колонки в режиме дизайнера может быть настроено свое собственное выравнивание.
MultiHeader String  

Позволяет задать многоуровневый заголовок таблицы, если присвоена непустая строка, например, одиночный символ '|' (вертикальная черта). В этом случае строка используется как разделитель, анализируемый в заголовках колонок особым образом. В заголовках колонок, строка до этого разделителя рассматривается как заголовок нижнего уровня. Для того, чтобы указать, что колонка имеет, кроме нижнего заголовка, вышестоящий, после основного заголовка строки вписывается разделитель, вслед за которым записывается заголовок вышележащего уровня. Если требуется задать еще один вышележащий уровень, записывается еще один разделитель, за которым записывается заголовок третьего уровня. Например, в вышеприведённом скриншоте три колонки заданы с заголовками 'aaa|111', 'bbb' и 'ccc|222' (Multiheader='|'). Обратите внимание, что при использовании доступа к ячейкам по именам колонок колонки 'aaa' и 'ccc' уже не будут доступны по этим именам (их можно сделать доступными, изменив свойство FieldName, снова задав 'aaa' и 'ccc').

Внимание:
  1. в режиме дизайнера форм отображение многоуровневого заголовка не обеспечивается (т.к. изменения невозможны без переоткрытия формы в дизайнере),наблюдать результат можно только во время выполнения;
  2. т.к. размер (высота) заголовка определяется только один раз, при первом отображении контрола, изменить число уровней заголовка во время выполнения нельзя (хотя возможно, тем не менее, менять саму структуру многоуровневого заголовка, изменяя свойство Caption для колонок);
  3. при определении многоуровневого заголовка, первая колонка обязательно должна содержать все необходимые уровни;
  4. При использовании свойства MultiHeader запрещено перетаскивание колонок пользователем для изменения порядка отображения колонок.
  5. в режиме MultiHeader темы Windows в заголовке не используются.
PswColor TColor   Цвет фона по умолчанию для строк, которые не являются выделенными (для выделенных строк см. SelColor).
RegistrySaveRestore Boolean TRUE

Позволяет автоматически сохранять значения ширины колонок, порядка колонок, видимости колонок в реестре. Для того, чтобы это свойство работало, необходимо указать в глобальной переменной RegistrySaveRestore : String  путь, по которому в реестре будет храниться список значений для всех TFastListView на всех формах приложения. Например, 'Software \ MyCompany \ MyCoolApp \ ListViewSettings \' (без пробелов). Такое присваивание достаточно выполнить однократно при старте приложения. Создаваемые ключи сохраняются в итоге по пути HKCU \ Software \ MyCompany \ MyCoolApp \ ListViewSettings \ WWWWxHHH \ (где WWWW и HHH - размеры экрана), имеют имя ParentFormName.FastListViewControlName, и далее по этому ключу сохраняются значения.

SelColor TColor clHighlight Настройка цвета фона выделенного элемента (когда контрол в фокусе).
SelColorNoFocus TColor clBtnFace Настройка цвета фона выделенного элемента для случая, когда контрол не находится в фокусе ввода.
SelColorText TColor clHighlightText Настройка цвета текста выделенного элемента (контрол в фокусе ввода).
SetColorTextNoFocus TColor $3E3B24 Настройка цвета текста выделенного элемента (контрол не в фокусе ввода).
SortByCase Boolean FALSE Сортировка с учетом регистра (все дополнительные свойства сортировки действуют только при включении типа сортировки SortType <> stNone). Обратите внимание, что каждая колонка может иметь собственные настройки сортировки, перекрывающие общие свойства SortByXXXX. Эти настройки задаются в режиме дизайнера формы, и могут быть изменены соответствующими свойствами самого контрола TFastListView во время исполнения (см. ColumnSortAttrs)
SortByDate Boolean TRUE Сортировка дат в формате ДД.ММ.ГГГГ.
SortByIcons Boolean FALSE Сортировка по пиктограммам, точнее, по индексам ImageIndex, присвоенных элементам (строкам) таблицы. Включение этого свойства приводит к добавлению визуального элемента в заголовке первой колонки, по которому можно кликнуть мышью, чтобы получить данную сортировку.
SortByNumber Boolean TRUE Сортировка колонки по числам. Любая последовательность цифр в сравниваемых строках преобразуется в числа, и дальнейшее сравнение выполняется по значению числа, после чего сравнение строк продолжается в том же порядке при совпадении чисел. Например, A1B < A10B, S9X < S105.
SortType

(стандартное свойство, используется для управления новыми свойствами сортировки)

TSortType stNone Включает возможность сортировки таблицы по значениям колонок. Если значение этого свойства остается равным stNone, то сортировка не используется и недоступна пользователю. При включенной сортировке, пользователь может задать сортировку по заданным колонкам (клик по заголовку колонки), в нужном ему порядке просмотра колонок (клик по заголовку колонки с зажатой клавишей Ctrl), с заданием нужного ему направления сортировки (повторный клик по заголовку, порядок просмотра колонок отображается цифрой в заголовке колонки, участвующей в сортировке).
VirtualTotally Boolean FALSE

Установка этого свойства в TRUE превращает контрол в полностью виртуальный. В этом случае данные не хранятся в самом контроле, а запрашиваются контролом в обработчиках событий OnDataCell, OnDataCellImage, OnDataCellNamed. Кроме того, для правильной работы сортировки в этом режиме необходимо назначить обработчик события OnSwapItems, который обменивал бы данные, соответствующие указанным строкам (элементам) в том хранилище, где приложение хранит данные для полностью виртуального FastListView. Обратите внимание, что в режиме полностью виртуального списка нельзя присваивать значения ячейкам (TFastListItem.Caption, TFastListItem.SubItems[ ], или с помощью свойств для работы с ячейками). А так же на то, что в этом режиме программа должна присваивать значение свойству Items.Count для того, чтобы отображалось указанное количество строк.

Для отображения очень большого числа данных вTFastListView, лучше всего использовать этот режим, а для хранения при этом выделить объект класса TFastTable, который позволяет эффективно хранить тождественные данные.

Публикуемые события класса TFastListView (назначаемые в режиме дизайнера форм, так же перечисляются только события, новые по сравнению со стандартным TListView):

Имя события Параметры Описание
OnAfterSort (Sender: TObject)

Вызывается после завершения сортировки. Может использоваться в пользовательском коде для восстановления (или сброса) выделенных элементов. Внимание: самостоятельно контрол изменение выделения после сортировки не обеспечивает, и в качестве выделенного считает те элементы, индексы которых совпадают с ранее выделенными элементами.

OnBeforeFilter ( Sender: TObject; var Cancel: Boolean ) Вызывается перед выполнением фильтрации. Программа может отменить фильтрацию, если в данный момент по какой-то причине фильтрацию нельзя допускать.
OnBeforeSort (Sender: TObject) Вызывается перед сортировкой. Может использоваться, например, для того, чтобы запомнить список выделенных строк перед выполнением сортировки, чтобы затем в OnAfterSort восстановить корректное выделение.
OnBeginEditCell ( Sender: TFastListView; Item: TFastListItem;
SubItem: Integer; var CanBeginEdit: Boolean; var EditKind: TEditKind )

Действие данного события существенно расширено по сравнению со стандартным OnEditing. Оно потребовалось потому, что стало возможно редактировать не только 0-ю колонку (т.е. TFastListItem.Caption), но любую указанную колонку (TFastListColumn.CanEdit). Обработчик получает укзатель элемента списка (Item), индекс колонки (SubItem, от -1 до Columns.Count-2), может отменить редактирование для конкретной ячейки (установив CanBeginEdit := FALSE) и изменить способ редактирования (EditKind).

OnCreateEditCell ( Sender: TFastListView; Item: TFastListItem;
SubItem: Integer; UniEdit: TControl )
Обработчик вызывается после создания контрола, который будет использоваться для редактирования ячейки.
OnEndEditCell ( Sender: TFastListView; Item: TFastListItem;
SubItem: Integer; UniEdit: TControl; var S: String )
Требуется по той же причине, что и OnBeginEditCell - в связи с добавлением возможности редактирования значения в любой колонке. Обработчик получает в качестве значения редактирующий контрол (типа TUniEdit), и может изменить значение, присваиваемое ячейке в результате редактирования на то, которое считает более правильным (например, откорректировав ввод пользователя или фактически отменив редактирование путём присваивания предыдущего значения).
OnGetHdrHeight (Sender: TObject) Позволяет установить значение свойства HdrHeight (обработчик вызывается единственный раз при создании окна для контрола).
OnHdrDividerDblClk (Sender: TObject; columnIdx: Integer)

Позволяет обеспечить программируемое поведение в ответ на двойной клик по разделителю колонок. Для небольшого числа элементов обычно принято в этом случае выполнять автоподбор ширины колонки таки образом, чтобы все строки в этой колонке вмещались визуально в ширину своей колонки. В случае очень больших массивов данных, рекомендуется ограничиваться автоподбором ширины колонки в пределах одной страницы.

OnHdrPaint ( Sender: TObject; Canvas: TCanvas; R: TRect; ColIdx: Integer )

Позволяет обеспечить произвольное рисование заголовка (шапки) таблицы, которое вызывается после того, как отработала основная процедура рисования заголовка (т.е., пользовательский обработчик может рисовать в режиме до- или подрисовки, в том числе пропустить рисование для тех колонок, которые нет нужды перерисовывать).

OnHdrTrack (Sender: TObject) Позволяет отслеживать наведение мыши на заголовок TFastListView.
OnKillFocus (Sender: TObject) Позволяет отследить событие потери фокуса контролом.
OnLineToExcel function( Sender: TFastListView; Item: TFastListItem;
WB, WS: Variant; xLeft, xRight: Integer; Progress: TFLV_fmProgress = nil ): String

Позволяет изменить строку, сохраняемую в книгу Excel при вызове метода SaveToExcel. Обычно такое изменение следует делать в том случае, когда компонент TFastListView используется как полностью виртуальный, или требуется полностью переопределить процедуру формирования Excel-выхода для некоторых строк. Для полного переопределения форматирования лучше вместо использования метода SaveToExcel выписать свой код для формирования Excel-книги.

OnMessage function( Sender: TObject; var Msg: TMessage ): Boolean Позволяет обработать в пользовательском коде произвольное событие (оконное или пользовательское). Обработчик возвращает TRUE в случае, если сообщение обработано, и дальнейшая его обработка не требуется. В противном случае вызываются все прочие процедуры диспетчеризации, вплоть до обработки сообщения стандартными средствами.
OnSelecting function( Sender: TObject; Item: TFastListItem ): Boolean Позволяет предотвратить выделение некоторых строк в списке (если обработчик возвращает FALSE).
OnSelectItem procedure(Sender: TObject; Item: TListItem;
Selected: Boolean)
Позволяет обработать событие выделения или снятия выделения с отдельного элемента. Данное событие срабатывает только для первого элемента среди выделенных, когда MultiSelect = TRUE и назначен обработчик события OnSelectRange.
Внимание: следует учитывать, что при снятии выделения сначала следует обращение к обработчику с элементом Item = NIL !
OnSelectRange procedure( Sender: TObject; IdxFrom, IdxTo: Integer;
Selected: Boolean )

Позволяет обработать событие выделения или снятия выделения с группы элементов (например, в результате нажатия на элемент мышью с зажатой клавишей SHIFT). В случае, если этот обработчик назначен, событие OnSelectItem срабатывает только для первого выделенного (или выделяемого элемента) списка.

OnSwapItems ( Sender: TFastListview; e1, e2: Integer )

Данное событие вызывается при сортировке полностью виртуального (TotallyVirtual = TRUE) компонента. Оно предназначено для того, чтобы код приложения мог поменять элементы в том хранилище, в котором на самом деле хранятся данные для отображения.

OnVScroll (Sender: TObject; Show: boolean)

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

Свойства времени исполнения (секция PUBLIC), доступные из программы.

Имя свойства Тип Только чтение Описание
ColumnsToSort TList R/W

Список индексов колонок для сортировки. Значения хранятся в списке как числа типа DWORD, к числу прибавляется значение $8000000, если сортировка по этой колонке в обратном порядке. Данное свойство используется внутри компонента методом CompareItems при выполнении сортировки. Обычно, в пользовательском коде нет необходимости использовать данное свойство, кроме случаев, когда комплексная сортировка выполняется полностью программно, без участия пользователя.

ColumnSortAttrs[ ColIdx: Integer] TColumnSortAttrs R/W Здесь для сортировки детально задается большое количество параметров сортировки каждой колонки, в виде сочетания следующих флажков:
saImageIndex - сначала сортируется по индексу изображения;
saStateImage - затем по индексу статического изображения;
saCheckedFirst - сначала те строки, которые имеют атрибут Checked=TRUE;
saImgDescending - сортировка по изображениям - по убыванию индекса;
saLenghtFirst - сначала сравнивается длина строки, и только при совпадении все прочее;
saNumber - по возможности встречающиеся числа сравниваются как числа ('C9' < 'C10');
saCase - учитывается регистр (aB > ABC);
saDate - Корректные даты в формате DD.MM.YYYY или DD.MM.YY сравниваются как даты (если встречаются в той же позиции для сравнения как подстроки);
saMonthYear - анализируются даты в формате MM.YYYY или MM.YY
saMonthName - анализируются названия месяца по-русски и по-английски ('Январь' < 'Февраль');
saMonthShortName - то же, для краткие названия месяцев: Янв, Фев, Мар, Апр, Май, ...;
saDayWeekName - анализируются названия дней недели: (Понедельник < Вторник);
saDayWeekShortName - анализируются краткие названия дней недели: Пн, Вт, ... и Пон, Вто, Сре, ...
saIgnoreSpaces - нутренние и внешние пробелы и табуляторы игнорируются
saDescending - сортировка по убыванию
saEmptyFirst - пустые строки считаются меньше всех прочих и при сортировке по возрастанию оказываются первыми (если saEmptyFirst не задан, то пустые строки будут в конце;
saNotRusLatEq - не считать русские и английские буквы, схожие по начертанию, одинаковыми (иначе, по умолчанию они считаются неразличимыми: А = A, В = B, и т.д.)

Это же свойство доступно для каждой колонки в режиме дизайна как опубликованное свойство SortAttrs. Учтите, что свой класс для колонки не создаётся, поэтому это свойство, как и все прочие дополнительные свойства колонок, во время исполнения не существуют. Вместо этого следует использовать свойства и методы самого класса TFastListView.

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

SortFrom Integer R/W Индекс начальной строки диапазона, который сортируется. Изменяя это свойство совместно с SortTo, имеется возможность отсортировать только часть строк. Значения SortFrom и SortTo могут быть изменены, в том числе, непосредственно в обработчике OnBeforeSort.
SortTo Integer R/W см. выше SortFrom, данное свойство задает конец диапазона элементов для сортировки (сортируются элементы с индексами от SortFrom до SortTo включительно). Установка значения -1 означает, что сортироваться будет весь список, в этом случае SortFrom так же сбрасывается в значение 0.
ColumnFiltered[ colIdx: Integer] Boolean R/W Позволяет выяснить, отфильтрована ли колонка, или установить фильтрование колонки. При изменении значения в TRUE, просто меняется флажок, но фильтрации как таковой не происходит. Для программной фильтрации по заданному значению используйте метод FilterColumns.
FilterValues TFilterStrings (на базе TStringList) R/W Позволяет задать список строк для фильтрации по колонке и отфильтровать колонку. Лучше использовать метод FilterColumns.
ItemFocused TFastListItem R/W Получает/устанавливает новый элемент списка в фокус ввода. Отличие от стандартного свойства только в типе элемента списка.
ItemData[ Idx: Integer ] Pointer R/W Доступ к данным элемента с индексом Idx. Доступ к ассоциированным данным элемента возможен так же через его свойство Data.
Selected TFastListItem R/W Первый выделенный элемент. Присваивание нового значения делает указанный элемент (строку) единственным выделенным. Присваивание значения nil сбрасывает выделение, в том числе при наличии множественного выделения (MultiSelect = TRUE).
HiddenItems[ Idx: Integer ] TFastListItem R Позволяет получить доступ к скрытым (как то: отфильтрованным) строкам. С ними можно работать программно, хотя они и не отображаются.
HiddenItemsCount Integer R Возвращает число скрытых строк.
ColumnVisible[ colIdx: Integer ] Boolean R/W Получает/устанавливает видимость колонки.
VisibleColumnsCount Integer R Возвращает число видимых колонок.
VisibleColumns[ Idx: Integer ] TListColumn R Позволяет получить список только видимых колонок с индексами от 0 до VisibleColumnsCount-1.
ColumnFieldNames[ Idx: Integer ] String R/W Получает/устанавливает имена полей, ассоциированных с колонками. Имена полей используются при присваивании данных из запроса (TQuery), при доступе к ячейкам свойством Item['имя_поля_или_заголовок_колонки'], (где Item - переменная типа TFastListItem). Имена полей могут быть назначены колонкам в режиме дизайна Инспектором объектов в свойствах колонки.
ColumnCanEdit[ Idx: Integer ] Boolean R/W Получает/устанавливает разрешение на редактирование данных в колонке. Данное свойство может быть так же изменено в режиме дизайнера через свойство колонки CanEdit.
ColumnEditKind[ Idx: Integer ] TEditKind R/W Получает/устанавливает тип редактирования ячеек колонки по умолчанию. В режиме дизайнера формы доступно так же через свойство колонки EditKind.
ColumnComboItems[ Idx: Integer ] TStrings R/W Получает/устанавливает список элементов комбо-списка, используемого для редактирования ячейки заданной колонки. Данное свойство может быть изменено в любой момент, в том числе непосредственно перед началом редактирования ячейки.
ColumnClicked Integer R Возвращает индекс колонки, по заголовку которой был сделан клик. Предназначено для использования в обработчике события OnColumnClick.

Свойства класса предка TColorListView:

ColumnOrder[ ColIdx: Integer ] Integer R/W Порядок отображения колонки.
ColumnWidth[ ColIdx: Integer ] Integer R Ширина колонки. Можно так же использовать свойство самой колонки TListColumn.Width, в том числе доступное для изменения из программы.
SelectedColumn Integer R/W Выделенная ячейка (индекс колонки) в текущей строке. Используется при редактировании произвольных ячеек.

Методы класса TFastListView, доступные во время исполнения (секция PUBLIC)

Имя метода Параметры Описание
RestoreSettingsFromRegistry  

Восстанавливает настройки из реестра. Данный метод один раз автоматически вызывается при создании объекта (но можно его дополнительно вызвать программно). Для правильной работы необходимо настроить глобальную переменную RegistryKeyPath (лучше это делать в программе один раз, константой или в блоке initialization какого-либо модуля, желательно главного, или создающегося автоматически при запуске программы - по меньшей мере). |См. так же свойство RegistrySaveRestore.

SaveSettingsInRegistry  

Сохраняет настройки в реестре, в качестве базового пути используется глобальная переменная RegistryKeyPath, см. выше. Данный метод автоматически вызывается при разрушении объекта TFastListView, но его можно так же вызывать программно (желательно не делать этого слишком часто). Сохраняются порядок, видимость, размеры колонок. См. так же свойство RegistrySaveRestore.

Clear   Очищает список, удаляя из него все элементы. Эквивалентно Items.Clear;
GetItemAt ( X, Y: Integer ): TFastListItem Возвращает элемент, находящийся по заданным клиентским координатам окна контрола, или NIL, если по этим координатам нет элемента.
AlphaSort : Boolean Сортировка строк в соответствии с заданными критериями и событиями сортировки (для колонок, которые не имеют специальных настроек, при отсутствии обработчика события используются атрибуты сортировки по умолчанию). Возвращается FALSE, если сортировка не выполнена (была отменена).
Sort : Boolean Повторяет сортировку для колонок, заданных ранее.
SortColumns ( const ColumnsArray: array of Integer;
OrderByFollowsColumns: Boolean = TRUE )

Позволяет отсортировать строки по заданному набору колонок. Дополнительный параметр позволяет указать, следует ли учитывать прочие колонки, если сравнение по указанным колонкам не дало различия между строками (если нет, для дальнейшего определения порядка элементов используется оригинальный индекс элемента). Для сортировки по колонке в обратном порядке к индексу в массиве следует добавить флажок $80000000 (установить логической операцией OR).

CompareItems ( Item1, Item2: TFastListItem ): Integer Выполняет сравнение двух элементов по тем правилам, которые применяются при сортировке, возвращает соответствующий результат.
SetSortColumnAttributes ( const ColumnIndeces: array of Integer;
Attrs: TColumnSortAttrs )
Аналогично свойству ColumnSortAttrs, используется для установки одинаковых атрибутов сортировки сразу для нескольких колонок, индексы которых перечислены в массиве ColumnIndeces.
IndexOfColumn ( const ColName: String ): Integer Поиск колонки по ее заголовку или по имени поля, ассоциированному с колонкой.
FilterColumns ( ColumnsList: array of Integer )

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

FilterItems  

Данный метод может вызываться для фильтрации в соответствии с текущим выбором пользователем колонок для фильтрации и позволяет обновить состояние объекта после изменения значений его ячеек (выполненное программно или пользователем).

ClearFilters   Сброс (отмена) всех установленных пользователем фильтров. Список колонок для фильтрации не изменяется.
FindData (StartIndex: Integer; Value: Pointer;
Inclusive, Wrap: Boolean): TListItem
Поиск элемента (строки таблицы) по значению Item.Data.
GetNextItem (StartItem: TListItem;
Direction: TSearchDirection; States: TItemStates): TListItem
Поиск следующей (в заданном направлении) строки с указанными атрибутами TItemStates. Если такая строка (элемент) не найден, возвращается nil. Для поиска следующей выделенной строки полезно так же свойство NextSelected, которое обычно требуется чаще прочих.
NextSelected ( LI: TFastListItem ): TFastListItem Позволяет быстро перечислить выделенные элементы списка. Например:
var LV: TFastListView;
    LI: TFastListItem;
........

LI := LV.Selected;
while LI <> nil do
begin
    //
работаем с элементом (строкой) LI
    LI := LV.NextSelected( LI );
end;
SelectAll   Метод для быстрого (практически мгновенного) выделения всех элементов списка (без учета отфильтрованных, разумеется, в выделенные всегда попадают только видимые элементы).
InvertSelection   Быстрое инвертирование выделения. Отфильтрованные (не попавшие в список видимых) строки не участвуют в выделении в любом случае.
DeleteSelection   Быстрое удаление выделенных элементов (строк).
DeleteHiddenItems   Быстрое удаление скрытых (отфильтрованных) элементов.
HasEmptyCaptions : Boolean Возвращает TRUE, если есть хотя бы одна строка (элемент) с пустым заголовком (Caption='')
SaveToExcel ( const Filename: String; const ImageNames: String = '';
const StateImageNames: String = ''; FromIdx: Integer = 0; ToIdx: Integer = MaxInt;
SelectedOnly: Boolean = FALSE )

Сохранение содержимого в файл типа "книга Excel". Параметры ImageNames и StateImageNames позволяют задать имена пиктограмм, которые отображаются вместо самих пиктограмм (используется отдельная колонка). Если передана пустая строка, пиктограммы при сохранении игнорируются. В непустой строке имена пиктограмм должны быть перечислены через запятую.

Если объявленная в модуле FastListView глобальная переменная SaveToExcelViaClipboard установлена (по умолчанию это так), то используется максимально быстрый способ, позволяющий практически мгновенно выполнить операцию даже для очень большого списка. Этот способ заключается в помещении текста в буфер обмена, и затем вставке содержимого буфера обмена в книгу Excel. Недостаток такого метода - прежнее содержимое буфера обмена портится.

SaveToWorksheet (Excel, WB, WS: Variant; TopLine: Integer = 1;
const ImageNames: String = '';
const StateImageNames: String = ''; FromIdx: Integer = 0; ToIdx: Integer = MaxInt;
SelectedOnly: Boolean = FALSE; Progress: TFLV_fmProgress = nil)
Сохранение содержимого в файл типа "книга Excel".
То же, что и выше, но с указанием уже открытого экземпляра Excel, книги (WB) и листа книги (WS) в нем. Дополнительно может быть указан уже созданный экземпляр формы прогресса.
ContentAsText ( const ColumnSeparator: String = ''#9;
const LineSeparator: String = ''#13#10 ): String

Получение содержимого в виде текстовой строки (после чего ее, например, можно записать в текстовой файл, или скопировать в буфер обмена). ColumnSeparator задаёт разделитель колонок (по умолчанию символ табуляции), LineSeparator задаёт разделитель строк (по умолчанию стандартные символы конца строки).

ColumnIndexByName ( const S: String ): Integer Возвращает 0..Columns.Count-1 по заголовку колонки или имени поля, сопоставленного колонке. Используется внутренним образом при доступе к ячейкам строки по имени поля (или заголовку колонки, если имя поля для колонки не задано), см. TFastListItem.SItems. См. так же ColumnFieldNames.
CanEditByCells : Boolean Возвращает TRUE, если хотя бы одна колонка может быть отредактирована.
EditingCell : Boolean Возвращает TRUE, если в настоящий момент идет редактирование ячейки.
EndEditCell   Прекращает редактирование редактируемой в настоящий момент ячейки.

Методы класса предка TColorListView:

InvalidateHeader   Обновить заголовок
GetHeaderCtlWindow HWnd Возвращает дескриптор окна заголовка (очень низкоуровневое программирование)

 






Свойства, события и методы класса TListColumn, доступные в Инспекторе объектов.

Для компонента TFastListView не создаётся свой собственный класс для колонки, и продолжает использоваться тот же класс колонки TListColumn, что и для родительского TListView. Поэтому во время исполнения никаких дополнительных свойств и методов у колонки класса TListСolumn не появляется. Тем не менее, некоторое число новых атрибутов у колонки имеется, но они доступны через свойства и методы времени исполнения самого контрола.

Для целей настройки колонок в режиме дизайнера форм, тем не менее, создан особый редактор свойств колонки времени разработки. Поэтому ниже приведённые свойства доступны для колонок из Инспектора объектов. Для вызова редактора колонок, как и для стандартного TListView, используйте двойной клик по контролу во время разработки формы, после чего возможно добавление, изменение и удаление колонок.

Обратите внимание, что может иметься некоторая "как-бы" проблема с порядком отображения колонок во время разработки, добавленных позже, но не последними (или в случаях, когда менялся порядок колонок в списке). Дело тут в запоминании порядка отображения колонок, которое обеспечивается корректно для этапа времени исполнения, но не гарантируется для этапа разработки. Проблема легко решается перемещением одной из колонок в списке сначала вверх, а затем вниз на одну позицию (например, в таком порядке).
 
Имя свойства Тип Начальное
значение
Описание
CanEdit Boolean FALSE

Разрешает редактировать отдельные ячейки таблицы в данной колонке. Значение FALSE для 0-й колонки (соответствующей свойству Caption элемента) не означает, что эту колонку нельзя редактировать вообще: если все колонки имеют значение FALSE, то возможностью редактирования заголовка элемента управляет, как обычно, свойство ReadOnly самого TFastListView. В случае задания возможности редактирования по ячейкам, в фокус ввода попадает не строка, а отдельная ячейка таблицы, причем перемещение возможно только по тем ячейкам, которые могут быть отредактированы.

ComboItems TStrings   Список элементов выпадающего списка, используемого для редактирования ячейки в данной колонке (свойство EditKind должно иметь значение ekCombo).
EditKind TEditKind ekEdit Тип редактирования ячейки. Так как для редактирования всегда используется компонент TUniEdit, то для изменения способа редактирования достаточно указать тип используемого контрола. Прочие свойства редактирующего контрола, если требуется, следует указывать при его создании в начале редактирования ячейки (см. события OnCreateEditCell, OnBeginEditCell).
FieldName String   Имя поля, сопоставленное колонке. Это имя используется при получении данных из запроса к базе данных (TQuery), а так же при доступе к ячейкам строки свойством по умолчанию Item['имя']. При отсутствии имени поля используется заголовок колонки.
Filtered Boolean FALSE

Назначение данному свойству значения TRUE приводит к тому, что во время выполнения пользователь имеет возможность выполнять фильтрацию по данной колонке, нажимая на визуально отображаемый треугольник в заголовке колонки. При этом выводится в маленьком всплывающем окошке список всех значений, хранящихся в данной колонке, часть из которых (или одно из которых) может быть отмечено для отображения - строки, содержащие в данной колонке другие значения, скрываются. Кроме того, в окошке отображается число строк, содержащих указанное значение. Строки, скрытые в результате фильтрации, остаются программно доступны через свойства HiddenItems[ ] и HiddenItemsCount.

Order Integer X Порядок отображения колонки, X - от 0 и выше.
SortAttrs TColumnSortAttrs  

Атрибуты сортировки колонки. Если атрибуты не заданы, то используются атрибуты сортировки, заданные свойствами SortByXXXX самого контрола. При задании собственных атрибутов сортировки для колонки, они полностью перекрывают общие свойства сортировки контрола. Для просмотра описания возможных атрибутов, см. их список, приведенный ранее (вместе со свойством ColumnSortAttrs).


 






Свойства, события и методы класса TFastListItems, доступные во время исполнения.

В принципе, все эти свойства аналогичны свойствам и методам класса TListItems, использующегося для хранения элементов стандартного TListView. Но это другой класс, он даже не наследуется от TListItems или какого-либо общего предка.
 
Имя свойства / метода Тип Начальное
значение
Описание
Items[ Idx: Integer ] TFastListItem   Список элементов (строк таблицы)
Clear     Процедура очистки списка (таблицы)
Add TFastListItem   Добавление элемента в конец списка
Insert( Index: Integer ) TFastListItem   Вставка элемента перед произвольным элементов с индексом Index
BeginUpdate     Следует вызывать перед началом некоторого числа изменений в списке, для уменьшения числа обновлений изображения на экране в процессе изменений.
EndUpdate     Должно соответствовать своему BeginUpdate. Наиболее корректно размещать в части finally конструкции try:
LV.Items.BeginUpdate;
try
    // do something
finally
    LV.Items.EndUpdate;
end;
Count Integer   Свойство доступно на запись для полностью виртуальных списков (TFastListView.TotallyVirtual = true)
Delete(Index: Integer)     Удаление элемента (строки таблицы)
 






Свойства, события и методы класса TFastListItem, доступные во время исполнения.

Обратите внимание, что в модуле FastListView класс TListItem переопределяется как эквивалентный новому классу TFastListItem. Это означает, что в коде можно объявлять переменные типа TFastListItem как переменные типа TListItem, что немного укорачивает запись и позволяет при необходимости возвратиться к использованию стандартного TListView (если не использовано слишком большое количество новых возможностей).

Для доступа к методам и свойствам прежнего класса TListItem следует использовать ссылочное имя TOldListItem, либо использовать префикс модуля, в котором прежний TListView был определен: comctrls.TListItem;

Имя свойства / метода Тип Начальное
значение
Описание
MirrorItem TOldListItem   Возвращает элемент-предок для элемента. Обычно используется для внутренних целей.
GetRect ( SubItemIndex: Integer = -1 ): TRect   Возвращает прямоугольник (в клиентских координатах), занимаемый элементом или ячейкой таблицы. Значение -1 параметра запрашивает весь прямоугольник, занимаемый элементом, значения от 0 и выше запрашивают прямоугольник, занимаемый одной ячейкой. Значение 0 соответствует колонке заголовка.
Прежнее свойство DisplayRect так же действует, но оно не годится для определения прямоугольника, занимаемого отдельной ячейкой.
BackColor TColor clNone Цвет фона (невыделенного элемента). Изменение цвета фона для строки в TFastListView выполняется элементарно с помощью этого свойства. При необходимости изменить цвет фона отдельной ячейки следует использовать события рисования ячейки (OnAdvancedCustomDrawSubItem, например). Начальное значение clNone соответствует отсутствию своего собственного цвета фона, в этом случае используется цвет фона контрола.
BackColorSelected TColor clNone Цвет фона выделенного элемента (строки таблицы).
FontColor TColor clNone Цвет шрифта (невыделенного элемента).
FontColorSelected TColor clNone Цвет шрифта выделенного элемента.
Visible Boolean   Видимость элемента. С помощью этого свойства программно возможно делать элементы невидимыми по своим собственным критерием (действие аналогично работе фильтрации).
ListView TFastListView   Возвращает родительский контрол.
EditCaption : Boolean   Данная функция инициирует начало редактирования заголовка (так же, как и для стандартного TListItem).
EditCell( Idx: Integer ) : Boolean   Переводит в режим редактирования заданную ячейку таблицы. Колонка должна быть редактируемой (ColumnCanEdit). Здесь значение -1 используется для ссылки на заголовок, т.е. на колонку 0, соответственно значения 0 и выше относятся к колонкам 1 и выше, т.е. SubItems[Idx-1].
EndEditCell( Cancel: Boolean = FALSE )     Данная процедура форсирует завершение редактирования. Если параметр Cancel = TRUE, то редактирование отменяется, и ячейка сохраняет то значение, которое она имела до входа в режим редактирования.
FontStyle TFontStyles   Стили шрифта, которым отображается текст в строке. После первого же изменения этого свойства данное свойство перекрывает значение, используемое по умолчанию для контрола. Для того, чтобы возвратить стили шрифта по умолчанию, следует присвоить значение FALSE свойству CustomFontStyle.
CustomFontStyle Boolean FALSE Если FALSE, то для отображения используется общий стиль шрифта контрола. Иначе - используется свойство FontStyle.
SItems[ IdxOrName: Variant ] String   Строковое значение заголовка или под-элемента в колонке, заголовок которой или имя поля равен IdxOrName, когда IdxOrName - строка, либо в колонке с заданным индексом, когда IdxOrName - целое число. Это свойство является свойством по умолчанию, что означает, что для доступа к нему достаточно использовать форму с квадратными скобками, без указания имени свойства, например:
LI['Номер'] := '001';
Примечание: работа с ячейками таблицы через SubItems[n] продолжает присутствовать, но использование нового свойства SItems[name], причём именно с именем поля/заголовком колонки в качестве параметра, даёт существенно большую гибкость в плане поддержки кода в процессе всего жизненного цикла программного обеспечения. При изменении состава колонок, их порядка нет никакой необходимости изменять весь код, заменяя числовые индексы и рискуя получить множественные ошибки. Кроме того, код становится значительно более понятным и само- документируемым. Несколько страдать может скорость доступа к ячейкам, но в критичных ситуациях достаточно сделать список полностью виртуальным, хранить данные в таблице TFastTable, и так же обращаться к ячейкам по именам колонок, но используя более скорострельные свойства (SS, II, FF), позволяющие использовать механизм динамического кэширования вычисленных при первом обращении индексов колонок. Код при этом становится несколько более громоздким, но по-прежнему само- документируемым.
Values[ IdxOrName: Variant ] Variant   Доступ к значениям (ячейкам) строки (в отличие от
строковых представлений этих значений в SItems[]) по имени поля
или по индексу. Данные значения получаются автоматически при
присваивании строки из текущей записи TQuery или TADOQuery,
см. методы Assign ниже.
Assign (FromItem: TFastListItem; const AlterAssignments: String='')   Присваивание целой строки от одного FastListView к другому.
Параметр AlterAssignments позволяет указать, какие столбцы
исходной строки каким столбцам результирующей строки должны
присваиваться, в формате
Имя_выходной_колонки1=Имя_исходной_колонки1;...
Те поля, для которых присваивание не задано, присваиваются как
есть. Если для выходного list view не задано AutoAllocateColumns,
то при добавлении колонок, отсутствующих в данном контроле, возможно возникновение исключения.
Assign (FromQuery:TQuery; const AlterAssignments: String='')   Присваивание целой строки значениям текущей записи заданного
объекта TQuery. Для полей, имена которых не заданы в списке
AlterAssignments, используются те же имена колонок, что и имена
исходных полей (возможно исключение, если такой колонки нет,
и для list view свойство AutoAllocateColumns=FALSE). Формат
строки AlterAssignments такой же, как в Assign для источника -
строки list view - выше.
Примечание: В качестве класса TQuery может выступать TNewQuery из модуля AdoSQLUnit (данной библиотеки компонентов), если  опции текущего проекта включен символ условной компиляции USE_NEWQUERY. Который, в свою очередь, может быть унаследован от TADOQuery, TODBCQuery или TQuery.

Пример типичного цикла загрузки записей из базы данных (обычно требуется так же предварительно стереть содержимое списка вызовом LV.Clear или LV.Items.Clear):
var LI: TListItem;
    Q: TQuery;
................
Q.Open;
while not Q.Eof do
    LI := LV.Items.Add;
    LI.Assign( Q );
    Q.Next;
end;

Assign (FromADOQuery: TADOQuery; const AlterAssignments: String='')   Аналогично Assign для исходного TQuery (выше), но для TADOQuery. Данный метод добавлен на тот случай, когда необходима работа с двумя типами соединений с БД одновременно - через TADOQuery и TQuery.

Советы по оптимизации быстродействия

Хотя TFastListView - сам по себе быстрее обычного TListView, тем не менее, игнорирование общих правил работы с визуальными компонентами способно замедлить его даже более, чем оригинальный компонент. Поэтому следует придерживаться следующих правил:


(C) by Vladimir Kladov, 2000-2010