Для этогов структуре (Structure) -> products -> Fields -> щелкнем правой кнопкой мыши и выберем New field…. и заполняем:
В поле Name: пишем ed_izmer;
в поле Type: выбираем String;
выбираем поле Lookup;
в Key Fields:выбираем id_ed_izmer;
в Dataset: выбираем table_ed_izmer;
в Lookup Keys: выбираем id;
а в Result Field: выбираем ed_name жмем ОК
В инспекторе объектов для созданного поля свойство DisplyLabel-> Единица измерения, DisplyWidth-> 24 иперемещаем поле мышкой в позицию после поляproduct_group.
Теперь пишем обработчики событий для кнопок.
Щелкнем дважды мышкой по кнопке «Новая запись» и пишем следующий код:
procedure TForm_products.Button1Click(Sender: TObject); begin //новая запись form_general.table_products.Append; dbgrid1.SetFocus end;
|
Щелкнем дважды мышкой по кнопке «Удалить запись»и пишем следующий код:
procedure TForm_products.Button2Click(Sender: TObject); //удаление записи begin //если записи отсутствуют то выводим сообщение, иначе удаляем запись if dbgrid1.DataSource.DataSet.RecordCount<>0 then begin if (MessageBox(Handle, 'Удаление записей может привести к нарушению работы всей базы данных. Удалить запись?', 'Внимание !!!', MB_YESNO)= IDYES) then form_general.table_products.Delete end else ShowMessage('Нет записей для удаления'); end;
|
Щелкнем дважды мышкой по кнопке «Закрыть» и пишем следующий код:
procedure TForm_products.Button3Click(Sender: TObject); begin //закрытие формы Close; end;
|
В инспекторе объектов для Form_products событие FormActivateпишем:
procedure TForm_products.FormActivate(Sender: TObject); begin //так как таблица продукты использует данные из таблиц единицы измерения и категории продуктов //то мы должны проверить заполнены они или нет if form_general.table_ed_izmer.RecordCount=0 then begin ShowMessage('У Вас не заполнен справочник "Единиц измерения". Для продолжения работы Вам необходимо заполнить справочник.');close;end else begin if form_general.table_product_group.RecordCount=0 then begin ShowMessage('У Вас не заполнен справочник "Категории продуктов". Для продолжения работы Вам необходимо заполнить справочник.'); close;end else begin //обновляем данные form_general.table_ed_izmer.Refresh; form_general.table_product_group.Refresh; //установка фокуса при активации формы dbgrid1.SetFocus; end; end; end;
|
В инспекторе объектов дляForm_products событие FormClose пишем:
procedure TForm_products.FormClose(Sender: TObject; var Action: TCloseAction); begin
//процедура закрытия формы
Action:=cafree; end;
|
В инспекторе объектов дляForm_products событие FormCloseQuery пишем:
procedure TForm_products.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin //проверка на наличие пустых записей перед закрытием, если такие записи найдены то отменяем закрытие //формы if dbgrid1.DataSource.DataSet.RecordCount<>0 then begin //по полю продукт if (form_general.table_products.Locate('product_name','', [loCaseInsensitive,loPartialKey])) then begin ShowMessage('У Вас есть не заполненные записи в поле "Продукт"');CanClose:=false; dbgrid1.SetFocus;end else begin //по полю категория продукта if (form_general.table_products.Locate('id_product_group',null, [loCaseInsensitive,loPartialKey])) then begin ShowMessage('У Вас есть не заполненные записи в поле "Категория продукта"'); CanClose:=false;dbgrid1.SetFocus;end else begin //по полю единица измерения if (form_general.table_products.Locate('id_ed_izmer',null, [loCaseInsensitive,loPartialKey])) then begin ShowMessage('У Вас есть не заполненные записи в поле "Единицы измерения"'); CanClose:=false;dbgrid1.SetFocus;end else begin //по полю дата хранения if (form_general.table_products.Locate('time_hraneniya',null,[loCaseInsensitive,loPartialKey])) then begin ShowMessage('У Вас есть не заполненные записи в поле "Время хранения"');CanClose:=false;dbgrid1.SetFocus;end else begin form_general.table_products.edit;form_general.table_products.post; end; end; end; end; end; end;
|
Внимание для более корректной работы по полю 'product_name'необходимо добавить проверку на null (т.е. в поле данные не вводились совсем).
Сейчас сделаем запуск справочника «Продуктов» из главной формы. Для этого выбираем в меню Project -> Options…
Выбираем Forms и перемещаем Form_productsиз Auto-create forms в Avalable forms.
Переходим на главную форму, щелкаем мышкой по компоненту MainMenu1, а затем по пункту Продукты
И пишем следующий обработчик события:
procedure TForm_general.N4Click(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_products.Create(Application); end;
|
Вот и все готово, запускаем проект и заполняем справочник данными.
Но теперь возникает другая проблема, так наш справочник «Продуктов» связан с другими справочниками, то при удалении из них данных возникнут проблемы и со справочником «Продуктов». Поэтому в справочниках «Категории продуктов» и «Единицы измерения», пред удаление записи мы должны проверить используется ли эта запись в справочнике «Продуктов» и если используется то запретить удаление.
Изменим процедуру удаления записи в справочнике «Категории продуктов»
Щелкнем дважды мышкой по кнопке «Удалить запись» на форме «Категории продуктов» и пишем следующий код:
procedure TForm_product_group.Button2Click(Sender: TObject); //удаление записи begin //если записи отсутствуют то выводим сообщение, иначе удаляем запись if dbgrid1.DataSource.DataSet.RecordCount<>0 then begin if (MessageBox(Handle, 'Удаление записей может привести к нарушению работы всей базы данных. Удалить запись?', 'Внимание !!!', MB_YESNO)= IDYES) then if (form_general.table_products.Locate('id_product_group', form_general.table_product_group.FieldByName('id').Value, [loCaseInsensitive, loPartialKey])) then ShowMessage('Нельзя удалить данную категорию продуктов, так как она используется в справочнике продуктов.') else form_general.table_product_group.Delete end else ShowMessage('Нет записей для удаления'); end;
|
Изменим процедуру удаления записи в справочнике «Единицы измерения»
Щелкнем дважды мышкой по кнопке «Удалить запись» на форме «Единицы измерения» и пишем следующий код:
procedure TForm_ed_izmer.Button2Click(Sender: TObject); //удаление записи begin //если записи отсутствуют то выводим сообщение, иначе удаляем запись if dbgrid1.DataSource.DataSet.RecordCount<>0 then begin if (MessageBox(Handle, 'Удаление записей может привести к нарушению работы всей базы данных. Удалить запись?', 'Внимание !!!', MB_YESNO)= IDYES) then if (form_general.table_products.Locate('id_ed_izmer', form_general.table_ed_izmer.FieldByName('id').Value, [loCaseInsensitive, loPartialKey])) then ShowMessage('Нельзя удалить данную единицу измерения, так как она используется в справочнике продуктов.') else form_general.table_ed_izmer.Delete end else ShowMessage('Нет записей для удаления'); end;
|
Вопросы для контроля
- Для чего нужно поле Lookup?
- Напишите синтаксис на событие FormActivate
- Напишите синтаксис на событие FormClose
- Напишите синтаксис на событие FormCloseQuery
- Для чего нужен компонент MainMenu1?
Литература
1. Фаронов В.В. Программирование на языке высокого уровня: Учебник для вузов. -СПб.: Питер, 2003.
2. Бобровский С.И. Delphi 7. Учебный курс. - СПб.: Питер, 2005.
3. Кетков Ю.Л., Кетков А.Ю. Практика программирования: Visual Basic, C++ Builder, Delphi. - СПб.: БХВ - Петербург, 2005.