Демонстрационный экзамен 2026
1. Настройте параметры проекта.
Выполите команду Project
– Options. В левой
части выберите узел Application.
В правой части введите в поле Title введите имя приложение «Магазин обуви». В поле Icon укажите
иконку приложения.
Сохраните проект в папку. В папке с проектом создайте папку Image, в которую поместите изображения
товаров и изображение, обозначающее, что фото нет.
2. Для подключения к проекту вашей БД и нужных таблиц и запросов добавим в проект модуль данных. Выполните команду меню File – New – Other. В окне в левой части выберите узел Delphi Files, а в правой части выберите элемент Data Module.
Появится окно модуля данных. В
свойстве Name дайте ему имя dm. При сохранении назовите
модуль uDM.pas
Для подключения БД добавьте компонент ADOConnection и задайте свойство ConnectionString: имя сервера localhost, встроенная безопасность Windows, в списке укажите вашу БД.
Свойство LoginPrompt = false (чтобы программа не запрашивала логин и пароль при каждои запуске).
Замечание. В дальнейшем для работы с БД на
формах необходимо в каждой форме подклюбчать этот
модуль с помощью команды File – Use Unit и выбирать модуль uDM.
Первую форму проекта оформим как окно регистрации вида:

Для формы задайте свойства: 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 с помощью команду File – Use 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. Создание окна со списком товаров.
Добавьте в проект новую форму с помощью команду File – New – Form. Для формы задайте свойства: Name = frmView, BorderIcons – biMaximized = false (скрываем кнопку раскрытия на весь экран), BorderStyle = bsSingle (окно нельзя растягивать), Caption = Магазин обуви, Position = ScreenCenter, Font = Times New Roman, 10 пт.
Сохраните форму под именем uView.
С помощью команды Project – Options перенесите форму 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 и подключите модуль данных с помощью команды File – Use 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. Работа с товаром в отдельной форме
Добавьте в проект новую форму с помощью команду File – New – Form. Для формы задайте свойства: Name = frmEdit, BorderIcons – biMaximized = false (скрываем кнопку раскрытия на весь экран), BorderStyle = bsSingle (окно нельзя растягивать), Caption = Данные о товаре, Position = poOwnerFormCenter (по центру формы с товарами), Font = Times New Roman, 10 пт.
Сохраните форму под именем uEdit.
С помощью команды Project – Options перенесите форму 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;