Демонстрационный экзамен 2026

 

1. Настройте параметры проекта. Выполите команду ProjectOptions. В левой части выберите узел Application. В правой части введите в поле Title введите имя приложение «Магазин обуви». В поле Icon укажите иконку приложения.
Сохраните проект в папку. В папке с проектом создайте папку Image, в которую поместите изображения товаров и изображение, обозначающее, что фото нет.

 

2. Для подключения к проекту вашей БД и нужных таблиц и запросов добавим в проект модуль данных. Выполните команду меню FileNewOther. В окне в левой части выберите узел Delphi Files, а в правой части выберите элемент Data Module.

Появится окно модуля данных. В свойстве Name дайте ему имя dm. При сохранении назовите модуль uDM.pas

Для подключения БД добавьте компонент ADOConnection  и задайте свойство ConnectionString:  имя сервера localhost, встроенная безопасность Windows, в списке укажите вашу БД.

Свойство LoginPrompt = false (чтобы программа не запрашивала логин и пароль при каждои запуске).

 

Замечание. В дальнейшем для работы с БД на формах необходимо в каждой форме подклюбчать этот модуль с помощью команды FileUse Unit и выбирать модуль uDM.

 

3. Создание окна регистрации.

Первую форму проекта оформим как окно регистрации вида:

 

 

Для формы задайте свойства: Name = frmReg, BorderIcons biSystemMenu = false (скрываем кнопки в заголовке окна), BorderStyle = bsDialog (окно нельзя растягивать), Caption = Идентификация пользователя, Position = ScreenCenter, Font = Times New Roman, 10 пт.

Для отображения картинки используйте компонент Image, для которого задайте свойства: Center = true, Proportional = true, Stretch = true, Picture – укажите файл с изображением.

Сохраните форму под именем uReg.

Надписи «Логин» и «Пароль» создайте с помощью Label с указанием свойства Caption.

Поля для ввода и пароля создайте с помощью компонента Edit. Для каждого поля очиситите свойство Text. Для поля ввода пароля в свой1стве PasswordChar укажите символ «*».

Добавьте три кнопки Button и в свойстве Caption укажите надписи как показано на рисунке.

 

Логин и пароль будем проверять с помощью запроса по таблице users. Перейдите в модуль dm, добавьте компонент ADOQuery, для которого задайте свойства: Name = AQUser, Connection = имя ADOConnection, SQL =

 

select * from users where login=:login and password=:password

 

Запрос имеет два параметра (:login и :password)

  

Перейдите на форму frmReg. Для обращения к созданному запросу подключите модуль uDM с помощью команду FileUse Unit.

 

Для кнопки «Отмена» напишем код:

 

procedure TfrmReg.Button2Click(Sender: TObject);

begin

          Application.Terminate;

end;

 

Так как после идентификации нам нужно запомнить роль пользователя и его ФИО, в коде формы frmReg опишем глобальные переменные:

 

  activeUser:integer;

  activeRole:integer;

 

Для работы программы примем такие значения ролей:

Гость = 0

Авторизированный клиент = 1

Менеджер = 2

Администратор 3

 

 Для кнопки «Войти как гость» напишем код:

 

procedure TfrmReg.Button3Click(Sender: TObject);

begin

//скрываем форму идентификации

Hide;

//создаем в памяти форму работы с товарами

frmView:=TfrmView.Create(nil);

//запоминаем, что пользователь вошел как гость (0)

ActiveRole:=0;

//открываем форму работы с товарами

frmView.Show;

end;

Для кнопки «ОК» напишем код:

 

procedure TfrmReg.Button1Click(Sender: TObject);

//переменная для сохранения текстового названия роли пользователя

var role:string;

begin

//выключаем запрос поиска пользователя по логину и паролю

dm.AQUser.Active:=false;

//передаем в запрос логин и пароль, введенные в текстовые поля

dm.AQUser.Parameters.ParamByName('login').value:=edit1.text;

dm.AQUser.Parameters.ParamByName('password').value:=edit2.text;

//включаем запрос (ищем пользователя по логигу и паролю)

