пятница, 9 августа 2019 г.

Turbo Delphi 15

1. Создать базу данных (БД) «Студенты» со связанными таблицами.
1) Создайте папку под файлы БД: "C:\Students".
2) Создайте БД. Модель данных:
- Запустите Database Desktop ("C:\Program Files\Common Files\Borland Shared\Database Desktop\dbd32.exe"):
а) Создайте таблицу БД «Группы»:
- выполните «File – New – Table…». В диалоге «Create Table» выберите формат «Paradox»:
- Откроется диалог создания таблицы «Create Paradox 7 Table».
- В диалоге задайте следующую структуру таблицы:
ПолеТипРазмерКлючевое ДополнительноПояснение
IDАвтоинкремент (+ - Autoincrement)даобязательное для заполненияПервичный искусственный ключ – код группы
GroupNameСтрока (A - Alpha)10обязательное для заполненияНазвание группы

Для выбора типа поля щелкните в колонке Type правой кнопкой мыши или нажмите клавишу «Пробел», затем выберите необходимый тип из появившегося списка.
Чтобы сделать поле ключевым, в столбце Key нажмите любую клавишу, например «Пробел».
Оба поля необходимо пометить как обязательные для заполнения, для чего необходимо для каждого поля справа в диалоге при настройке свойств «Validity Checks» (список свойств «Table properties») установить флажок «Required Field»:
- Определите вторичный индекс для таблицы.
Выберите в списке свойств таблицы «Table properties» элемент «Secondary Indexes» и нажмите кнопку «Define…»:
В открывшемся диалоговом окре «Define Secondary Index»”. Щелчком по кнопке со стрелочкой переместите поле GroupName из списка «Fields:» в список «Indexed Fields:». Пометьте поле как «уникальное» (т.е. в разных записях не могут встречаться одинаковые значения этого поля) установкой флажка «Unique»:
- Нажмите кнопку «OK» и в появившемся окне «Save Index As» введите имя вторичного индекса «GroupNameIndex».
- Диалог создания таблицы «Create Paradox 7 Table» должно иметь следующий вид:
- Сохраните таблицу в ранее созданную папку БД («C:\Students») нажатием кнопки «Save as…» под именем «groups.db»:
б) Создайте таблицу БД «Улицы» следующей структуры:
ПолеТипРазмерКлючевое ДополнительноПояснение
IDАвтоинкремент (+ - Autoincrement)даобязательное для заполненияПервичный искусственный ключ – код улицы
StreetNameСтрока (A - Alpha)20обязательное для заполненияНазвание группы

Создайте вторичный индекс по полю StreetName с именем «StreetNameIndex».
Сохраните таблицу под именем «streets.db» в папку с БД («C:\Students»).
в) Создайте таблицу БД «Студенты» следующей структуры:
ПолеТипРазмерКлючевое ДополнительноПояснение
IDАвтоинкремент (+ - Autoincrement)даобязательное для заполненияПервичный искусственный ключ – код студента
SurnameСтрока (A - Alpha)20обязательное для заполненияФамилия
NameСтрока (A - Alpha)20обязательное для заполненияИмя
PatronymicСтрока (A - Alpha)20обязательное для заполненияОтчество
IDGroupДлинное целое (I - Long Integer)обязательное для заполненияКод группы (внешний ключ)
IDStreetДлинное целое (I - Long Integer) обязательное для заполненияКод улицы (внешний ключ)
HouseСтрока (A - Alpha)10обязательное для заполненияДом
FlatКороткое целое (S - Short)Квартира
CommentМемо (M - Memo)240Примечание

Вторичные индексы в данной таблице не создаются.
Сохраните таблицу под именем «students.db» в папку с БД («C:\Students»).
г) Определите связь межу таблицами «Студенты» и «Улицы»:
- Задайте для Database Desktop в качестве рабочей папки, папку с БД – выполните «File – Working Directory…» и выберите папку с БД:
- Откройте таблицу «Студенты» – выполните «File – Open – Table…».
- Перейдите в режим изменения структуры – «Table – Restucture…».
- Выберите в списке свойств таблицы «Table properties» элемент «Referential Integrity» и нажмите кнопку «Define…»:
Откроется диалоговое окно «Referential Integrity»:
- В левом списке (Fields:) выберите поле IDStreet и нажмите со стрелкой вправо.
- В правом списке (Table:) выберите таблицу streets.db и нажмите кнопку со стрелкой вправо влево.
- Нажмите кнопку «ОК» и введите имя созданной связи «StreetLink» в окне «Save Referential Integrity As»:
- Сохраните таблицу нажатием кнопки «Save».
д) Аналогичным образом определите связь межу таблицами «Студенты» и «Группы» по полю IDGroup и таблицей groups.bd:
Сохраните связь под именем «GroupLink».
Получите таблицу «Студенты» со следующими связями:
Сохраните таблицу нажатием кнопки «Save».
3) Зарегистрируйте (создайте псевдоним) БД на данном ПК.
- Запустите BDE Administrator ("C:\Program Files\Common Files\Borland Shared\BDE\bdeadmin.exe"):
- Выполните «Object – New…» - откроется дилог выбора формата БД. Оставьте выбранный тип драйвера «STANDARD», который обеспечивает доступ к БД в формате Paradox:
- Задайте имя БД – псевдоним «Students»:
- на вкладке «Definition» задайте путь к папке с БД в свойстве «PATH»: «C:\Students»:
- Для окончания регистрации псевдонима БД на ПК выполните «Object – Apply». В открывшемся диалоговом окне подтвердите необходимость сохранения изменений в файле конфигурации (кнопка «ОК»). Будет создан псевдоним БД:
4) Создайте папку для приложения БД. Создайте новый проект и сохраните его в созданную папку.
5) Оформите внешний вид главной формы проекта:
- Задайте имя формы Name = frmMain, заголовок Caption = 'Студенты' и положение Position = poScreenCenter.
- Сохраните главную форму («File – Save») и укажите имя модуля (например, uMain.pas).
- Разместите на главной форме хранилище изображений, в котором будут размещаться изображения для действий всего проекта:
НазваниеКомпонентЗначения свойств
Список изображенийImageList (Win32) Name = ilMain
Height = 24
Width = 24


