Универсальная форма

© 2002 Виталий Кубекин

В этой статье я расскажу начинающим программистам, как можно использовать преимущества inherited формы. Какие преимущества дает объектно-ориентированное программирование, я думаю, все знают.

Перед нами стоит задача, создать универсальную форму, описать все ее события и т.д. В проекте может быть несколько универсальных форм, но мы создадим всего одну - универсальный справочник. Для начала определимся, что мы хотим от нашей универсальной формы. Итак, пускай форма содержит стандартные элементы управления таблицей, сохраняет координаты и размеры формы в ini файл. Остальное можно реализовать и самим.

Первое что нам необходимо – это объект типа TDBGrid. Итак, размещаем грид на форме. Далее заведем переменную CurrentGrid: TDBGrid. Эта переменная хранит текущий грид, т.е. если на форме размещено гридов больше, чем один. И нам нужен следующий код. Во-первых, при получении фокуса надо правильно заполнить переменную CurrentGrid:

//====================================
procedure TfrUN.DGEnter(Sender: TObject);
begin
  if CurrentGrid <> TDBGrid(Sender) then
    begin
      CurrentGrid.Color := clBtnFace;
      CurrentGrid := TDBGrid(Sender);
      CurrentGrid.Color := clWindow;
    end;
end;
//====================================

Также нам необходимо произвести начальную инициализацию гридов:

//====================================
for a := 0 to Self.ComponentCount - 1 do
  if Self.Components[a].ClassType = TDBGrid then
    begin
      TDBGrid(Self.Components[a]).OnEnter := DGEnter;
      TDBGrid(Self.Components[a]).Color := clBtnFace;
    end;

CurrentGrid:= DG;
DG.Color := clWindow;
//====================================
В этом коде мы присваиваем правильные цвета гриду, и указываем текущий грид. После этих операций можно переключаться между разными гридами, при этом будет подсвечиваться текущий грид.

Теперь нам необходимы стандартные управляющие элементы, которые присутсвуют практически в любом справочнике. Что за элементы – помощь, создать новую запись, изменить существующую запись, удалить запись, печать, выход, поиск, копия и т.д. Для размещения воспользуемся объектом TToolBar. Как это может выглядеть смотрим на рис.1.


Рис. 1.

Действие номер один – это помощь.

Действие номер два – создание. Здесь может быть два варианта. Вариант номер один – мы вносим новые данные прямо в грид. Вариант второй мы вносим новые данные через форму. Итак, для начала рассмотрим сначала вариант номер один. Для того, чтобы вставить новую запись нам нужен объект TDataSet, его можно извлечь из TDBGrid.datasource.dataset. Пишем код:

//====================================
CurrentGrid.DataSource.DataSet.Insert;
//====================================

Действие номер три- изменение:

//====================================
  if CurrentGrid.DataSource.DataSet.IsEmpty
    then ShowMessage('Нечего изменять')
    else CurrentGrid.DataSource.DataSet.Edit;
//====================================

Действие номер четыре- удаление:

//====================================
  if CurrentGrid.DataSource.DataSet.IsEmpty
    then ShowMessage('Нечего удалить')
    else CurrentGrid.DataSource.DataSet.Delete;
//====================================

Действие номер пять – поиск. Итак, для поиска используем следующий код:

//====================================
  PanelFind.Visible := not PanelFind.Visible;
  if(PanelFind.visible = true)then
    begin
      EditFind.SetFocus;
      Field.Items.Clear;
      for a := 0 to CurrentGrid.Columns.Count-1 do
        Field.Items.Add(CurrentGrid.Columns[a].DisplayName);
    end;
//====================================

Я думаю здесь все понятно. Ну а реализация конкретно самого поиска зависит от базы данных, с которой работает программа, от фантазии программиста и вообще это тема для отдельного разговора.

Действие номер шесть печать. Реализация печати зависит от конкретного генератора отчетов. Как реализовать печать для генератора отчетов FastReport можно почитать в статье FastReport: менеджер отчетов.

С выходом все ясно – close.

Теперь последняя операция- копия.

//====================================
var
  av: array of variant;
  a: integer;
begin
  if CurrentGrid.DataSource.DataSet.IsEmpty
    then ShowMessage('Нечего копировать')
    else
    begin
      SetLength(av, CurrentGrid.DataSource.dataset.Fields.Count);
      for a := 0 to CurrentGrid.DataSource.Dataset.Fields.Count - 1 do
        av[a] := CurrentGrid.DataSource.dataset.Fields[a].AsVariant;
      CurrentGrid.DataSource.dataset.Insert;

      for a := 0 to CurrentGrid.DataSource.Dataset.Fields.Count - 1 do
        CurrentGrid.DataSource.dataset.Fields[a].AsVariant := av[a];
    end;
end;
//====================================

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

Теперь сделаем запоминание координат и размеров формы.

Пишем обработчик на событие OnCloseQuery:

//====================================
var
  ini: TiniFile;
begin
  Ini := TIniFile.Create('C:\window.ini');
  Ini.WriteInteger('Form_' + Self.name, 'WIDTH', Self.Width);
  Ini.WriteInteger('Form_' + Self.name, 'HEIGHT', Self.Height);
  Ini.WriteInteger('Form_' + Self.name, 'LEFT', Self.Left);
  Ini.WriteInteger('Form_' + Self.name, 'TOP', Self.Top);
  Ini.Free;
end;
//====================================

Пишем обработчик на событие OnShow:

//====================================
var
  ini: TiniFile;
  Width, Height, Left, Top: integer;
begin
  Ini := TIniFile.Create('C:\window.ini');
  Width := Ini.ReadInteger('Form_' + Self.name, 'WIDTH', Self.Width);
  Height := Ini.ReadInteger('Form_' + Self.name, 'HEIGHT', Self.Height);
  Left := Ini.ReadInteger('Form_' + Self.name, 'LEFT', Self.Left);
  Top := Ini.ReadInteger('Form_' + Self.name, 'TOP', Self.Top);
  Self.SetBounds(Left, Top, Width, Height);
  Ini.Free;
end;
//====================================

Я думаю здесь все понятно.


Рис. 2.

В этой статье я ставил себе цель чуть-чуть подтолкнуть начинающих программистов к использованию inherited форм, показать, что сложного здесь ничего нет. "До чего можно довести" универсальную форму вы можете посмотреть на рис.2 (это один из моих стандартных справочников).

Используйте все возможности, которые вам дает Delphi, и радуйтесь жизни.

Желающие могут скачать исходные тексты примера (11.3K)

По всем вопросам обращайтесь по адресу vtl@msx.ru.

Copyright© 2002 Виталий Кубекин  Специально для Delphi Plus

2011123456789101112
2010123456789101112
2009123456789101112
2008123456789101112
2007123456789101112
2006123456789101112
2005123456789101112
2004123456789101112
2003123456789101112
2002123456789101112
2001123456789101112
2000123456789101112
1999123456789101112

Последние статьи
Литература