Главная » Delphi » Пример применения поиска, фильтра и диапазона

0

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

Модуль данных

Хоть  это  и не  совсем  правильно, но,  нарушая  порядок построения приложения, рассмотрим сперва  модуль данных.  Этот модуль данных, по имени  DM, содержит лишь компоненты классов  TTable и TDataSource. Компонент TTable, по имени Table1, связан  с таблицей CUSTOMERS.DB базы  данных  под  псевдонимом DBDEMOS. Компо нент класса TDataSource по имени DataSource1 связан  с компонентом Table1. Все элементы управления для работы с данными в этом  проекте будут использовать ком понент DataSource1 в качестве источника данных.  Модуль данных  DM содержится в программном модуле DataMod.

Главная форма

Главная  форма проекта SRF называется MainForm и представлена на рис. 7.12. Ее код содержится в модуле Main. Форма  включает в себя  элемент управления TDBGrid по  имени DBGrid1, предназначенный для  просмотра таблицы, а также  переключа тель,  позволяющий воспользоваться различными индексами таблицы. Компонент DBGrid1, как уже упоминалось ранее, связан  с источником данных  DM.DataSource1.

Рис. 7.12. Главная форма проекта SRF

НА ЗАМЕТКУ

Для  того  чтобы  компонент  DBGrid1 можно  было  связать  с  источником  данных DM.DataSource1 в режиме разработки, модуль DataMod должен быть указан в разде- ле uses модуля Main. Простейший способ сделать это — отобразить модуль Main в окне редактора кода, а затем выбрать в меню File пункт Use Unit главного меню. На эк- ране раскроется диалоговое окно со списком модулей проекта, в котором следует вы- брать модуль DataMod. Эту же операцию необходимо повторить для каждого модуля, из которого будет осуществляться доступ к данным, содержащимся в модуле DM.

Переключатель RGKeyField используется для  определения того,  какой  из  двух индексов таблицы будет активен в текущий  момент. Код обработчика события On- Click переключателя RGKeyField выглядит следующим образом:

procedure TMainForm.RGKeyFieldClick(Sender: TObject);

begin

case RGKeyField.ItemIndex of

0: DM.Table1.IndexName := ”;                // Первичный индекс

1: DM.Table1.IndexName := ‘ByCompany';       // Вторичный индекс

end;

end;

Форма  MainForm содержит также  компонент TMainMenu по имени MainMenu1, позволяющий открывать и  закрывать каждую  из  форм  приложения. Определеныследующие   пункты   меню:  Key  Search,  Range,  Filter и  Exit.  Полный  код  модуля

Main.pas приведен в листинге 7.5.

Листинг 7.5. Код модуля Main.pas

unit Main;

interface uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Grids, DBGrids,

DB, DBTables, Buttons, Mask, DBCtrls, Menus, KeySrch, Rng, Fltr;

type

TMainForm = class(TForm)

DBGrid1: TDBGrid;

RGKeyField: TRadioGroup;

MainMenu1: TMainMenu;

Forms1: TMenuItem;

KeySearch1: TMenuItem;

Range1: TMenuItem;

Filter1: TMenuItem;

N1: TMenuItem;

Exit1: TMenuItem;

procedure RGKeyFieldClick(Sender: TObject);

procedure KeySearch1Click(Sender: TObject);

procedure Range1Click(Sender: TObject);

procedure Filter1Click(Sender: TObject);

procedure Exit1Click(Sender: TObject);

private

{ Закрытые объявления }

public

{ Открытые объявления }

end;

var

MainForm: TMainForm;

implementation uses DataMod;

{$R *.DFM}

procedure TMainForm.RGKeyFieldClick(Sender: TObject);

begin

case RGKeyField.ItemIndex of

0: DM.Table1.IndexName := ”;                // Первичный индекс

1: DM.Table1.IndexName := ‘ByCompany';       // Вторичный индекс

end;

end;

procedure TMainForm.KeySearch1Click(Sender: TObject);

begin

KeySearch1.Checked := not KeySearch1.Checked;

KeySearchForm.Visible := KeySearch1.Checked;

end;

procedure TMainForm.Range1Click(Sender: TObject);

begin

Range1.Checked := not Range1.Checked;

RangeForm.Visible := Range1.Checked;

end;

procedure TMainForm.Filter1Click(Sender: TObject);

begin

Filter1.Checked := not Filter1.Checked;

FilterForm.Visible := Filter1.Checked;

end;

procedure TMainForm.Exit1Click(Sender: TObject);

begin

Close;

end;

end.НА ЗАМЕТКУ

Обратите внимание, что в коде модуля Rng (относящегося к этому проекту, но не при-

веденному здесь) содержится следующая строка:

DM.Table1.SetRange([StartEdit.Text], [EndEdit.Text]);

Может показаться странным тот  факт, что методу SetRange() всегда передается строковое значение, несмотря на то что ключевое поле может быть числового или тек- стового  типа.  Delphi  допускает  это,  поскольку  методы  SetRange(),  FindKey() и FindNearest() автоматически выполняют преобразование из типа String в тип In- teger, и наоборот.

Это означает, что в данной ситуации нет необходимости заботится о вызове функции

IntToStr() или StrToInt() — все преобразования будут выполнены автоматически.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии