Универсальная форма
© 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
| 2011 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2009 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2008 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2007 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2006 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2005 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2004 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2003 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2002 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2001 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2000 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 1999 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
- Компания по разработке программного обеспечения
- Услуги аутсорсинга в области программирования
- Как продлить срок службы картриджей
- Мошенничество во Всемирной Паутине. Осторожно: фишинг!
- Web-студия
- Как легально поднять уровень индекса цитирования.
- Мы реально сможем помочь вам в управлении предприятием
- Создание сайтов – популяризация вашего замысла
- Свой сайт. Управление ресурсом
- Семантическое ядро сайта или правила подбора ключевых фраз
- Программирование в среде Delphi 8 for .NET
- Практикум по Delphi для решения прикладных задач
- Фундаментальные алгоритмы и структуры данных в Delphi
- Delphi 6. Программирование на Object Pascal
- Delphi и технология COM
- Delphi в шутку и всерьез: что умеют хакеры
- Программирование в Delphi глазами хакера
- Delphi 2005. Секреты программирования
- Искусство создания компонентов Delphi
- Приемы программирования в Delphi на основе VCL
- Программирование баз данных в Delphi 7
- Программирование баз данных в Delphi
- Программирование в среде Delphi
- Программирование в Delphi 7
- Язык SQL в Delphi 5