dm.AQUser.Active:=true;

 

//если после отбора запрос вернул 0 строк (пользователь не найден)

if dm.AQUser.RecordCount=0 then

begin

//выдаем сообщение

Application.MessageBox('Введены неверные данные. Повторите ввод или войдите как гость','Ошибка входа',mb_OK+mb_iconinformation);

                    //ставим курсор в поле логина для повторного ввода

edit1.SetFocus;

                    //завершаем работу процедуры, дальше код не выполняется

exit;

end

//иначе, если запрос вернул не 0 строк (есть найденный пользователь)

else

begin

                    //скрываем окно регистрации

hide;

                    //в переменную записываем название роли найденного пользователя

role:=dm.AQUser.FieldByName('role').asString;

                    //в зависимости от названия роля в глобальную переменную записываем числовое обозначение роли

if role='Авторизированный клиент' then

                              ActiveRole:=1

                    else if role='Менеджер' then

                              ActiveRole:=2

                    else if role='Администратор' then

                              ActiveRole:=3;

                    //создаем в памяти форму для работы с товарами

frmView:=TfrmView.Create(nil);\

//на форме работы с товарами отображаем ФИО активного пользователя

                    frmView.Label1.Caption:=dm.AQUser.FieldByName('fio').asString;

                    //отображаем форму работы с товарами

frmView.Show;

end;

//выключаем запрос поиска пользователя по логину и паролю

dm.AQUser.Active:=false;

end;

 

Замечание. Для проверки работы формы регистрации нужно создать вторую форму для работы со списком товаров (см. следующий пункт).

 

4. Создание окна со списком товаров.

Добавьте в проект новую форму с помощью команду FileNewForm. Для формы задайте свойства: Name = frmView, BorderIcons biMaximized = false (скрываем кнопку раскрытия на весь экран), BorderStyle = bsSingle (окно нельзя растягивать), Caption = Магазин обуви, Position = ScreenCenter, Font = Times New Roman, 10 пт.

Сохраните форму под именем uView.

С помощью команды ProjectOptions перенесите форму frmView в список Available Forms.

Форма должна иметь вид:

 

Вверху справа отобразим ФИО пользователя. Нанесите на форму компонент Label1. Задайте свойство Caption = Вы вошли как гость. Правее отобразите лого магазина так же, как сделали это на форме регистрации.

Ниже от ФИО пользователя добавьте кнопку для возврата на форму идентификации. Задайте свойство Caption = Выйти. Для кнопки напишите код:

 

procedure TfrmView.Button3Click(Sender: TObject);

begin

//удаляем форму из памяти

Free;

//отображаем форму регистрации

frmReg.Show;

//сбрасываем роль пользователя на гостя

ActiveRole:=0;

end;

 

Кнопки Добавить и Удалить нанесите на панель. На форму нанесите компонент Panel и очистите свойство Caption. На панели разместите две кнопки Button, для которых в свойстве Caption укажите Добавить и Удалить. Созданная панель будет размещена внизу форму.

 

Параметры сортировки, фильтрации и поиска также нужно разместить на отдельной панели. На форму нанесите компонент Panel и очистите свойство Caption. С помощью компонента Label нанесите на панель текст Сортировка, Фильтрация, Строка поиска.

Для задания параметров сортировки добавьте компонент ComboBox и задайте свойства: Items = без сортировки

по возрастанию количества

по убыванию количества

ItemIndex = 0 (по умолчанию с писке отображается первая строка, нумерация с 0)

 

Для задания параметров фильтрации создадим список со списком поставщиков из таблицы Tovar. Нанесите на панель компонент DBLookupComboBox. Свойства компонента зададим позже, после подключения таблиц и запросов.

 

Для создания строки поиска добавьте на панель компонент Edit.

 

Данная панель должна размещаться вверху формы слева, как показано на рисунке.

Отображение списка товаров на форме

Вначале подключим таблицу Tovar. Перейдите в модуль данных dm.

