Шаг 55.
Работа с локальными БД в Delphi.
Фильтрация записей. Свойство Filter (окончание)

    На этом шаге мы рассмотрим использование свойства Filter при создании приложения.

    В компоненте DBGrid1, расположенном на форме PupilsForm, пользователь видит всех учеников школы. Это крайне неудобно, ведь в школе учатся сотни учеников, и просматривать весь список в поисках конкретного ученика затруднительно. Необходимо реализовать возможность просмотра в DBGrid1 списка учеников конкретного класса.

    Поместите на PupilsForm компонент TComboBox, с помощью которого пользователь будет выбирать отображать ли всех учеников, либо учеников конкретного класса. Компонент TComboBox представляет собой выпадающий список. Нам необходимо заполнить этот список. Напомним, что заполнение списка можно осуществить на этапе конструирования приложения, воспользовавшись свойством Items, однако нам неизвестно, сколько и какие классы у нас будут внесены в БД. Следовательно, заполнять списки необходимо при выполнении приложения. Для этого напишите следующий обработчик события OnShow формы PupilsForm:

procedure TPupilsForm.FormShow(Sender: TObject);
var
   i:integer;
begin
  ComboBox1.Clear;
  ComboBox1.Items.Add('Все классы');
  DataModule2.TableClass.First;
  for i:=1 to DataModule2.TableClass.RecordCount do
   begin
     ComboBox1.Items.Add(DataModule2.TableClassClass.Value);
     DataModule2.TableClass.Next;
   end;
  ComboBox1.ItemIndex:=0;
end;

    Напомним, что это событие происходит, когда показывается форма, но до фактической прорисовки. При возникновении этого события мы сначала очищаем список компонента ComboBox1 и добавляем в список строку "Все классы". Откуда же нам брать список классов внесенных в БД? Конечно же из таблицы Class. Для этого мы устанавливаем курсор НД TableClass на первую запись и запускаем цикл от 1 до TableClass.RecordCount; как вы уже знаете, в этом свойстве хранится количество записей данного НД. В теле цикла мы добавляем в список компонента ComboBox1 значение поля Class НД TableClass:

   ComboBox1.Items.Add (DataModule1.TableClassClass.Value);
и перемещаем курсор на следующую запись. Таким образом, список Items будет содержать строчку "Все классы" и все значения поля Class НД TableClass. Строка ItemIndex:=0 означает, что первый элемент списка станет активным (по умолчанию это свойство имеет значение -1). Напомним, что пользователь кроме выбора элемента может вручную занести значение в поле этого компонента. Чтобы этого избежать присвойте свойству Style значение csDropDownList (ограничиться списком).

    Поле выбора данных должно как-то реагировать на выбор пользователя. Для этого напишем обработчик события OnChange для компонента ComboBox1. Это событие наступает, когда пользователь выбрал какой-либо элемент из списка.

procedure TPupilsForm.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.ItemIndex = 0 then
   DataModule2.TablePupils.Filtered:=False
  else
   begin
     DataModule2.TablePupils.Filter:='[Class]='+''''+ComboBox1.Text + '''';
     DataModule2.TablePupils.Filtered:=True;
   end;
end;

    Если выбран первый элемент списка "Все классы", то отменяем фильтрацию. Если же нет, то фильтруем НД TablePupils по полю Class. Критерий фильтрации выглядит как [Class]='ComboBox1.Text'. Конструкция '''' (четыре апострофа) позволяет поместить значение ComboBox1.Text в апострофы.

    Созданное приложение можно взять здесь.

    На следующем шаге мы рассмотрим событие OnFilterRecord.




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