Примечания: Заполняйте хранилище изображений ImageList изображениями для действий по мере их создания в различных формах проекта. Для возможности доступа к хранилищу изображений, необходимо подключать модуль главной формы к формам, в которых желаете использовать хранилище изображений: «File – Use Unit…» (или нажатием Alt+F11) и выберите имя модуля главной формы.
6) Создайте в проекте модуль данных для централизованного хранения компонентов работы с данными.
- Добавьте в проект модуль данных – выполните «File – New – Other – Delphi Files – Data Module».
- Задайте имя модуля, установив свойство Name = dmStudents.
- Разместите на форме модуля данных следующие компоненты и задайте им свойства:
НазваниеКомпонентЗначения свойств
Таблица BDE «Набор данных»TTable (BDE)Name = tblGroups
DatabaseName = ' Students'
TableName = ' groups.db'
Active = True


Таблица BDE «Набор данных»TTable (BDE)Name = tblStreets
DatabaseName = ' Students'
TableName = ' streets.db'
Active = True


Таблица BDE «Набор данных»TTable (BDE)Name = tblStudents
DatabaseName = ' Students'
TableName = ' students.db'
Active = True


«Источник данных»TDataSource (Data Access)Name = dsGroups
DataSet = tblGroups
«Источник данных»TDataSource (Data Access)Name = dsStreets
DataSet = tblStreets
«Источник данных»TDataSource (Data Access)Name = dsStudents
DataSet = tblStudents

- Получим форму модуля данных следующего вида:
- сохраните форму модуля данных («File – Save») и укажите имя модуля (например, uDM.pas).
7) Создайте форму для работы с таблицей (справочником) «Улицы»:
- Добавьте в проект новую форму – выполните «File – New – Other – Delphi Files – Form».
- Задайте имя формы Name = frmStreets, заголовок Caption = 'Улицы' и положение Position = poMainFormCenter.
- Сохраните форму («File – Save») и укажите имя модуля (например, uStreets).
- Подключите модули главной формы (для доступа к хранилищу изображений) и модуля данных (для доступа к наборам и источникам данных) к форме: выполните «File – Use Unit…» (или нажатием Alt+F11) и выберите имена модулей, под которыми их сохраняли (в данной работе: uMain.pas и uDM.pas).
- Разместите на форме следующие компоненты и задайте им свойства:
НазваниеКомпонентЗначения свойств
Менеджер действийActionManager (Additional)Name = amStreets
Images = frmMain.ilMain
Главное меню для действийActionMainMenuBarName = ammStreets
ActionManager = amStreets
Панель инструментов для действий ActionToolBar (Additional)Name = atbStreets
ActionManager = amStreets
ShowHint = True

Контекстное меню для действийPopupActionBar (Additional)Name = pabStreets
Images = frmMain.ilMain
Таблицу БДTDBGrid (Data Controls)Name = dbgStreets
Align = alClient
DataSource = dmStudents.dsStreets
PopupMenu = pabStreets



- Откройте окно менеджера действий ActionManager и добавьте следующие пользовательские действия (Ins):
ДействиеЗначения свойствОбработчик
ВыходName = acClose
Category = 'Файл'
Caption = 'Выход'
Hint = 'Выход'
ImageIndex = иконка
ShortCut = Ctrl+Q




procedure TfrmStreets.acCloseExecute(Sender: TObject);
begin
Close
end;


ДобавитьName = acAppend
Category = 'Действия'
Caption = 'Добавить'
Hint = 'Добавить'
ImageIndex = иконка
ShortCut = Ctrl+A




procedure TfrmStreets.acAppendExecute(Sender: TObject);
begin
dmStudents.tblStreets.Append;
dbgStreets.SetFocus;
end;



УдалитьName = acDelete
Category = 'Действия'
Caption = 'Удалить'
Hint = 'Удалить'
ImageIndex = иконка
ShortCut = Ctrl+D




procedure TfrmStreets.acDeleteExecute(Sender: TObject);
begin
if dmStudents.tblStreets.IsEmpty then
exit;
if Application.MessageBox('Удалить текущую запись?', 'Удаление', MB_YESNO+MB_ICONWARNING)=ID_YES then
dmStudents.tblStreets.Delete;
end;





РедактироватьName = acEdit
Category = 'Действия'
Caption = 'Редактировать'
Hint = 'Редактировать'
ImageIndex = иконка
ShortCut = Ctrl+E




procedure TfrmStreets.acEditExecute(Sender: TObject);
begin
dmStudents.tblStreets.Edit;
dbgStreets.SetFocus;
end;



ОтменитьName = acCancel
Category = 'Действия'
Caption = 'Отменить'
Hint = 'Отменить'
ImageIndex = иконка
ShortCut = Ctrl+Z




procedure TfrmStreets.acCancelExecute(Sender: TObject);
begin
dmStudents.tblStreets.Cancel;
end;


СохранитьName = acSave
Category = 'Действия'
Caption = 'Сохранить'
Hint = 'Сохранить'
ImageIndex = иконка
ShortCut = Ctrl+S




procedure TfrmStreets.acSaveExecute(Sender: TObject);
begin
if dmStudents.tblStreets.Modified then
dmStudents.tblStreets.Post;
end;



ОбновитьName = acRefresh
Category = 'Действия'
Caption = 'Обновить'
Hint = 'Обновить'
ImageIndex = иконка
ShortCut = Ctrl+R




procedure TfrmStreets.acRefreshExecute(Sender: TObject);
begin
dmStudents.tblStreets.Refresh;
end;


СортироватьName = acOrder
AutoCheck = True
Category = 'Действия'
Caption = 'Сортировать'
Hint = 'Сортировать'
ImageIndex = иконка
ShortCut = Ctrl+O





procedure TfrmStreets.acOrderExecute(Sender: TObject);
begin
if acOrder.Checked then
dmStudents.tblStreets.IndexName := 'StreetNameIndex'
else
dmStudents.tblStreets.IndexName := '';
end;





ПерваяName = acFirst
Category = 'Действия'
Caption = 'Первая'
Hint = 'Первая'
ImageIndex = иконка



procedure TfrmStreets.acFirstExecute(Sender: TObject);
begin
dmStudents.tblStreets.First;
end;


ПредыдущаяName = acPrior
Category = 'Действия'
Caption = 'Предыдущая'
Hint = 'Предыдущая'
ImageIndex = иконка



procedure TfrmStreets.acPriorExecute(Sender: TObject);
begin
dmStudents.tblStreets.Prior;
end;


СледующаяName = acNext
Category = 'Действия'
Caption = 'Следующая'
Hint = 'Следующая'
ImageIndex = иконка



procedure TfrmStreets.acNextExecute(Sender: TObject);
begin
dmStudents.tblStreets.Next;
end;


ПоследняяName = acLast
Category = 'Действия'
Caption = 'Последняя'
Hint = 'Последняя'
ImageIndex = иконка



procedure TfrmStreets.acLastExecute(Sender: TObject);
begin
dmStudents.tblStreets.Last;
end;



Примечание: Сортировать таблицу БД можно только по тем полям, для которых создан индекс. Первичный индекс автоматически создается для ключевого поля и таблица по умолчанию сортируется именно по этому полю. Если требуется другой порядок отображения записей, то для этого нужно свойству IndexName таблицы присвоить имя вторичного индекса.
- Откройте двойным щелчком контекстное меню действия PopupActionBar (или через пункт контекстного меню «Menu Designer…») и настройте контекстное меню путем выбора для пунктов соответствующих действий в свойстве Action.
- Оформите форму следующим образом:
Примечание: Работа с записями справочника «Улицы» осуществляется напрямую через компонент набора данных, расположенный в модуле данных – dmStudents.tblStreets. Можно было бы организовать доступ набору данных: через источник данных – dmStudents.dsStreets.DataSet; или через компонент, отображающий данные, таблицу DBGrid – dbgStreets.DataSource.DataSet.
8) Аналогичным образом создайте форму для работы с таблицей (справочником) «Группы».
- Добавьте в проект новую форму – выполните «File – New – Other – Delphi Files – Form».
- Задайте имя формы Name = frmGroups, заголовок Caption = 'Группы' и положение Position = poMainFormCenter.
- Сохраните форму («File – Save») и укажите имя модуля (например, uGroups).
- Подключите модули главной формы (для доступа к хранилищу изображений) и модуля данных (для доступа к наборам и источникам данных) к форме: выполните «File – Use Unit…» (или нажатием Alt+F11) и выберите имена модулей, под которыми их сохраняли (в данной работе: uMain.pas и uDM.pas).
- Разместите на форме следующие компоненты и задайте им свойства:
НазваниеКомпонентЗначения свойств
Менеджер действийActionManager (Additional)Name = amGroups
Images = frmMain.ilMain
Главное меню для действийActionMainMenuBarName = ammGroups
ActionManager = amGroups
Панель инструментов для действий ActionToolBar (Additional)Name = atbGroups
ActionManager = amGroups
ShowHint = True

Контекстное меню для действийPopupActionBar (Additional)Name = pabGroups
Images = frmMain.ilMain
Таблицу БДTDBGrid (Data Controls)Name = dbgGroups
Align = alClient
DataSource = dmStudents.dsGroups
PopupMenu = pabGroups



- Откройте окно менеджера действий ActionManager и добавьте следующие пользовательские действия (Ins):
ДействиеЗначения свойствОбработчик
ВыходName = acClose
Category = 'Файл'
Caption = 'Выход'
Hint = 'Выход'
ImageIndex = иконка
ShortCut = Ctrl+Q




procedure TfrmGroups.acCloseExecute(Sender: TObject);
begin
Close
end;


ДобавитьName = acAppend
Category = 'Действия'
Caption = 'Добавить'
Hint = 'Добавить'
ImageIndex = иконка
ShortCut = Ctrl+A




procedure TfrmGroups.acAppendExecute(Sender: TObject);
begin
dmStudents.dsGroups.DataSet.Append;
dbgGroups.SetFocus;
end;



УдалитьName = acDelete
Category = 'Действия'
Caption = 'Удалить'
Hint = 'Удалить'
ImageIndex = иконка
ShortCut = Ctrl+D




procedure TfrmGroups.acDeleteExecute(Sender: TObject);
begin
if dmStudents.dsGroups.DataSet.IsEmpty then
exit;
if Application.MessageBox('Удалить текущую запись?', 'Удаление', MB_YESNO+MB_ICONWARNING)=ID_YES then
dmStudents.dsGroups.DataSet.Delete;
end;





РедактироватьName = acEdit
Category = 'Действия'
Caption = 'Редактировать'
Hint = 'Редактировать'
ImageIndex = иконка
ShortCut = Ctrl+E




procedure TfrmGroups.acEditExecute(Sender: TObject);
begin
dmStudents.dsGroups.DataSet.Edit;
dbgGroups.SetFocus;
end;



ОтменитьName = acCancel
Category = 'Действия'
Caption = 'Отменить'
Hint = 'Отменить'
ImageIndex = иконка
ShortCut = Ctrl+Z




procedure TfrmGroups.acCancelExecute(Sender: TObject);
begin
dmStudents.dsGroups.DataSet.Cancel;
end;


СохранитьName = acSave
Category = 'Действия'
Caption = 'Сохранить'
Hint = 'Сохранить'
ImageIndex = иконка
ShortCut = Ctrl+S




procedure TfrmGroups.acSaveExecute(Sender: TObject);
begin
if dmStudents.dsGroups.DataSet.Modified then
dmStudents.dsGroups.DataSet.Post;
end;



ОбновитьName = acRefresh
Category = 'Действия'
Caption = 'Обновить'
Hint = 'Обновить'
ImageIndex = иконка
ShortCut = Ctrl+R




procedure TfrmGroups.acRefreshExecute(Sender: TObject);
begin
dmStudents.dsGroups.DataSet.Refresh;
end;


ПерваяName = acFirst
Category = 'Действия'
Caption = 'Первая'
Hint = 'Первая'
ImageIndex = иконка



procedure TfrmGroups.acFirstExecute(Sender: TObject);
begin
dmStudents.dsGroups.DataSet.First;
end;


ПредыдущаяName = acPrior
Category = 'Действия'
Caption = 'Предыдущая'
Hint = 'Предыдущая'
ImageIndex = иконка



procedure TfrmGroups.acPriorExecute(Sender: TObject);
begin
dmStudents.dsGroups.DataSet.Prior;
end;


СледующаяName = acNext
Category = 'Действия'
Caption = 'Следующая'
Hint = 'Следующая'
ImageIndex = иконка



procedure TfrmGroups.acNextExecute(Sender: TObject);
begin
dmStudents.dsGroups.DataSet.Next;
end;


ПоследняяName = acLast
Category = 'Действия'
Caption = 'Последняя'
Hint = 'Последняя'
ImageIndex = иконка



procedure TfrmGroups.acLastExecute(Sender: TObject);
begin
dmStudents.dsGroups.DataSet.Last;
end;



- Откройте двойным щелчком контекстное меню действия PopupActionBar (или через пункт контекстного меню «Menu Designer…») и настройте контекстное меню путем выбора для пунктов соответствующих действий в свойстве Action.
- Оформите форму следующим образом:
9) Реализуйте функционал работы с главной формой, на которой будет выполняться работа с таблицей «Студенты».
- Подключите модули форм справочников (для открытия их из главной формы) и модуль данных (для доступа к наборам и источникам данных) к форме: выполните «File – Use Unit…» (или нажатием Alt+F11) и выберите имена модулей (в данной работе – uDM.pas, uStreets и uGroups).
- Разместите на форме следующие компоненты и задайте им свойства:
НазваниеКомпонентЗначения свойств
Менеджер действийActionManager (Additional)Name = amMain
Images = ilMain
Главное меню для действийActionMainMenuBarName = ammMain
ActionManager = amMain
Панель инструментов для действий ActionToolBar (Additional)Name = atbMain
ActionManager = amMain
ShowHint = True

Контекстное меню для действийPopupActionBar (Additional)Name = pabMain
Images = ilMain
Таблицу БДTDBGrid (Data Controls)Name = dbgStudents
Align = alClient
DataSource = dmStudents.dsStudents
PopupMenu = pabGroups


Поле Memo БДTDBMemo (Data Controls)Name = dbmComment
Align = alRight
DataSource = dmStudents.dsStudents
DataField = Comment


Разделитель компонентовTSplitter (Additional)Name = splMain
Align = alRight
ПанельTPanel (Standard)Name = pnlMain
Align = alBottom
Caption = ''

Поле ввода с надписью (на панель)TLabeledEdit (Additional)Name = ledSearch
EditLabel.Caption = 'Поиск по фамилии:'
Поле ввода с надписью (на панель)TLabeledEdit (Additional)Name = ledFilter
Anchors = [akTop, akRight]
EditLabel.Caption = ' Отбор по фамилии:'


- Откройте окно менеджера действий ActionManager и добавьте следующие пользовательские действия (Ins):
ДействиеЗначения свойствОбработчик
ВыходName = acClose
Category = 'Файл'
Caption = 'Выход'
Hint = 'Выход'
ImageIndex = иконка
ShortCut = Ctrl+Q




procedure TfrmMain.acCloseExecute(Sender: TObject);
begin
Close;
end;


ДобавитьName = acAppend
Category = 'Действия'
Caption = 'Добавить'
Hint = 'Добавить'
ImageIndex = иконка
ShortCut = Ctrl+A




procedure TfrmMain.acAppendExecute(Sender: TObject);
begin
dmStudents.dsStudents.DataSet.Append;
dbgStudents.SetFocus;
end;



УдалитьName = acDelete
Category = 'Действия'
Caption = 'Удалить'
Hint = 'Удалить'
ImageIndex = иконка
ShortCut = Ctrl+D




procedure TfrmMain.acDeleteExecute(Sender: TObject);
begin
if dmStudents.dsStudents.DataSet.RecordCount=0 then
exit;
if Application.MessageBox('Удалить текущую запись?', 'Удаление', MB_YESNO+MB_ICONWARNING)=ID_YES then
dmStudents.dsStudents.DataSet.Delete;
end;





РедактироватьName = acEdit
Category = 'Действия'
Caption = 'Редактировать'
Hint = 'Редактировать'
ImageIndex = иконка
ShortCut = Ctrl+E




procedure TfrmMain.acEditExecute(Sender: TObject);
begin
dmStudents.dsStudents.DataSet.Edit;
dbgStudents.SetFocus;
end;



ОтменитьName = acCancel
Category = 'Действия'
Caption = 'Отменить'
Hint = 'Отменить'
ImageIndex = иконка
ShortCut = Ctrl+Z




procedure TfrmMain.acCancelExecute(Sender: TObject);
begin
dmStudents.dsStudents.DataSet.Cancel;
end;


СохранитьName = acSave
Category = 'Действия'
Caption = 'Сохранить'
Hint = 'Сохранить'
ImageIndex = иконка
ShortCut = Ctrl+S




procedure TfrmMain.acSaveExecute(Sender: TObject);
begin
if dmStudents.dsStudents.DataSet.Modified then
dmStudents.dsStudents.DataSet.Post;
dmStudents.dsStudents.DataSet.Post;
end;




ОбновитьName = acRefresh
Category = 'Действия'
Caption = 'Обновить'
Hint = 'Обновить'
ImageIndex = иконка
ShortCut = Ctrl+R




procedure TfrmMain.acRefreshExecute(Sender: TObject);
begin
dmStudents.dsStudents.DataSet.Refresh;
end;


ПерваяName = acFirst
Category = 'Данные'
Caption = 'Первая'
Hint = 'Первая'
ImageIndex = иконка



procedure TfrmMain.acFirstExecute(Sender: TObject);
begin
dmStudents.dsStudents.DataSet.First;
end;


ПредыдущаяName = acPrior
Category = 'Данные'
Caption = 'Предыдущая'
Hint = 'Предыдущая'
ImageIndex = иконка



procedure TfrmMain.acPriorExecute(Sender: TObject);
begin
dmStudents.dsStudents.DataSet.Prior;
end;


СледующаяName = acNext
Category = 'Данные'
Caption = 'Следующая'
Hint = 'Следующая'
ImageIndex = иконка



procedure TfrmMain.acNextExecute(Sender: TObject);
begin
dmStudents.dsStudents.DataSet.Next;
end;


ПоследняяName = acLast
Category = 'Данные'
Caption = 'Последняя'
Hint = 'Последняя'
ImageIndex = иконка



procedure TfrmMain.acLastExecute(Sender: TObject);
begin
dmStudents.dsStudents.DataSet.Last;
end;


УлицыName = acStreets
Category = 'Справочники'
Caption = 'Улицы'
Hint = 'Улицы'
ImageIndex = иконка
ShortCut = F2




procedure TfrmMain.acStreetsExecute(Sender: TObject);
begin
frmStreets.ShowModal;
end;


ГруппыName = acGroups
Category = 'Справочники'
Caption = 'Группы'
Hint = 'Группы'
ImageIndex = иконка
ShortCut = F3




procedure TfrmMain.acGroupsExecute(Sender: TObject);
begin
frmGroups.ShowModal;
end;


О программе...Name = acAbout
Category = 'Справочники'
Caption = 'О программе...'
Hint = 'О программе...'
ImageIndex = иконка
ShortCut = F1




procedure TfrmMain.aAboutExecute(Sender: TObject);
begin
Application.MessageBox('Автор: Баночкин Ф.Б.', 'БД "Студенты"', MB_OK+MB_ICONINFORMATION);
end;



- Откройте двойным щелчком контекстное меню действия PopupActionBar (или через пункт контекстного меню «Menu Designer…») и настройте контекстное меню путем выбора для пунктов соответствующих действий в свойстве Action.
- Задайте обработчик события OnChange для поля ввода с надписью, используемого для поиска:
procedure TfrmMain.ledSearchChange(Sender: TObject);
begin
dmStudents.dsStudents.DataSet.Locate('Surname',ledSearch.Text,[]);
end;
- Задайте обработчик события OnChange для поля ввода с надписью, используемого для отбора (фильтрации):
procedure TfrmMain.ledFilterChange(Sender: TObject);
begin
if ledFilter.Text='' then
dmStudents.dsStudents.DataSet.Filtered := False
else
begin
dmStudents.dsStudents.DataSet.FilterOptions := [];
dmStudents.dsStudents.DataSet.Filter := 'Surname='+QuotedStr(ledFilter.Text+'*');
dmStudents.dsStudents.DataSet.Filtered := True;
end;
end;
- Оформите форму следующим образом:
10) Настройка полей таблицы «Группы»:
- В модуле данных выполните двойной щелчок по компоненту tblGroups или в контекстном меню выполните «Fields Editor..» – откроется редактор полей таблицы.
- Добавьте все поля физической таблицы – нажмите правой кнопку мыши в окне редактора полей и выполните «Add all Fields» (Ctrl+F).
- Задайте свойства полям таблицы:
ПолеЗначения свойств
IDVisible = False
GroupNameDisplayLabel = 'Группа'

