Главная » Delphi » Форма фильтра

0

Расположенная в модуле  Fltr форма FilterForm предназначена для  решения двух задач. Во первых, она позволяет отфильтровать отображаемые в таблице данные по значению поля  State, которое должно  соответствовать заданному  пользователем значению. Во вторых, эта форма позволяет выбирать из таблицы те записи, где зна чение некоторого поля равно  значению, введенному пользователем.

Для  реализации фильтра требуется не  так  уж и  много  кода.  Состояние флажка Filter on this State (объект cbFiltered) определяет значение свойства Filtered объекта DM.Table1. Это реализовано с помощью показанного далее  оператора в об работчике события cbFiltered.OnClick:

DM.Table1.Filtered := cbFiltered.Checked;

Когда свойство DM.Table1.Filtered принимает значение True, таблица Table1 фильтрует записи с помощью приведенного ниже  метода  OnFilterRecord, который расположен в модуле DataMod.

procedure TDM.Table1FilterRecord(DataSet: TDataSet;

var Accept: Boolean);

{ Запись выбирается на обработку, если значение поля State равно

значению, введенному в текстовое поле DBEdit1.Text. }

begin

Accept := Table1State.Value = FilterForm.DBEdit1.Text;

end;

Для  выполнения  условного   поиска   необходимо  использовать  метод   Locate()

компонента TTable таким образом:

DM.Table1.Locate(CBField.Text, EValue.Text, LO);

Имя поля выбирается пользователем из раскрывающегося списка  CBField. Со держимое списка  создается обработчиком события OnCreate формы с помощью сле дующего кода, выполняющего просмотр полей  таблицы Table1:

procedure TFilterForm.FormCreate(Sender: TObject);

var

i: integer;

begin

with DM.Table1 do begin

for i := 0 to FieldCount – 1 do

CBField.Items.Add(Fields[i].FieldName);

end;

end;

CОВЕТ

Приведенный код работает только в том случае, если модуль данных DM был создан раньше модуля формы. Любые попытки доступа к модулю данных до его создания приведут, скорее всего, к появлению ошибки типа Access Violation. Чтобы иметь уверенность, что модуль данных DM будет создан раньше, чем любая из дочерних форм,  мы  вручную  отредактировали порядок  создания  форм  в  списке  Auto-create forms, расположенном во вкладке Forms диалогового окна Project Options (это окно можно вызвать, выбрав в меню Project пункт Options).Безусловно, главная форма будет создана прежде всего, но следует иметь гарантии, что сразу за ней последует модуль данных — прежде, чем будет создана любая другая форма приложения.

Полный код модуля Fltr приведен в листинге 7.7.

Листинг 7.7. Исходный код модуля Fltr.pas unit Fltr;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons, Mask, DBCtrls, ExtCtrls;

type

TFilterForm = class(TForm)

Panel1: TPanel;

Label4: TLabel;

DBEdit1: TDBEdit;

cbFiltered: TCheckBox;

Label5: TLabel;

SpeedButton1: TSpeedButton;

SpeedButton2: TSpeedButton;

SpeedButton3: TSpeedButton;

SpeedButton4: TSpeedButton;

Panel2: TPanel;

EValue: TEdit;

LocateBtn: TButton;

Label1: TLabel;

Label2: TLabel;

CBField: TComboBox;

MatchGB: TGroupBox;

RBExact: TRadioButton;

RBClosest: TRadioButton;

CBCaseSens: TCheckBox;

