Создаем форму для справочника «Поставщики»
Создаем новую форму File->New->Form –Delphi
В инспекторе объектов устанавливаем следующие свойства для новой формы
Caption -> Поставщики;
FormStyle -> fsMDIChild;
Name -> Form_postav_ik;
Сохраните модуль с именем postav_ik.
Пропишем Uses general; после раздела implementation в программном модуле unit postav_ik,а в программном модуле unit general главной формы пропишем Uses ed_izmer, product_group, postav_ik;
Размещаем на форме компоненты как показано на рисунке:
Далее все делаем аналогично, как для предыдущего справочника. А я приведу лишь код для обработки событий.
Для кнопки «Новая запись»
procedure TForm_postav_ik.Button1Click(Sender: TObject); begin //новая запись form_general.table_postav_ik.Append; dbgrid1.SetFocus end; |
Для кнопки «Удалить запись»
procedure TForm_postav_ik.Button2Click(Sender: TObject); //удаление записи begin //если записи отсутствуют то выводим сообщение, иначе удаляем запись if dbgrid1.DataSource.DataSet.RecordCount<>0 then begin if (MessageBox(Handle, 'Удаление записей может привести к нарушению работы всей базы данных. Удалить запись?', 'Внимание !!!', MB_YESNO)= IDYES) then form_general.table_postav_ik.Delete end else ShowMessage('Нет записей для удаления'); end; |
Для кнопки «Закрыть»
procedure TForm_postav_ik.Button3Click(Sender: TObject); begin //закрытие формы Close; end; |
Для события FormActivateформыForm_postav_ik
procedure TForm_postav_ik.FormActivate(Sender: TObject); begin //установка фокуса при активации формы dbgrid1.SetFocus; end; |
Для события FormCloseформыForm_postav_ik
procedure TForm_postav_ik.FormClose(Sender: TObject; var Action: TCloseAction); begin //процедура закрытия формы Action:=cafree; end; |
Для события FormCloseQueryформыForm_postav_ik
procedure TForm_postav_ik.FormCloseQuery(Sender: TObject; var CanClose: Boolean); //проверка на наличие пустых записей перед закрытием, если такие записи найдены то отменяем закрытие формы begin if dbgrid1.DataSource.DataSet.RecordCount<>0 then begin if not (form_general.table_postav_ik.Locate('postav_ik_name','',[loCaseInsensitive,loPartialKey])) then begin form_general.table_postav_ik.edit;form_general.table_postav_ik.post; end else begin ShowMessage('У Вас есть не заполненные записи');CanClose:=false;dbgrid1.SetFocus;end; end; end; |
Внимание для более корректной работы по полю 'postav_ik_name'необходимо добавить проверку на null (т.е. в поле данные не вводились совсем).
Для главной формы Form_generalпри нажатии на кнопкуКатегориипродуктов выпадающего меню
procedure TForm_general.N5Click(Sender: TObject); begin f:=0; //проверяем, активна ли наша форма if ActiveMDIChild.Caption<>'Поставщики' then begin //если нет то ищем ее среди неактивных и если находим, то показываем ее for i:=0 to form_general.MDIChildCount-1 do if form_general.MDIChildren[i].Caption='Поставщики' then begin MDIChildren[i].Show;f:=1;end; end else f:=1; //если форма еще не создана, то создаем ее if f<>1 then Tform_postav_ik.Create(Application); end; |
Запускаем проект и заполняем справочник данными.
Вопросы для контроля
- напишите синтаксис обработчика события на Удаление записи.
- напишите синтаксис обработчика события на Закрытие формы.
- напишите синтаксис обработчика события на Создание новой записи.
- напишите синтаксис обработчика события на Открытие другой формы.
- напишите синтаксис обработчика события на Созранение записи.
Литература
1. Фаронов В.В. Программирование на языке высокого уровня: Учебник для вузов. -СПб.: Питер, 2003.
2. Бобровский С.И. Delphi 7. Учебный курс. - СПб.: Питер, 2005.
3. Кетков Ю.Л., Кетков А.Ю. Практика программирования: Visual Basic, C++ Builder, Delphi. - СПб.: БХВ - Петербург, 2005.
ЛАБОРАТОРНАЯ РАБОТА № 6
Тема: Создание подчиненной формы для справочников программы склад. Создаем справочник «Продукты» с использованием полей Lookup.
Цель: Научиться создавать справочкик используя поля Lookup
Оборудование и/или программное обеспечение: ПК, Delphi
Теоретическая часть
Подстановочное поле Lookup изначально в набор данных не входит, его нужно создавать самостоятельно. Такое поле отличается от обычного тем, что показывает данные из другого набора данных. Для использования такого поля два набора данных обязательно должны иметь релятивную связь. На прошлой лекции мы применяли компонент DBLookupComboBox, который является аналогом подстановочного поля, но который нельзя показать в сетке DBGrid. При создании подстановочного поля также необходимо указать набор данных, откуда поле будет просматривать значения, ключевые поля для релятивной связи и поле со значениями, которые нужно подставлять.
Открываем проект из лекции № 5, открываем окно модуля данных. Дважды щелкаем по компоненту FoodT, чтобы открыть редактор полей. В этом редакторе у нас уже присутствуют пять полей, имеющихся в таблице, добавим шестое, подстановочное. Для этого щелкните правой кнопкой по редактору полей и выберите команду New Field (Новое поле):
Рис. 6.1. Создание подстановочного (Lookup) поля
В разделе Field type (Тип поля) вы можете выбрать один из трех вариантов. Нас сейчас интересует тип Lookup. Заполните необходимые поля значениями, как на рисунке 6.1 и нажмите кнопку "ОК". Новое подстановочное поле будет добавлено в набор данных. В списке полей его можно переместить мышью на другое место, установите его сразу под FName. Перейдите на окно главной формы и убедитесь, что новое поле появилось. Однако оно пока еще не содержит данных - данные будут доступны только во время прогона программы. Сохраните проект, скомпилируйте и посмотрите, как работает программа. Как мы видим, теперь на главной форме два поля, которые ни к чему показывать пользователю - FKey с номерами записей, и FType - с номерами типов блюд, которые нам уже не нужны, поскольку мы показываем сами типы. Уберем их, точнее, сделаем невидимыми. Снова откройте редактор полей набора данных FoodT. Установите свойство Visible этих полей в False.
Практическая часть
На этом уроке мы создадим форму для справочника «Продукты» нашего склада c использованием поле Lookup из других таблиц.
Процесс создания данных форм аналогичен созданию формы для справочника «Единицы измерения», смотри предыдущие уроки. Поэтому описывать буду достаточно кратко.
Создаем новую форму File->New->Form –Delphi
В инспекторе объектов устанавливаем следующие свойства для новой формы
Caption -> Продукты;
FormStyle -> fsMDIChild;
Name -> Form_products;
Сохраните модуль с именем products.
Пропишем Uses general; после раздела implementation в программном модуле unit products.
А в программном модуле unit general главной формы пропишем Uses ed_izmer, product_group, products;
Далее размещаем на форме следующие компоненты
Три кнопки TButton из вкладки Standart
В инспекторе объектов для Button1 устанавливаем свойство Caption -> Новая запись;
для Button2 устанавливаем свойство Caption -> Удалить запись;
для Button3 устанавливаем свойство Caption -> Закрыть.
Из вкладки Data Accessпомещаем на форму компонент TDataSource.
В инспекторе объектов для него устанавливаем следующие свойства:
DataSet -> Form_general.table_products;
Name -> products.
А из вкладки Data Controls помещаем на форму компонент TDBGrid.
В инспекторе объектов для него устанавливаем следующие свойства:
DataSource -> products.
Если поля таблицы не отображаются в DBGrid,возможно у вас отключено (False) свойство Active главной форме в инспекторе объектов компонента table_products (TADOtable),установитеActive -> True.
Сейчас мы переименуем поля нашей таблице. Для этого перейдем на главную форму проекта.
Выберем компонент table_products (ADOTable)и в структуре (Structure) -> products -> Fields -> щелкнем правой кнопкой мыши и выберем Add all fields.
Для полей id, id_product_group, id_ed_izmer в инспекторе объектов устанавливаем свойство Visible->False,
затем выбираем поле product_name и в инспекторе объектов устанавливаем у него свойства
DisplayLabel -> Продукт;
DisplayWidth -> 30;
затем выбираем поле time_hraneniya и в инспекторе объектов устанавливаем у него свойства
DisplayLabel -> Время хранения;
DisplayWidth -> 20;
Далее создаем выпадающее поле Lookup для просмотра данных из справочника «Категории продуктов».
Для этогов структуре (Structure) -> products -> Fields -> щелкнем правой кнопкой мыши и выберем New field….
После этого видим:
В поле Name: пишем product_group;
в поле Type: выбираем String;
выбираем поле Lookup;
в Key Fields:выбираем id_product_group;
в Dataset: выбираем table_product_group;
в Lookup Keys: выбираем id;
а в Result Field: выбираем product_name жмем ОК
В инспекторе объектов для созданного поля свойство DisplyLabel-> Категория продукта, DisplyWidth-> 24 иперемещаем поле мышкой в позицию после поляproduct_name.