11) Настройка полей таблицы «Улицы»:
- В модуле данных выполните двойной щелчок по компоненту tblStreets или в контекстном меню выполните «Fields Editor..» – откроется редактор полей таблицы.
- Добавьте все поля физической таблицы – нажмите правой кнопку мыши в окне редактора полей и выполните «Add all fields» (Ctrl+F).
- Задайте свойства полям таблицы:
ПолеЗначения свойств
IDVisible = False
StreetNameDisplayLabel = 'Улица'

12) Настройка полей таблицы «Студенты»:
- В модуле данных выполните двойной щелчок по компоненту tblStreets или в контекстном меню выполните «Fields Editor..» – откроется редактор полей таблицы.
- Добавьте все поля физической таблицы – нажмите правой кнопку мыши в окне редактора полей и выполните «Add all fields» (Ctrl+F).
- Задайте свойства полям таблицы:
ПолеЗначения свойств
IDVisible = False
SurnameDisplayLabel = 'Фамилия'
DisplayWidth = 15
NameDisplayLabel = 'Имя'
DisplayWidth = 10
PatronymicDisplayLabel = 'Отчество'
DisplayWidth = 15
IDGroupVisible = False
IDStreetVisible = False
HouseDisplayLabel = 'Дом'
DisplayWidth = 4
FlatDisplayLabel = 'Квартира'
DisplayWidth = 4
CommentVisible = False

- Создайте поле подстановки для выбора группы – нажмите правой кнопку мыши в окне редактора полей и выполните «New field…» (Ctrl+N).
В диалоге создания нового поля установите следующие значения: Name = Group, Type = String, Field type = Lookup (поле подстановки), Key Fields = IDGroup, Dataset = tblGroups, Lookup Keys = ID, Result Field = GroupName.
Буквально это значит следующее: в поле Group таблицы tblStudents будет подставляться значение поля GroupName (Result Field) из таблицы tblGroups (Dataset), причем значение будет браться из той записи в таблице tblGroups, для которой tblStudents.IDGroup (Key Fields) = tblGroups.ID (Lookup Keys).
- Создайте поле подстановки для выбора улицы – нажмите правой кнопку мыши в окне редактора полей и выполните «New field…» (Ctrl+N).
В диалоге создания нового поля установите следующие значения: Name = Street, Type = String, Field type = Lookup (поле подстановки), Key Fields = IDStreet, Dataset = tblStreets, Lookup Keys = ID, Result Field = StreetName.
- Создайте вычисляемое поле для получения адреса одной строкой – нажмите правой кнопку мыши в окне редактора полей и выполните «New field…» (Ctrl+N).
В диалоге создания нового поля установите следующие значения: Name = Address, Type = String, Field type = Calculated (вычисляемое).
- Расположите поля в указанном на рисунке порядке перетаскиванием
- Задайте свойства новым полям таблицы:
ПолеЗначения свойств
GroupDisplayLabel = 'Группа'
DisplayWidth = 10
StreetDisplayLabel = 'Улица'
DisplayWidth = 10
AddressDisplayLabel = 'Адрес'
DisplayWidth = 20

- Для задания алгоритма вычисления значения вычисляемого поля создайте обработчик события OnCalcFields компонента tblStudents:
procedure TdmStudents.tblStudentsCalcFields(DataSet: TDataSet);
begin
if tblStudentsFlat.IsNull then
tblStudentsAddress.AsString := tblStudentsStreet.AsString +
' ' + tblStudentsHouse.AsString
else
tblStudentsAddress.AsString := tblStudentsStreet.AsString +
' ' + tblStudentsHouse.AsString + '-' + tblStudentsFlat.AsString;
end;
13) Сохраните проект и запустите программу на исполнение.
14) Организация вывода отчетов.
- Откройте окно менеджера действий ActionManager и добавьте следующие пользовательские действия (Ins):
ДействиеЗначения свойствОбработчик
Отчет в WordName = acWord
Category = 'Данные'
Caption = 'Отчет в Word'
Hint = 'Отчет в Word'
ImageIndex = иконка
ShortCut = F5




Отчет в ExcelName = acExcel
Category = 'Данные'
Caption = 'Отчет в Excel'
Hint = Отчет в Excel'
ImageIndex = иконка
ShortCut = F6




Отчет в HTMLName = acHTML
Category = 'Данные'
Caption = 'Отчет в HTML'
Hint = 'Отчет в HTML'
ImageIndex = иконка
ShortCut = F7