procedure cbFilteredClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure LocateBtnClick(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

procedure SpeedButton2Click(Sender: TObject);

procedure SpeedButton3Click(Sender: TObject);

procedure SpeedButton4Click(Sender: TObject);

procedure FormClose(Sender: TObject;

var Action: TCloseAction);

end;

var

FilterForm: TFilterForm;implementation

uses DB, DataMod, Main;

{$R *.DFM}

procedure TFilterForm.cbFilteredClick(Sender: TObject);

begin

{ Фильтровать таблицу, если установлен соответствующий флажок }

DM.Table1.Filtered := cbFiltered.Checked;

end;

procedure TFilterForm.FormCreate(Sender: TObject);

var

i: integer;

begin

with DM.Table1 do begin

for i := 0 to FieldCount – 1 do

CBField.Items.Add(Fields[i].FieldName);

end;

end;

procedure TFilterForm.LocateBtnClick(Sender: TObject);

var

LO: TLocateOptions;

begin

LO := [];

if not CBCaseSens.Checked then Include(LO, loCaseInsensitive);

if RBClosest.Checked then Include(LO, loPartialKey);

if not DM.Table1.Locate(CBField.Text, EValue.Text, LO) then

MessageDlg(‘Unable to locate match’, mtInformation,

[mbOk], 0);

end;

procedure TFilterForm.SpeedButton1Click(Sender: TObject);

begin

DM.Table1.FindFirst;

end;

procedure TFilterForm.SpeedButton2Click(Sender: TObject);

begin

DM.Table1.FindNext;

end;

procedure TFilterForm.SpeedButton3Click(Sender: TObject);

begin

DM.Table1.FindPrior;

end;

procedure TFilterForm.SpeedButton4Click(Sender: TObject);

begin

DM.Table1.FindLast;

end;

procedure TFilterForm.FormClose(Sender: TObject;

var Action: TCloseAction);

begin

Action := caHide;

MainForm.Filter1.Checked := False;

end;

end.

Закладки

Закладки (bookmarks) позволяют сохранить положение в наборе данных, чтобы позднее можно было вновь вернуться к этому же месту. В Delphi  работать с закладками очень  просто, поскольку необходимо запомнить значение всего одного  свойства.

Delphi  представляет закладу как тип данных  TBookmarkStr. Класс TTable облада ет свойством Bookmark данного типа.  При  чтении значения из этого  свойства будет возвращено имя закладки, а при  его записи — переход к указанной закладке.  Если ка кое то место  в наборе данных  вызвало определенный интерес и к нему потребуется вернуться позднее, используйте следующий фрагмент кода:

var

BM: TBookmarkStr;

begin

BM := Table1.Bookmark;

Когда  потребуется вернуться к помеченному месту в наборе данных, сделать  это будет очень  просто —  достаточно присвоить свойству  Bookmark значение,  получен ное ранее при чтении свойства Bookmark:

Table1.Bookmark := BM;

Тип  TBookmarkStr определен как AnsiString, поэтому  память  для закладки  вы деляется автоматически (заботится о ее  освобождении не  нужно).  Если  существую щую закладку необходимо удалить, то достаточно установить ее значение равным пус той строке:

BM := ”;

Обратите  внимание: тип  TBookmarkStr определен  как  AnsiString лишь  для удобства применения. Его можно  рассматривать как "черный ящик", который не зави сит  от  реализации, поскольку  реальные данные  закладки полностью определяются BDE и более низкими уровнями управления данными.

НА ЗАМЕТКУ

В 32-разрядной версии Delphi по-прежнему поддерживаются методы GetBookmark(), GotoBookmark() и  FreeBookmark(),  пришедшие  из  Delphi 1.  Но  использовать  их имеет смысл только в том случае, если необходимо сохранить совместимость с 16- разрядными проектами.Примеры использования закладок  для работы с набором данных  ADO находятся на прилагаемом CD в каталоге \Bookmark.

Резюме

Авторы  полагают, что,  прочитав эту главу, можно  создавать в Delphi  любые  типы приложений баз данных.  В настоящей главе был рассмотрен базовый компонент TDa- taSet и производные от него  компоненты TTable, TQuery и TStoredProc. Обсуж далось  также,  как оперировать с объектами TTable, управлять полями и работать с текстовыми таблицами.

В следующих главах рассматриваются такие  технологии разработки баз данных Delphi, как dbExpress и dbGo, а также  более  подробно освещаются вопросы взаимо действия приложений Delphi  с данными ADO.

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

По теме:

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