На этом шаге мы рассмотрим использование свойства 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);
Поле выбора данных должно как-то реагировать на выбор пользователя. Для этого напишем обработчик события 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.