- Подключите модули в интерфейсной части модуля для работы с: набором данных (DB); с серверами автоматизации и OLE-объектами (WordXP, ExcelXP, ComObj); API-функциями (ShellApi).
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, ExtCtrls, Grids, DBGrids, ActnCtrls, Menus, ActnPopup,
ToolWin, ActnMan, ActnMenus, XPStyleActnCtrls, ActnList, StdCtrls, DBCtrls,
DB, ComObj, WordXP, ExcelXP, ShellApi;
- Создайте обработчик действия «Отчет в Word»:
procedure TfrmMain.acWordExecute(Sender: TObject);
var
wdApp : OleVariant; // переменная для работы с сервером MS Word
ds: TDataSet; // переменная - набор данных
bm: TBookMark; // переменная - закладка
begin
Screen.Cursor := crHourGlass;
ds := dmStudents.dsStudents.DataSet; // ds - набор данных
bm := ds.GetBookmark; // запоминаем закладку
ds.DisableControls; // отключить обновление элементов, связанных с таблицей
try // Обработка исключения - возможной ошибки при работе с сервером
wdApp := CreateOleObject('Word.Application'); // Соединяемся с сервером TWordApplication
wdApp.Documents.Add; // Создать новый документ
// Формируем заголовок
wdApp.Selection.Move(wdSection,1); // сместиться на 1 секцию
wdApp.Selection.TypeParagraph; // вывести новый параграф
wdApp.Selection.Font.Size := 14; // установить размер шрифта
wdApp.Selection.Font.Bold := True; // установить плотность шрифта
wdApp.Selection.Font.Italic := True; // установить наклон шрифта
wdApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter; // выравнивание
wdApp.Selection.TypeText('Студенты'); // вывод
wdApp.Selection.TypeParagraph; // вывести новый параграф
wdApp.Selection.Font.Size := 10; // установить размер шрифта
wdApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphLeft;
wdApp.Selection.Font.Bold := False; // установить плотность шрифта
wdApp.Selection.Font.Italic := False; // установить наклон шрифта
// Формируем шапку таблицы
wdApp.ActiveDocument.Tables.Add(wdApp.Selection.Range,2,4,wdWord9TableBehavior); // добавить таблицу
// wdWord9TableBehavior – размер ячеек по содержанию (AutoFit)
wdApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter;
wdApp.Selection.Font.Bold := True;
wdApp.Selection.Font.Italic := True;
wdApp.Selection.TypeText('№'); // вывод
wdApp.Selection.Cells.SetWidth(40,wdAdjustProportional); // ширина колонки
// wdAdjustProportional – ширина за счет других столбцов
wdApp.Selection.MoveRight(wdCell,1); // переход на 1 ячейку вправо
wdApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter;
wdApp.Selection.Font.Bold := True;
wdApp.Selection.Font.Italic := True;
wdApp.Selection.TypeText(ds.FieldByName('Surname').DisplayLabel+' '+
ds.FieldByName('Name').DisplayLabel+' '+
ds.FieldByName('Patronymic').DisplayLabel);
wdApp.Selection.Cells.SetWidth(170,wdAdjustProportional);
wdApp.Selection.MoveRight(wdCell,1);
wdApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter;
wdApp.Selection.Font.Bold := True;
wdApp.Selection.Font.Italic := True;
wdApp.Selection.TypeText(ds.FieldByName('Group').DisplayLabel);
wdApp.Selection.Cells.SetWidth(110,wdAdjustProportional);
wdApp.Selection.MoveRight(wdCell,1);
wdApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter;
wdApp.Selection.Font.Bold := True;
wdApp.Selection.Font.Italic := True;
wdApp.Selection.TypeText(ds.FieldByName('Address').DisplayLabel);
wdApp.Selection.Cells.SetWidth(170,wdAdjustProportional);
wdApp.Selection.MoveRight(wdCell,1);
// Формируем содержимое таблицы
ds.First; // на первую записьнабора данных
while not ds.Eof do // пока не последняя запись набора данных
begin
wdApp.Selection.TypeText(IntToStr(ds.RecNo));
wdApp.Selection.MoveRight(wdCell,1);
wdApp.Selection.TypeText(ds.FieldByName('Surname').AsString+' '+
ds.FieldByName('Name').AsString+' '+
ds.FieldByName('Patronymic').AsString);
wdApp.Selection.MoveRight(wdCell,1);
wdApp.Selection.TypeText(ds.FieldByName('Group').AsString);
wdApp.Selection.MoveRight(wdCell,1);
wdApp.Selection.TypeText(ds.FieldByName('Address').AsString);
wdApp.Selection.MoveRight(wdCell,1);
ds.Next; // на следующую запись набора данных
end;
wdApp.Selection.HomeKey(wdStory); // переход в начало документа
wdApp.Visible := true; // Отобразить Word
except
Application.MessageBox('Ошибка выполнения операций с Word.', 'Ошибка', MB_OK+MB_ICONERROR);
wdApp.Quit; // закрыть Word
end;
ds.GotoBookmark(bm); // Восстанавливаем текущую запись
ds.EnableControls; // Включаем обновление элементов, связанных с таблицей
Screen.Cursor := crDefault;
end;
- Создайте обработчик действия «Отчет в Excel»:
procedure TfrmMain.acExcelExecute(Sender: TObject);
var
xlsApp : OleVariant; // переменная - для работы с сервером MS Excel
ds: TDataSet; // переменная - набор данных
bm: TBookMark; // переменная - закладка
n, m, i, j : integer;
c : char;
begin
Screen.Cursor := crHourGlass;
ds := dmStudents.dsStudents.DataSet; // ds - набор данных
bm := ds.GetBookmark; // запоминаем закладку
ds.DisableControls; // отключить обновление элементов, связанных с таблицей
try // Обработка исключения - возможной ошибки при работе с сервером
xlsApp := CreateOleObject('Excel.Application'); // Соединяемся с сервером TExcelApplication
xlsApp.Application.Workbooks.Add; // добавить WorkBooks в ExcelApplication
xlsApp.Application.Worksheets.Item[1].Name := 'Студенты'; // имя листа
n := ds.RecordCount; // Количество записей
m := ds.FieldCount; // Количество полей
c := 'A';
// Оформляем шапку таблицы
for j := 0 to m-1 do
if ds.Fields[j].Visible then
begin
xlsApp.Application.Worksheets.Item[1].Range[c+'3',c+'3'].Font.Size := 8;
xlsApp.Application.Worksheets.Item[1].Range[c+'3',c+'3'].Font.Bold := True;
xlsApp.Application.Worksheets.Item[1].Range[c+'3',c+'3'].HorizontalAlignment := xlCenter;
xlsApp.Application.Worksheets.Item[1].Range[c+'3',c+'3'].Value2 :=
ds.Fields[j].DisplayLabel;
inc(c);
end;
// Проходим по ячейкам таблицы - заполняем таблицу
ds.First;
for i := 0 to n-1 do
begin
c := 'A';
for j := 0 to m-1 do
if ds.Fields[j].Visible then
begin
xlsApp.Application.Worksheets.Item[1].Range[c+IntToStr(4+i),c+IntToStr(4+i)].Font.Size := 8;
xlsApp.Application.Worksheets.Item[1].Range[c+IntToStr(4+i),c+IntToStr(4+i)].Value2 :=
''''+ds.Fields[j].AsString;
inc(c);
end;
ds.Next;
end;
// Устанавливаем ширину колонок по содержимому
xlsApp.Application.Worksheets.Item[1].Range['A:Z'].EntireColumn.AutoFit;
// Формируем заголовок
xlsApp.Application.Worksheets.Item[1].Range['A1','A1'].Font.Size := 14;
xlsApp.Application.Worksheets.Item[1].Range['A1','A1'].Font.Bold := True;
xlsApp.Application.Worksheets.Item[1].Range['A1','A1'].Value2 :=
'Студенты';
xlsApp.Visible := true; // Отображаем Excel
except
Application.MessageBox('Ошибка выполнения операций с MS Excel.', 'Ошибка', MB_OK+MB_ICONERROR);
xlsApp.Quit; // Закрываем сервер
end;
ds.GotoBookmark(bm); // Восстанавливаем текущую запись
ds.EnableControls; // Включаем обновление элементов, связанных с таблицей
Screen.Cursor := crDefault;
end;
- Создайте обработчик действия «Отчет в HTML»:
procedure TfrmMain.acHTMLExecute(Sender: TObject);
var
HTMLfile: TextFile;
ds: TDataSet;
bm: TBookMark;
FileName, Title: string;
i,j, n, m: LongInt;
begin
Screen.Cursor := crHourGlass;
Title := 'Студенты';
FileName := ChangeFileExt(Application.ExeName, '.html');
ds := dmStudents.dsStudents.DataSet; // ds - набор данных
bm := ds.GetBookmark; // запоминаем закладку
ds.DisableControls; // отключить обновление элементов, связанных с таблицей
n := ds.RecordCount-1; // Количество записей
m := ds.FieldCount-1; // Количество полей
AssignFile(HTMLfile, FileName);
Rewrite(HTMLfile);
// Заголовок html-файла
WriteLn(HTMLfile,'<html>');
WriteLn(HTMLfile,'<head>');
WriteLn(HTMLfile,'<title>'+Title+'</title>');
WriteLn(HTMLfile,'</head>');
// Тело html-файла
WriteLn(HTMLfile,'<body>');
WriteLn(HTMLfile,'<h2 align="center">'+Title+'</h2>');
WriteLn(HTMLfile,'<table align="center" border="1">');
WriteLn(HTMLfile,' <tr align="center">');
Write(HTMLfile,' <th>№</th>');
for j := 0 to m do
begin
if not ds.Fields.Fields[j].Visible then
Continue;
WriteLn(HTMLfile,' <th>'+ds.Fields.Fields[j].DisplayLabel+'</th>');
end;
WriteLn(HTMLfile,' </tr>');
// Вывод данных
ds.First;
for i := 0 to n do
begin
WriteLn(HTMLfile,' <tr>');
WriteLn(HTMLfile,' <td align="right">'+IntToStr(i+1)+'</td>');
for j := 0 to m do
begin
if not ds.Fields.Fields[j].Visible then
Continue;
if ds.Fields[j].IsNull then
WriteLn(HTMLfile,' <td>&nbsp;</td>')
else
WriteLn(HTMLfile,' <td>'+ds.Fields[j].AsString+'</td>');
end;
WriteLn(HTMLfile,' </tr>');
ds.Next;
end;
WriteLn(HTMLfile,'</table>');
WriteLn(HTMLfile,'<p align="right">'+DateToStr(Date)+'</p>');
WriteLn(HTMLfile,'</body>');
WriteLn(HTMLfile,'</html>');
CloseFile(HTMLfile);
ds.GotoBookmark(Bm); // Возвращаемся на закладку
ds.EnableControls; // Включаем обновление элементов, связанных с таблицей
// Открыть в браузере
ShellExecute(Handle,'open',PChar(FileName),nil,nil, SW_RESTORE);
Screen.Cursor := crDefault
end;
- Разместите добавленные действия в меню и на панели инструментов.
15) Сохраните проект и запустите программу на исполнение.

Комментариев нет:

Отправить комментарий