Добавьте компонент ADOTable и задайте свойства: Name = ATTovar, Connection = имя ADOConnection, TableName = Tovar. Двойным кликом откройте ATTovar и для каждого поля в списке в свойстве Display Label  укажите русское название (как показано на рисунке).

Добавьте компонент DataDSource и задайте свойства: Name = DSTovar, DataSet = ATTovar.

 

Перейдите на форму frmView и подключите модуль данных с помощью команды FileUse Unit. В событии OnCreate формы введите команду активации таблицы:

 

procedure TfrmView.FormCreate(Sender: TObject);

begin

dm.ATTovar.Active:=true;

end;

 

Нанесите на форму компонент DBCtrlGrid и задайте свойство DataSource = dm.DSTovar (таблица для отображения), SelectedColor = $009AFA00 (цвет активногй строки в компоненте).

На первой панели компонента разместите компоненты как показано на рисунке. Слева – компонент Image. Для отображения надписи используйте компонент Label, для отображения имени поля используйте компонент DBText, для которого задайте свойства: DataSource = dm.DSTovar, DataField = имя поля таблицы.

 

По умолчанию компонент DBCtrlGrid не поддерживает скроллинг мышью. Откройте код формы. Вверху найдите ключевое слово type, где описывается класс формы, и после этого слова введите код:

 

type

 

TDBCtrlGrid = class(DBCGrids.TDBCtrlGrid)

  protected

    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;

  end;

 

  TfrmView = class(TForm) …

 

После ключевого слова implementation введите текст функции:

 

function TDBCtrlGrid.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;

  MousePos: TPoint): Boolean;

begin

if WheelDelta>0 then

DataSource.DataSet.Prior else DataSource.DataSet.Next;

          Result:=True;

end;

 

Для отображения фото товара в событии OnPaintPanel компонента DBCtrlGrid введите код:

 

procedure TfrmView.DBCtrlGrid1PaintPanel(DBCtrlGrid: TDBCtrlGrid;

  Index: Integer);

begin

//если поле фото не пустое (то есть есть фото)

if dm.ATTovar.FieldByName('photo').asstring<>'' then

                    //отображаем в компоненте изображение из файла в папке Image

