Для решения этой задачи в обработчик события формы OnCreate надо вставить операторы:

ClientDataSetl.Open;
ComboBoxl.Items.Assign(ClientDataSetl.FieldDefList);
ComboBoxl.Items.Delete(ComboBoxl.Items.IndexOf('Photo'));
ComboBoxl. Items . Delete (ComboBoxl. Items*. IndexOf ( 1 Charact' ) ) ;
ComboBoxl.Itemlndex := 0;

Первый оператор открывает набор данных. Второй заносит в ComboBoxl список полей, предоставляемый свойством FieldDefList. Обратите внимание, что в данном случае надо использовать именно свойство FieldDefList, а не FieldList. В FieldList содержатся, все поля, включая вычисляемое поле Age (см. примеры разд. 9.3). А индексация по вычисляемым полям невозможна.

Невозможна также индексация по полям Photo и Charact, содержащим фотографию и характеристику сотрудника. Поэтому третий и четвертый операторы приведенного кода удаляют эти поля из списка.

Для обеспечения индексации по выбранному пользователем полю в обработчик события OnChange компонента ComboBoxl можно вставить оператор, задающий значение IndexFieldNames:

ClientDataSetl.IndexFieldNames := ComboBoxl.Text;

Запустите приложение, и увидите, что пользователь получил возможность упорядочивать информацию по своему выбору.

То же самое можно сделать, используя метод Addlndex:

ClientDataSetl.Addlndex(ComboBoxl.Text + 'Index1, ComboBoxl.Text, [ixCaselnsensitive], ", 0) ;
ClientDataSetl.IndexName := ComboBoxl.Text + 'Index';

Первый оператор формирует индекс с именем "<имя поля>1пс1ех". В список индекса заносится имя выбранного поля (ComboBoxl.Text) и задается опция, обеспечивающая нечувствительность сортировки к регистру. Второй оператор индексирует набор по сформированному индексу.

В приведенном примере сортировка всегда осуществляется в направлении увеличения значения выбранного пользователем поля. Добавьте в приложение группу радиокнопок RadioGroupl, которая позволит пользователю выбирать направление сортировки: нарастание или убывание. Тогда приведенный выше обработчик события OnChange компонента ComboBoxl, использующий Addlndex, можно изменить так:

var SDesc: string;
SDesc := '';

// формирование строки параметра DescFields if (RadioGroupl.Itemlndex = 1)

then SDesc := ComboBoxl.Text;
ClientDataSetl.Addlndex(ComboBoxl.Text + SDesc, ComboBoxl.Text, [ixCaselnsensitive], SDesc, *',0);
ClientDataSetl.IndexName := ComboBoxl.Text + SDesc;

На этот же обработчик надо послаться в событии OnChange компонента RadioGroupl. В приведенном коде несколько изменено имя индекса, но главное отличие от предыдущего варианта - задание направления сортировки не опциями, а параметром DescFields, в который заносится строка SDesc: пустая или с именем поля в зависимости от выбранной пользователем радиокнопки в компоненте RadioGroupl.

Теперь еще усложним задачу, предоставив пользователю возможность формировать индекс с двумя ключами, независимо выбирая для каждого ключа направление сортировки. Для этого добавьте на форму еще один список ComboBox2 и группу радиокнопок RadioGroup2. Форма может приобрести вид, показанный на рис. 9.13 (проект ClientFilterlnd в каталоге RMD на приложенном к книге диске). Расположенный внизу список Индексы будет рассмотрен позднее. Списки ComboBoxl и ComboBox2 надо загрузить именами полей так же, как описано выше.

Рис. 9.13

Приложение с фильтрацией и индикацией данных

9.7 Индексация клиентского набора

При использовании свойства IndexFieldNames общий обработчик событий всех списков может иметь вид:

ClientDataSetl.IndexFieldNames := ComboBoxl.Text + ';' + ComboBox2.Text;

Но в этом варианте нельзя выбирать направление сортировки. Это можно сделать методом Addlndex. В этом случае общий обработчик событий всех списков и групп радиокнопок может иметь вид:

var SDesc, SName: string;
SDesc := 11;
SName := ComboBoxl.Text;

if (RadioGroupl.Itemlndex = 1)

then begin

// формирование имени и строки параметра DescFields

SDesc := ComboBoxl.Text + ';';
SName := SName + f_Descf;
end;

if(ComboBox2.Text = ComboBoxl.Text) then begin

// Если ключи одинаковы, второй ключ игнорируется

RadioGroup2.Itemlndex := RadioGroupl.Itemlndex;

RadioGroup2.Enabled := false; end

else begin

// формирование имени и строки параметра DescFields SName := SName + ComboBox2.Text; RadioGroup2.Enabled := true; if (RadioGroup2.Itemlndex = 1) then begin

SDesc := SDesc + ComboBox2.Text;
SName := SName + f_Descf;
end;
end;

ClientDataSetl.Addlndex(SName, ComboBoxl.Text + ';' +

ComboBox2.Text, [ixCaselnsensitive], SDesc, ff,0);
ClientDataSetl.IndexName := SName;

Приложение можно дополнить выпадающим списком, содержащим все индексы, определенные пользователем в данном сеанса. С его помощью пользователь может легко переключаться между разными индексами. Введите такой список и назовите его CBIndex. На рис. 9.13 он расположен внизу формы. Для первоначального заполнения этого списка индексами по умолчанию в обработчик надо добавить операторы:

ClientDataSetl.GetlndexNames(CBIndex.Items);
CBIndex.Itemlndex := 0;

В первом из этих операторов используется метод GetlndexNames для получения списка индексов. Этот список загружается в объект, переданный в него в качестве аргумента, т.е. в CBIndex.

В конце обработчика событий OnChange компонентов ComboBoxl и Combo-Вох2 надо добавить операторы:

ClientDataSetl.IndexName := SName;
ClientDataSetl.GetlndexNames(CBIndex.Items);
CBIndex.Itemlndex := CBIndex.Items.IndexOf(ClientDataSetl.IndexName);

Для получения списка индексов в них используется то же метод GetlndexNames. В обработчик события OnChange компонента CBIndex надо вставить оператор:

ClientDataSetl.IndexName := CBIndex.Text;

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

9.6 Фильтрация данных клиентского набора || Оглавление || 9.8 Клиентские приложения с запросами SQL


⇐ Предыдущая страница|

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Февраль
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс