Шаг 16.
Вкладка Additional. Компонент TValueListEditor

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

    Компонент TValueListEditor введен в версии 6 и предназначен для редактирования списков строк вида имя=значение. Такие списки широко используются в реестре Windows и файлах инициализации. Начиная с версии 5 Delphi, по умолчанию, в таком формате хранит файлы описания форм .dfm.

    Непосредственным предком компонента является класс TCustomDrawGrid, поэтому многие его свойства, методы и события совпадают со свойствами, методами и событиями компонента TStringGrid.

    Специфичные свойства компонента:

Таблица 1. Свойства компонента TValueListEditor
Свойство Описание
Property Cells[ACol, ARow: Integer]: String; Открывает доступ к содержимому ячейки, лежащей на пересечении столбца ACol со строкой ARow (нумерация столбцов и строк начинается с нуля).
Property ColCount: Integer; Содержит количество столбцов.
type TDisplayOption = (doColumnTitles, doAutoColResize, doKeyColFixed);
TDisplayOptions = set of TDisplayOption;
Property DisplayOptions: TDisplayOptions;
Свойство может включать следующие значения:
  • doColumnTitles - первая строка содержит заголовки столбцов, определенные свойством TitleCaption, и не прокручивается;
  • doAutoColResize - предписывает автоматически изменять ширину столбцов при изменении размеров компонента;
  • doKeyColFixed - если указано, ширина первого столбца, содержащего имена, не меняется при изменении размеров.
Property DropDownRows: Integer; Указывает максимальное количество строк в списке возможных значении, показ которых не сопровождается появлением полосы прокрутки
Property ItemProps[const KeyOrIndex: Variant]: TItemProp; Сложное свойство, управляющее различными аспектами отображения значений (см. табл.2.)
type TKeyOption = (keyEdit, keyAdd, keyDelete, keyUnique);
TKeyOptions = set of TDisplayOption;
Property KeyOptions: TKeyOptions;
Управляет возможным изменением списка:
  • keyEdit - пользователь может изменять имя параметра (в первом столбце);
  • keyAdd - пользователь может добавлять новую пару имя-значение нажатием клавиши Insert (требует включения keyEdit);
  • keyDelete - пользователь может уничтожить выделенную пару нажатием клавиши Delete;
  • keyUnique - названия вводимых пользователем имен должны быть уникальными.
Property Keys[Index: Integer]:String; Открывает доступ к названиям значений по их индексам.
Property RowCount: Integer; Содержит количество строк.
Property Strings: TStrings; Содержит строки списка.
Property TitleCaptions: TStrings; Содержит заголовки столбцов.
Property Values[const Key: String]: String; Открывает доступ к значениям по их индексам.

    Свойство ItemProps класса TItemProps имеет собственные свойства:

Таблица 2. Свойство ItemProps класса TItemProps
Свойство Описание
Property EditMask: String; Содержит маску для формирования значения.
type TEditStyle = (esSimple, esEllipsis, esPickList);
Property EditStyle: TEditStyle;
Определяет правила редактирования значения:
  • esSimple - значение редактируется в обычном однострочном редакторе;
  • esEllipsis - в строку значения вставляется кнопка для вызова диалогового окна редактора значения (возбуждается событие OnEditButtonclick);
  • esPickList - в строку значения вставляется кнопка для раскрытия списка возможных значений (возбуждается событие OnGetPickList).
Property MaxLength: Integer; Определяет максимальную длину (в символах) значения. Если 0, нет ограничений на длину.
Property PickList: TStrings; Содержит выпадающий список возможных значений.
Property ReadOnly: Boolean; Разрешает/запрещает редактирование значения.

    Заметим, что свойство PickList не предназначено для программного доступа. Чтобы создать выпадающий список возможных значений, нужно свойству ItemProps.EditStyle присвоить значение esPickList и написать обработчик события onGetpickList. Пусть, например, первая отображаемая в компоненте строка должна иметь раскрывающийся список. Тогда необходим такой код:

procedure TFormI.FormActivate(Sender: TObject);
begin
ValueListEditorl.ItemProps[1].EditStyle := esPickList;
end;

procedure TFormI.ValueListEditorlGetPickList(Sender: TObject;
const KeyName: String; Values: TStrings);
begin
{Содержимое списка доступно через параметр Values}
Values.Add('1') ;
Values.Add('2') ;
Values.Add ('3') ;
Values.Add('4') ;
end;

    Методы компонента TValueListEditor:

Таблица 3. Методы компонента TValueListEditor
Метод Описание
Procedure DeleteRow (ARow: integer); override Удаляет из списка строку с индексом ARow. Свойство KeyOptions должно содержать флаг keyDelete
Function FindRow (const KeyName: string; var Row: integer): Boolean; Ищет в списке строку с именем KeyName и возвращает в параметре Row индекс найденой строки. Возвращает значение True в случае успеха поиска.
Function InsertRow (const KeyName, Value: string; var Append: Boolean): Integer; Вставляет в список строку вида KeyName=Value. Если текущая строка пуста, вставляемая строка занимает ее место, в противном случае она занимает место перед текущей (если Append=False) или за ней (если Append=True). Возвращает индекс вставленной строки. Свойство KeyOptions должно содержать флаг keyAdd.
Procedure Refresh; Перерисовывает компонент.
Function RestoreCurrentRow: Boolean; Отменяет все изменения текущей строки и возвращает значение True в случае успеха.

    Методы CellRect, MouseToCell и MouseCoord аналогичны одноименным методам компонента TStringGrid.

    События компонента TValueListEditor:

Таблица 4. События компонента TValueListEditor
Событие Описание
Property OnEditButtonClick: TNotifyEvent; Возникает при щелчке по кнопке раскрытия диалогового окна редактирования значения. Свойство ItemProps .EditStyle должно содержать значение esEllipse.
type TGetPickListEvent = procedure (Sender: TObject; const KeyName: String; Values: TStrings)of object;
Property OnGetPickList: TGetPickListEvent;
Возникает при щелчке по кнопке раскрытия списка возможных значений. Параметр KeyName содержит имя строки, в которой произведен щелчок. Обработчик должен заполнить возможными значениями список Values. Свойство ItemProps. EditStyle должно содержать значение esPickList.
Property OnStringsChange: TNotifyEvent; Возникает сразу после изменения имени или значения текущей строки.
Property OnStringsChanging: TNotifyEvent; Возникает непосредственно перед изменением имени или значения текущей строки.
type TOnValidateEvent = procedure (Sender: TObjectACol, ARow: Longint; const KeyName, KeyValue:String) of object;
Property OnValidate: TOnValidateEvent;
Возникает перед тем как фокус ввода покинет ячейку ACol, ARow. Обработчик может проверить новые значения KeyName и KeyValue и возбудить исключение, если исправления в строке были ошибочными.

    События OnDrawCell, OnGetEditMask, OnGetEditText, OnRowMoved, OnSelectCell, OnSetEditText, OnTopLeftChanged аналогичны одноименным событиям компонента TStringGrid.

    Выполним задание: создадим приложение, которое будет открывать выбранный файл в компонент TValueListEditor (рис.2.).

    Разместим на форме компоненты: TValueListEditor, TOpenDialog, TButton и TBitBtn (рис.1.).


Рис.1.Windows-окно примера при проектировании

    Обработчик щелчка на кнопке имеет следующий вид:

procedure TForm1.Button1Click(Sender: TObject);
begin
 If OpenDialog1.Execute then
    ValueListEditor1.Strings.LoadFromFile(OpenDialog1.FileName);
end;
Текст этого примера можно взять здесь.


Рис.2.Демонстрация компонента TValueListEditor

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




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