Image2.Picture.LoadFromFile(extractfilepath(application.exename)+'\image\'+dm.ATTovar.FieldByName('photo').asstring)

//иначе, если поле фото пустое

else

//отображаем в компоненте изображение из файла nophoto.jpg в папке Image

Image2.Picture.LoadFromFile(extractfilepath(application.exename)+'\image\nophoto.jpg');

end;

 

Если скидка больше 15%, то такие строки помечаются цветом.

В событии OnPaintPanel компонента DBCtrlGrid (после кода отображения фото) добавьте код:

 

//если поле skidka >15

if dm.ATTovar.FieldByName('skidka').asinteger>15 then

begin

//задаем цвет окраски

dbctrlgrid1.Canvas.Brush.Color :=$00578B2E;

//закрашиваем строку цветом

dbctrlgrid1.Canvas.FillRect(Rect(0,0,DBCtrlGrid.PanelWidth,DBCtrlGrid.PanelHeight));

end;

 

Если остаток товара на складе 0, то то такие строки помечаются цветом.

В событии OnPaintPanel компонента DBCtrlGrid (после кода окраски скидки >15) добавьте код:

 

//если поле kolvo=0

if dm.ATTovar.FieldByName('kolvo').asinteger=0 then

begin

   //задаем цвет окраски

dbctrlgrid1.Canvas.Brush.Color :=clTeal;

   //закрашиваем строку цветом

dbctrlgrid1.Canvas.FillRect(Rect(0,0,DBCtrlGrid.PanelWidth,DBCtrlGrid.PanelHeight));

end;

 

Организация сортировки данных

 

Для компонента ComboBox1 для сортировки в событии OnChange введите код:

 

procedure TfrmView.ComboBox1Change(Sender: TObject);

begin

//проверяем номер строки в списке

case combobox1.itemindex of

//если 0 (без сортировки)

//сортируем по клбючевому полю (как по умолчанию)

0: dm.ATTovar.IndexFieldNames:='idTovar';

//если 1 (сортировка количества по возрастанию)

1: dm.ATTovar.IndexFieldNames:='kolvo ASC';

//если 2 (сортировка количества по убыванию)

2: dm.ATTovar.IndexFieldNames:='kolvo DESC';

end;

//после сортировки возвращаем  курсор в сетку с товарами

dbCtrlGrid1.SetFocus;

end;

 

Организация фильтрации

Выпадающий список должен содержать список всех поставщиков из таблицы Tovar. При этом первой строкой должна быть «Все поставщики». Список поставщиков из таблицы будем получать с помощью запроса.

Перейдите в модуль dm.

Добавьте компонент ADOQuery и задайте свойства: Name = AQPost, Connection = имя ADOConnection, SQL =

 

select ' Все поставщики' as post

union

select post from tovar

 

Добавьте компонент DataSource и задайте свойства: Name = DSPost, DataSet = AQPost.

 

Перейдите на форму frmView. Список фильтрации должен заполняться список поставщиков из созданного выше запроса. Для компонента DBlookupComboBox1 задайте свойства: ListSource = dm.DSPost (источник строк для списка), KeyField = post (поле для отображения списке). Ч тобы при старте формы список заполнялся данными запроса и по умолчанию в списке отображалась первая строка в событии формы OnCreate добавьте код:

 

//активируем запрос (отбираем спи сок поставщиков)

dm.AQPost.Active:=true;

//отображаем в списке нужное значение

dbLookupComboBox1.KeyValue:=' Все поставщики';

 

Для фильтрации для компонента DBLookupComboBox1 в событии OnCloseUp введите код:

 

procedure TfrmView.DBLookupComboBox1CloseUp(Sender: TObject);

begin

//если с в списке не выбрана первая строка

if dbLookupComboBox1.KeyValue<>' Все поставщики' then

begin

//задаем фильтр для фильтрации    

dm.ATTovar.Filter:='post = '''+dbLookupComboBox1.KeyValue+'''';

//включаем фильтрацию    

dm.ATTovar.Filtered:=true;

end

//иначе, если выбрана первая строка

else

//выключаем фильтрацию

dm.ATTovar.Filtered:=false;

//после фильтрации ставим курсор в сетку с товарами

dbCtrlGrid1.SetFocus;

end;

 

Организация поиска по текстовым полям

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

Для перехода будем использовать следующий подход: с помощью запроса будем находить id нужного товара, а затем переходить на товар по найденному id.

 

Вначале создадим запрос. Перейдите в модуль dm.

Добавьте компонент ADOQuery и задайте свойства: Name = AQSearch, Connection = имя ADOConnection.

 

Перейдите на форму frmView. Поиск будем выполнять по нажатию на Enter в строке поиска. Для компонента строки поиска в событии OnKeyDown введите код:

 

procedure TfrmView.Edit1KeyDown(Sender: TObject; var Key: Word;

  Shift: TShiftState);

begin

//если нажата клавиша Enter

if key = vk_return then

begin

//формируем запрос поиска по любому из текстовых полей 

dm.AQSearch.SQL.Text:='select top 1 idTovar from tovar where nazv like '''+edit1.text+'%'''+

                                                      ' or proizv like '''+edit1.text+'%'''+

                                                      ' or kategor like '''+edit1.text+'%'''+

                                                      ' or opisan like ''%'+edit1.text+'%''';

//включаем запрос (отбираем данные) 

dm.AQSearch.Active:=true;

 //вызываем метод поиска в таблице по полю idTovar

dm.ATTovar.Locate ('idTovar', dm.AQSearch.FieldByName('idTovar').asinteger,[]);

//отключаем запрос поиска

dm.AQSearch.Active:=false;

end;

end;

 

Ограничение функционала в зависимости от роли пользователя

По заданию гость и авторизированный клиент могут только просматривать данные. Менеджер может просматривать, сортировать, фильтровать и искать данные.

Администратор может все, что может менеджер, а также добавлять, редактировать и удалять данные.

Ранее в форме frmReg мы с помощью глобальной переменной ActiveRole запомнили роль активного пользователя. Применим значение этой переменной для настройки доступа к функциям системы. Для этого в событии OnCreate формы frmView добавьте код:

 

//проверяем значение переменной ActiveRole

case ActiveRole of

//если вошел гость (0) или авторизированный клиент (1)

0,1:

begin

//скрываем панель с кнопками Добавить и Удалить

panel1.Visible:=false;

//скрываем панель с сортировкой, фильтрацией и поиском 

          panel2.Visible:=false;

end;

//если вошел менеджер (2)

2: 

/         /скрываем панель с кнопками Добавить и Удалить

panel1.Visible:=false;

end;

 

5. Работа с товаром в отдельной форме

Добавьте в проект новую форму с помощью команду FileNewForm. Для формы задайте свойства: Name = frmEdit, BorderIcons biMaximized = false (скрываем кнопку раскрытия на весь экран), BorderStyle = bsSingle (окно нельзя растягивать), Caption = Данные о товаре, Position = poOwnerFormCenter (по центру формы с товарами), Font = Times New Roman, 10 пт.

Сохраните форму под именем uEdit.

С помощью команды ProjectOptions перенесите форму frmEdit в список Available Forms.

Форма должна иметь вид:

Для создания элементов на форме перейдите в модуль dm. Двойным кликом откройте таблицу ATTovar. Выделите все поля кроме idTovar и Photo и перетащите их на форму frmEdit. Разместите надписи и поля как показано на рисунке.

Категория должна заполняться с помощью выпадающего списка. Удалите DBEdit для категории и добавьте компонент DBComboBox. Для компонента задайте свойства: DataSource = DataSource1, DataField = поле категории, Items – список значений из таблицы Tovar: Женская одежда, Мужская одежда.

Аналогично создайте список для производителя. Список значений для списка нужно взять из таблицы Tovar: Alessio Nesca, CROSBY, Kari, Marco Tozzi, Rieker.

 

Работа с полем photo

Нанесите компонент Image  и задайте свойства: Center = true, Proportional = true, Stretch = true.

При открытии формы в компоненте должно отображаться фото товара или изображение nophoto.jpg

Для этого в событии OnCreate формы введите код:

 

procedure TfrmEdit.FormCreate(Sender: TObject);

begin

//если поле photo не пустое (есть фото)

if dm.ATTovar.FieldByName('photo').asstring<>'' then

//в компоненте отображается файл фото товара из папки image

Image1.Picture.LoadFromFile(extractfilepath(application.exename)+'\image\'+dm.ATTovar.FieldByName('photo').asstring)

//иначе, если поле пустое

else

//в компоненте отображается файл nophoto.jpg из папки image

Image1.Picture.LoadFromFile(extractfilepath(application.exename)+'\image\nophoto.jpg');

end;

 

Для добавления и удаления фото нанесите на форму кнопки Button, для которых в свойстве Caption укажите текст «+» и «-». Также нанесите компонент OpenPictureDialog  и задайте свойство Filter = «Все файлы (*.jpg, *.bmp)|*jpg;*.bmp|JPEG Image File (*.jpg)|*.jpg|Bitmaps (*.bmp)|*.bmp»

 

Добавление (изменение) фото

По заданию при выборе файла с фото имя файла должно записаться в таблицу БД, а в папку image скопироваться файл с фото.

Если фото заменяется на новое, то старый файл из  папки image должен быть удален, а новый скопирован.

Также для экономии места нужно проверять, чтобы загружаемый файл с фото товара не превышал размер 300х200. Для кнопки «+» напишем код:

 

procedure TfrmEdit.Button3Click(Sender: TObject);

var

//переменная для загрузки BMP изображения

bmp:TBitMap;

//переменная для загрузки JPG изображения

jpg:TJpegImage; //возможно, нужно будет подключить модуль JPEG

//переменные для хранения ширины и высоты загружаемого файла

width, height:integer;

begin

//если в диалоге пользователь не выбрал файл, конец процедуры

if not openpicturedialog1.execute then exit;

 

//если загружается файл с расширением bmp

if extractfileext(openpicturedialog1.filename)='.bmp' then

begin

//загружаем файл в переменную

bmp:=TBitMap.Create;

bmp.LoadFromFile(openpicturedialog1.filename);

//записываем в переменные ширину и высоту файла

width:= bmp.Width;

height:=bmp.height;

bmp.Free;

end

//иначе, если загружается файл с расширением jpg

else if extractfileext(openpicturedialog1.filename)='.jpg' then

begin

//загружаем файл в переменную

jpg:=Tjpegimage.create;

jpg.LoadFromFile(openpicturedialog1.filename);

//записываем в переменные ширину и высоту файла

width:= jpg.Width;

height:=jpg.height;

jpg.Free;

end;


//
если
ширина > 300 или высота >200

if (width>300) or (height>200) then

begin

//выдаем сообщение об ошибке 

Application.MessageBox('Загружаемое изображение не может превышать размер 300 x 200','Операция отклонена',mb_ok+mb_iconinformation);

//процедура завершается 

exit;

end;

 

//если во время загрузки поле photo не пустое

//то есть у товара есть старое фото

if dm.ATTovar.FieldByName('photo').asstring<>'' then

//удаляем из папки image старый файл 

DeleteFile(extractfilepath(application.exename)+'\image\'+dm.ATTovar.FieldByName('photo').asstring);

 

//в поле photo товара записываем имя нового файла

dm.ATTovar.FieldByName('photo').asstring:=extractfilename(openpicturedialog1.filename);

//копируем указанный файл в папку image

copyfile(pchar(openpicturedialog1.filename),pchar(extractfilepath(application.exename)+'\image\'+extractfilename(openpicturedialog1.filename)),true);

//в компоненте image1 на форме отображаем новое фото товара

image1.picture.loadfromfile(openpicturedialog1.filename);

end;

 

Удаление фото

По заданию при удалении фото из таблицы БД также должен удаляться соответствующий файл из папки image. Для кнопки «-» напишем код:

 

procedure TfrmEdit.Button4Click(Sender: TObject);

begin

//выдаем запрос на удаление фото
if application.messagebox('Удалить фото о товаре?','Подтвердите операцию',mb_yesno+mb_iconquestion)=idno then

//если ответ отрицательный, процедура завершает работу

exit;

 

//если поле photo не пустое (есть фото товара)

          if dm.ATTovar.FieldByName('photo').asstring<>'' then

//удаляем из папки image соответствующий файл   DeleteFile(extractfilepath(application.exename)+'\image\'+dm.ATTovar.FieldByName('photo').asstring);

 

          //очищаем поле photo  в таблице

dm.ATTovar.FieldByName('photo').asstring:='';

 

          //в компоненте Image1 на форме отображаем файд nophoto.jpg из папки image

Image1.Picture.LoadFromFile(extractfilepath(application.exename)+'\image\nophoto.jpg');

end;

 

Сохранение изменений

Для кнопки Сохранить напишем код:

 

procedure TfrmEdit.Button1Click(Sender: TObject);

begin

//пробуем сохранить данные и выйти из формы

try

dm.ATTovar.Post;

Close;

//если не удалось

except

//появляется сообщение об ошибке

Application.MessageBox('Данные не сохранены. Проверьте правильность их заполнения','Ошибка',mb_ok+mb_iconinformation);

end;

end;

 

Замечание. Если компилятор ругается на Try, выполните команду Tools Options. В левой части найдите узел DebuggerOptions CodeGear Debuggers LanguageException и в правой части снимите флажок Notify On Language Exceptions

 

Для кнопки Отмена напишите код:

 

procedure TfrmEdit.Button2Click(Sender: TObject);

begin

dm.ATTovar.Cancel;

Close;

end;

 

 

6. Организация добавления, редактирования и удаления товаров на форме с товарами

Вернитесь на форму frmView. Для кнопки Добавить напишите код:

 

procedure TfrmView.Button1Click(Sender: TObject);

begin

//добавляем в таблицу новую запись

dm.ATTovar.Append;

//создаем и открываем форму для работы с товаром

frmEdit:=TfrmEdit.Create(nil);

frmEdit.ShowModal;

end;

 

Редактирование товара должно происходить при щелчке на товаре. При этом редактировать товар может только администратор. Также по заданию при редактировании товара на форме должен отображаться его ID. Будем отображать его в заголовке окна. Для компонента DBCtrlGrid в событии OnClick напишем код:

 

procedure TfrmView.DBCtrlGrid1Click(Sender: TObject);

begin

//если роль пользователя <2 (не администратор)

if ActiveRole<2 then

//процедура заканчивает свою работу

exit;

 

//переводим таблицу в режим редактирования

dm.ATTovar.Edit;

//создаем форму работы с товаром

frmEdit:=TfrmEdit.Create(nil);

//в заголовке окна отображаем id товара

frmEdit.Caption:=frmEdit.Caption + ' id='+dm.ATTovar.FieldByName('idTovar').asstring;

//отображаем окно работы с товаром

frmEdit.ShowModal;

end;

 

Замечание.

Пользователь может кликнуть не на пустом месте в компоненте отображения товаров, а на любой надписи или поле, на фото и т.п. Выделите все компоненты, которые описывают товар и в событии OnClick выберите созданное выше событие.

 

При удалении товара также нужно удалить из папки image файл с его фото. Также товар нельзя удалить, если для него есть заказы. Для кнопки Удалить напишем код:

 

procedure TfrmView.Button2Click(Sender: TObject);

//переменная для хранения имени файла с фото  товара

var filename:string;

begin

//выдаем запрос на удаление товара

if application.messagebox('Удалить данные о товаре?','Подтвердите операцию',mb_yesno+mb_iconquestion)=idno then

//если ответ отрицательный, то процедура завершает работу

exit;

 

//пробуем удалить товар

          try

                    //в переменную запоминаем имя файла из таблицы

filename:= dm.ATTovar.FieldByName('photo').asstring;

                    //удаляем товар из таблицы БД

dm.ATTovar.Delete;

                    //если имя файла не пустое (есть фото)

if filename<>'' then

                              //удаляем этот файл из папки image

DeleteFile(extractfilepath(application.exename)+'\image\'+filename);

          //если удаление не выполнено (есть заказы по товару)

except

          //выдаем сообщение об ошибке

 application.messagebox('Нельзя удалить товар, который присутствует в заказе','Операция не выполнена',mb_ok+mb_iconinformation);

  end;

end;

 

Ограничение на ввод в поля

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

Перейдите в модуль dm. Двойным кликом откройте таблицу ATTovar. Выделите поле cena и в событии OnValidate введите код:

 

procedure Tdm.ATTovarcenaValidate(Sender: TField);

begin

//если поле <0 (cena – вещественное поле float)

if Sender.AsFloat < 0 then

begin

                    //выдаем сообщение об ошибке

                    Application.MessageBox('Цена не может быть меньше 0','Ошибка ввода',mb_ok+mb_iconinformation);

                    //отменяем ввод

abort;

end;

end;

 

Аналогично, выделите поле kolvo и в событии OnValidate введите код:

 

 

procedure Tdm.ATTovarkolvoValidate(Sender: TField);

begin

//если поле <0 (kolvo – целое поле integer)

if Sender.AsInteger < 0 then

begin

                    //выдаем сообщение об ошибке

Application.MessageBox('Остаток на складе не может быть меньше 0','Ошибка ввода',mb_ok+mb_iconinformation);

          //отменяем ввод

abort;

end;

end;

 

Завершение работы программы

Так как форма идентификации скрывается с экрана методом hide, то при закрытии формы frmView нужно завершать работу программы. В событии формы OnClose введите код:

 

procedure TfrmView.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action:=caFree;

Application.Terminate;

end;

 

В событии формы OnDestroy введите код:

 

procedure TfrmView.FormDestroy(Sender: TObject);

begin

dm.ADOConnection1.Connected:=false;

end;