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».
- В диалоге задайте следующую структуру таблицы:
Для выбора типа поля щелкните в колонке 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»:
б) Создайте таблицу БД «Улицы» следующей структуры:
Создайте вторичный индекс по полю StreetName с именем «StreetNameIndex».
Сохраните таблицу под именем «streets.db» в папку с БД («C:\Students»).
в) Создайте таблицу БД «Студенты» следующей структуры:
Вторичные индексы в данной таблице не создаются.
Сохраните таблицу под именем «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 изображениями для действий по мере их создания в различных формах проекта. Для возможности доступа к хранилищу изображений, необходимо подключать модуль главной формы к формам, в которых желаете использовать хранилище изображений: «File – Use Unit…» (или нажатием Alt+F11) и выберите имя модуля главной формы.
6) Создайте в проекте модуль данных для централизованного хранения компонентов работы с данными.
- Добавьте в проект модуль данных – выполните «File – New – Other – Delphi Files – Data Module».
- Задайте имя модуля, установив свойство Name = dmStudents.
- Разместите на форме модуля данных следующие компоненты и задайте им свойства:
- Получим форму модуля данных следующего вида:
- сохраните форму модуля данных («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 и добавьте следующие пользовательские действия (Ins):
Примечание: Сортировать таблицу БД можно только по тем полям, для которых создан индекс. Первичный индекс автоматически создается для ключевого поля и таблица по умолчанию сортируется именно по этому полю. Если требуется другой порядок отображения записей, то для этого нужно свойству 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 и добавьте следующие пользовательские действия (Ins):
- Откройте двойным щелчком контекстное меню действия PopupActionBar (или через пункт контекстного меню «Menu Designer…») и настройте контекстное меню путем выбора для пунктов соответствующих действий в свойстве Action.
- Оформите форму следующим образом:
9) Реализуйте функционал работы с главной формой, на которой будет выполняться работа с таблицей «Студенты».
- Подключите модули форм справочников (для открытия их из главной формы) и модуль данных (для доступа к наборам и источникам данных) к форме: выполните «File – Use Unit…» (или нажатием Alt+F11) и выберите имена модулей (в данной работе – uDM.pas, uStreets и uGroups).
- Разместите на форме следующие компоненты и задайте им свойства:
- Откройте окно менеджера действий ActionManager и добавьте следующие пользовательские действия (Ins):
- Откройте двойным щелчком контекстное меню действия 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).
- Задайте свойства полям таблицы:
11) Настройка полей таблицы «Улицы»:
- В модуле данных выполните двойной щелчок по компоненту tblStreets или в контекстном меню выполните «Fields Editor..» – откроется редактор полей таблицы.
- Добавьте все поля физической таблицы – нажмите правой кнопку мыши в окне редактора полей и выполните «Add all fields» (Ctrl+F).
- Задайте свойства полям таблицы:
12) Настройка полей таблицы «Студенты»:
- В модуле данных выполните двойной щелчок по компоненту tblStreets или в контекстном меню выполните «Fields Editor..» – откроется редактор полей таблицы.
- Добавьте все поля физической таблицы – нажмите правой кнопку мыши в окне редактора полей и выполните «Add all fields» (Ctrl+F).
- Задайте свойства полям таблицы:
- Создайте поле подстановки для выбора группы – нажмите правой кнопку мыши в окне редактора полей и выполните «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 (вычисляемое).
- Расположите поля в указанном на рисунке порядке перетаскиванием
- Задайте свойства новым полям таблицы:
- Для задания алгоритма вычисления значения вычисляемого поля создайте обработчик события 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):
- Подключите модули в интерфейсной части модуля для работы с: набором данных (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> </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) Сохраните проект и запустите программу на исполнение.
1) Создайте папку под файлы БД: "C:\Students".
2) Создайте БД. Модель данных:
а) Создайте таблицу БД «Группы»:
- выполните «File – New – Table…». В диалоге «Create Table» выберите формат «Paradox»:
- В диалоге задайте следующую структуру таблицы:
Поле | Тип | Размер | Ключевое | Дополнительно | Пояснение |
ID | Автоинкремент (+ - Autoincrement) | да | обязательное для заполнения | Первичный искусственный ключ – код группы | |
GroupName | Строка (A - Alpha) | 10 | обязательное для заполнения | Название группы |
Для выбора типа поля щелкните в колонке Type правой кнопкой мыши или нажмите клавишу «Пробел», затем выберите необходимый тип из появившегося списка.
Чтобы сделать поле ключевым, в столбце Key нажмите любую клавишу, например «Пробел».
Оба поля необходимо пометить как обязательные для заполнения, для чего необходимо для каждого поля справа в диалоге при настройке свойств «Validity Checks» (список свойств «Table properties») установить флажок «Required Field»:
Выберите в списке свойств таблицы «Table properties» элемент «Secondary Indexes» и нажмите кнопку «Define…»:
Поле | Тип | Размер | Ключевое | Дополнительно | Пояснение |
ID | Автоинкремент (+ - Autoincrement) | да | обязательное для заполнения | Первичный искусственный ключ – код улицы | |
StreetName | Строка (A - Alpha) | 20 | обязательное для заполнения | Название группы |
Создайте вторичный индекс по полю StreetName с именем «StreetNameIndex».
в) Создайте таблицу БД «Студенты» следующей структуры:
Поле | Тип | Размер | Ключевое | Дополнительно | Пояснение |
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 | Примечание |
Вторичные индексы в данной таблице не создаются.
г) Определите связь межу таблицами «Студенты» и «Улицы»:
- Задайте для Database Desktop в качестве рабочей папки, папку с БД – выполните «File – Working Directory…» и выберите папку с БД:
- Перейдите в режим изменения структуры – «Table – Restucture…».
- Выберите в списке свойств таблицы «Table properties» элемент «Referential Integrity» и нажмите кнопку «Define…»:
- В правом списке (Table:) выберите таблицу streets.db и нажмите кнопку со стрелкой вправо влево.
д) Аналогичным образом определите связь межу таблицами «Студенты» и «Группы» по полю IDGroup и таблицей groups.bd:
Получите таблицу «Студенты» со следующими связями:
3) Зарегистрируйте (создайте псевдоним) БД на данном ПК.
- Запустите BDE Administrator ("C:\Program Files\Common Files\Borland Shared\BDE\bdeadmin.exe"):
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 |
- Получим форму модуля данных следующего вида:
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 |
Главное меню для действий | ActionMainMenuBar | Name = 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.
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 |
Главное меню для действий | ActionMainMenuBar | Name = 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.
- Подключите модули форм справочников (для открытия их из главной формы) и модуль данных (для доступа к наборам и источникам данных) к форме: выполните «File – Use Unit…» (или нажатием Alt+F11) и выберите имена модулей (в данной работе – uDM.pas, uStreets и uGroups).
- Разместите на форме следующие компоненты и задайте им свойства:
Название | Компонент | Значения свойств |
Менеджер действий | ActionManager (Additional) | Name = amMain Images = ilMain |
Главное меню для действий | ActionMainMenuBar | Name = 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.
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;
- Оформите форму следующим образом:
- В модуле данных выполните двойной щелчок по компоненту tblGroups или в контекстном меню выполните «Fields Editor..» – откроется редактор полей таблицы.
- Добавьте все поля физической таблицы – нажмите правой кнопку мыши в окне редактора полей и выполните «Add all Fields» (Ctrl+F).
Поле | Значения свойств |
ID | Visible = False |
GroupName | DisplayLabel = 'Группа' |
11) Настройка полей таблицы «Улицы»:
- В модуле данных выполните двойной щелчок по компоненту tblStreets или в контекстном меню выполните «Fields Editor..» – откроется редактор полей таблицы.
- Добавьте все поля физической таблицы – нажмите правой кнопку мыши в окне редактора полей и выполните «Add all fields» (Ctrl+F).
Поле | Значения свойств |
ID | Visible = False |
StreetName | DisplayLabel = 'Улица' |
12) Настройка полей таблицы «Студенты»:
- В модуле данных выполните двойной щелчок по компоненту tblStreets или в контекстном меню выполните «Fields Editor..» – откроется редактор полей таблицы.
- Добавьте все поля физической таблицы – нажмите правой кнопку мыши в окне редактора полей и выполните «Add all fields» (Ctrl+F).
Поле | Значения свойств |
ID | Visible = False |
Surname | DisplayLabel = 'Фамилия' DisplayWidth = 15 |
Name | DisplayLabel = 'Имя' DisplayWidth = 10 |
Patronymic | DisplayLabel = 'Отчество' DisplayWidth = 15 |
IDGroup | Visible = False |
IDStreet | Visible = False |
House | DisplayLabel = 'Дом' DisplayWidth = 4 |
Flat | DisplayLabel = 'Квартира' DisplayWidth = 4 |
Comment | Visible = 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).
В диалоге создания нового поля установите следующие значения: Name = Street, Type = String, Field type = Lookup (поле подстановки), Key Fields = IDStreet, Dataset = tblStreets, Lookup Keys = ID, Result Field = StreetName.
В диалоге создания нового поля установите следующие значения: Name = Address, Type = String, Field type = Calculated (вычисляемое).
Поле | Значения свойств |
Group | DisplayLabel = 'Группа' DisplayWidth = 10 |
Street | DisplayLabel = 'Улица' DisplayWidth = 10 |
Address | DisplayLabel = 'Адрес' 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) Сохраните проект и запустите программу на исполнение.
- Откройте окно менеджера действий ActionManager и добавьте следующие пользовательские действия (Ins):
Действие | Значения свойств | Обработчик |
Отчет в Word | Name = acWord Category = 'Данные' Caption = 'Отчет в Word' Hint = 'Отчет в Word' ImageIndex = иконка ShortCut = F5 | |
Отчет в Excel | Name = acExcel Category = 'Данные' Caption = 'Отчет в Excel' Hint = Отчет в Excel' ImageIndex = иконка ShortCut = F6 | |
Отчет в HTML | Name = 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> </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) Сохраните проект и запустите программу на исполнение.
Комментариев нет:
Отправить комментарий