
- •Лабораторна робота № 1 Тема: "Створення шаблонів форм і їх використання в нових проектах"
- •Лабораторна робота № 2 Тема: "Прийоми обробки однотипних компонентів "
- •Лабораторна робота № 3 Тема: Створення незалежних модулів для зберігання незалежних процедур
- •Лабораторна робота № 4 Тема: "Створення шаблонів компонентів"
- •Лабораторна робота № 5 Тема: "Створення динамічної бібліотеки процедур"
- •Лабораторна робота № 6 Тема: "Створення програм із зовнішніми компонентами"
- •Лабораторна робота № 7 Тема: "Створення інформаційної системи за технологією файлового сервера"
- •Лабораторна робота № 8 Тема: "Створення інформаційної системи за технологією клієнт/сервер"
- •Лабораторна робота № 9 Тема: "Робота з базами даних серверної субд"
- •Лабораторна робота № 10 Тема: "Обробка таблиці клієнт/серверної субд за допомогою запитів"
- •Лабораторна робота № 11 Тема: «Робота з com сервером Microsoft Word»
- •Лабораторна робота № 12 Тема: «Робота з com сервером Microsoft Excel»
- •Лабораторна робота № 13 Тема роботи: Створення довідкової системи та її інтеграція в програму
Лабораторна робота № 11 Тема: «Робота з com сервером Microsoft Word»
Ціль роботи: отримати практичні навички по створенню звітів у редакторі Microsoft Word
Хід роботи
1. У СУБД MySQL спроектуйте базу даних "personal", а в ній створіть таблицю "sotr" для зберігання даних про співробітників з наступною структурою:
Ім'я поля |
Тип |
Розмір |
tab |
integer |
ціле, ключове |
fam |
varchar |
20 |
imya |
varchar |
15 |
datar |
date |
|
foto |
longtext |
|
Вказівки: Запустіть утиліту "SQL Manager for MySQL". Для створення БД у правій частині вікна клацніть команду "Створити нову базу даних". У вікні, що з'явилося, уведіть ім'я бази даних (personal) і клацніть "Далі". У полі "Хост" укажіть "localhost", у полі "Користувач" уведіть "root", у полі "Пароль" уведіть "111", у списку "Кодування" оберіть рядок "utf8 (UTF8-Unicod)" і клацніть на кнопці "Далі", а потім на кнопці "Готово". З'явиться вікно, у якому клацніть на кнопці "ОК".
У лівій частині вікна з'явиться створена база даних. Подвійним клацанням відкрийте її.
У правій частині вікна виберіть команду "Створити нову таблицю". У вікні на закладці "Загальні" у полі "Ім'я таблиці" укажіть "sotr", у списку "Тип таблиці вкажіть тип "MyISAM"". На закладці "Поля" уведіть структуру таблиці (див. завдання). Після введення всіх полів і їх типів клацніть на команді "Компілювати".
2. У середовищі Delphi створіть програму для роботи з даними таблиці. При цьому форма повинна мати вигляд:
Усі поля повинні мати назву зрозумілою мовою і підходящу ширину стовпців. Поле "foto" у сітці не відображається.
Вказівки: Для форми задайте властивості: Caption="Робота з COM сервером Microsoft Word", Position="DesktopCenter", Borderstyle="bsSingle".
Для підключення БД до програми необхідно у теку з проектом скопіювати файл бібліотеки СУБД MySQL. Для цього відкрийте теку c:\program files\mysql\bin і в теку із проектом скопіюйте файл «libmysql.dll».
У вікні Delphi перейдіть на закладку Zeos Access, на форму додайте компонент ZConnection. Для настроювання параметрів з'єднання для компонента задайте властивості: HostName=localhost, LoginPrompt=true (відображати вікно реєстрації користувача) Properties=codepage=cp1251 (встановити кодування символів - кирилиця), Protocol=mysql5 (встановити тип СУБД), User=root, Password=111, Connected=true, Catalog=ім'я_БД, DatabaseName=ім'я_БД(введіть із клавіатури).
На форму нанесіть компонент ZTable (ZeosAccess). Для компонента задайте властивості: Connection=ZConnection1, TableName=sotr. Клацніть два рази на компоненті ZTable1, викличте у вікні, що з'явилося, контекстне меню й виконайте команду Add All Fields. Для кожного поля у властивості DisplayLabel уведіть російську назву для сітки, у властивості DisplayWidth введіть потрібну ширину поля в символах.
Для того, щоб програма коректно підключала таблицю, в події форми OnCreate уведіть код:
procedure tform1.formcreate(sender: tobject);
begin
ztable1.active:=true;
end;
Для того, щоб програма коректно відключала таблицю в події OnClose форми введіть код:
procedure tform1.formclose(sender: tobject);
begin
ztable1.active:=false;
end;
Проектування сітки
Для таблиці нанесіть на форму компонент DataSource1 (Data Access). Установіть його властивість DataSet =ZTable1. Нанесіть на форму компонент DBGrid (Data Controls). У властивості DataSource укажіть ім'я компонента DataSource1.
Для створення панелі редагування сітки нанесіть на форму компонент DBNavigator (Data Controls) і задайте властивості: DataSource=DataSource1.
Заповніть таблицю 5-6 довільними записами.
3. Для роботи з полем "foto" праворуч від сітки розташуйте компонент DBImage і кнопки для додавання й видалення малюнка з поля
Вказівки: Поле "foto" містить зображення співробітника. Його заповнення будемо виконувати подвійним клацанням на компоненті DBImage і вибираючи зображення за допомогою діалогу OpenPictureDialog.
Нанесіть на форму компонент DBImage (Data Controls), укажіть для нього властивості: DataSource=DataSource1, DataField=foto, Stretch=true.
Нанесіть на форму компонент OpenPictureDialog (Dialogs). У властивості Filter видаліть всі типи файлів крім *.bmp.
Під компонентом DBImage створіть дві кнопки Button (Standard).
Перша кнопка дозволяє ввести в поле "foto" указаний графічний файл. Для цього для кнопки напишемо код:
procedure tform1.button1click(sender: tobject);
begin
//відкриваємо діалог вибору графічного файлу
if openpicturedialog1.execute = true then
begin
//переводимо таблицю в стан редагування
ztable1.edit;
//завантажуємо в поле foto обраний файл
tblobfield(ztable1.fieldbyname('foto')).loadfromfile(openpicturedialog1.filename);
end;
end;
Друга кнопка очищає поле foto. Для кнопки напишемо код:
procedure tform1.button2click(sender: tobject);
begin
//якщо поле foto не порожнє
if ztable1.fieldbyname('foto').asstring<>'' then
//видаємо запит на очищення поля
if application.messagebox('Очистити поле з фото?','Підтвердьте операцію',mb_yesno+mb_iconquestion)=idyes then
//якщо користувач відповів ствердно
begin
//переводимо таблицю в режим редагування
ztable1.edit;
//очищаємо поле foto
tblobfield(ztable1.fieldbyname('foto')).clear;
end;
end;
Для кожного введеного запису в полі "foto" додайте зображення співробітника.
4. Під сіткою знаходиться кнопка "Анкета", яка виводить у редактор Word дані полів поточного запису в сітці. При цьому дані поміщаються в документ, створений на підставі розробленого раніше шаблону й збереженого у вкладеній теці "shablon".
Вказівки: У папці із програмою створіть теку "shablon" для зберігання шаблонів і теку "output" для зберігання отриманих документів. Запустіть Microsoft Word, уведіть довільний текст документа з іменами #tab#, #fam#, #imya#, #datar#. Збережіть файл у текуку "shablon". При цьому в полі "Тип файлу" вкажіть "Шаблони документа", а ім'я файлу "Anketa".
Для формування анкети нанесіть на форму кнопку Button (Standard). У властивості Caption укажіть "Анкета".
Для роботи з COM сервером підключіть в коді модуль comobj. Також опишіть глобальну змінну виду:
w:variant;
Для коректної обробки конструкції try…except…end виконайте настроювання Delphi: виберіть команду "Tools-Debugger Options". На закладці "Language Exception" зніміть прапорець "Stop On Delphi Exceptions".
Для кнопки напишіть код виду:
procedure tform1.button3click(sender: tobject);
begin
//намагаємося підключитися до сервера word
try
w:=getactiveoleobject('word.application');
//якщо підключення не вдале, то запускаємо word
except
w:=createoleobject('word.application');
end;
//створюємо новий документ на основі шаблону
w.documents.add(extractfilepath(application.exename)+'shablon\anketa.dot');
//заміняємо ім'я #tab# на значення поля tab
w.selection.find.text:='#tab#';
w.selection.find.replacement.text:=ztable1.fieldbyname('tab').value;
w.selection.find.execute(replace:=2);
//заміняємо ім'я #fam# на значення поля fam
w.selection.find.text:='#fam#';
w.selection.find.replacement.text:=ztable1.fieldbyname('fam').value;
w.selection.find.execute(replace:=2);
//заміняємо ім'я #imya# на значення поля imya
w.selection.find.text:='#imya#';
w.selection.find.replacement.text:=ztable1.fieldbyname('imya').value;
w.selection.find.execute(replace:=2);
//заміняємо ім'я #datar# на значення поля datar
w.selection.find.text:='#datar#';
w.selection.find.replacement.text:=ztable1.fieldbyname('datar').value;
w.selection.find.execute(replace:=2);
//зберігаємо документ у теку "output"
w.activedocument.saveas(filename:=extractfilepath(application.exename)+'output\anketa.doc');
//робимо видимим вікно word
w.visible:=true;
end;
Отриманий документ буде знаходитись в теці "output" під ім'ям "anketa.doc".
5. Кнопка "Список" викликає контекстне меню, яке містить дві команди. Перша команда формує в програмі Word документ зі списком усіх співробітників підприємства. Друга команда формує в програмі Word документ зі списком відібраних співробітників підприємства. При цьому умови відбору задаються в полях на панелі "Параметри фільтрації".
Документ зі списком формується на основі розробленого раніше шаблону й збереженого у вкладеній теціці.
Вказівки: За допомогою кнопки "Список" розкривається контекстне меню з командами "Всі дані" й "Тільки відібрані дані". Перша команда виводить список усіх співробітників, а друга команда виводить список тільки відібраних співробітників. Список відображається у вигляді таблиці. При цьому крім текстової інформації в кожному рядку з'являється зменшена фотографія співробітника. У кінці таблиці вставляється ще один рядок, в останньому стовпчику якоого відображається загальне число співробітників, а сам рядок заливається сірим кольором.
Створення контекстного меню
Нанесіть на форму компонент PopupMenu (Standard). Подвійним клацанням на компоненті розкрийте редактор команд меню й уведіть дві команди: "Усі дані", "Тільки відібрані дані".
Формувати список співробітників будемо на підставі запиту. Нанесіть на форму компонент ZQuery1 (Zeos Access). Для компонента вкажіть властивість Connection=ZConnection1.
Для введення команд для пунктів контекстного меню два рази клацніть на компоненті PopupMenu, а потім подвійним клацанням на потрібному пункті меню відкрийте вікно для введення потрібного коду.
Для першого пункту меню введіть код:
procedure tform1.n1click(sender: tobject);
begin
//формуємо запит на відбір усіх даних таблиці
zquery1.active:=false;
zquery1.sql.clear;
zquery1.sql.add('select * from sotr');
zquery1.active:=true;
end;
Для другого пункту меню спочатку потрібно створити панель уведення умов відбору даних. Нанесіть на форму компонент Groupbox (Standard) і вкажіть властивість Caption=Параметри фільтрації. На панелі розмістіть написи Label (Standard) і текстові поля Edit (Standard) як показано на малюнку (див. завдання).
Для формування умови опишіть глобальну змінну:
//змінна для формування умови відбору
s:string;
Для другого пункту контекстного меню введіть код:
procedure tform1.n2click(Sender: Tobject);
begin
//спочатку умова порожня
s:='';
//якщо перше поле заповнене
if edit1.text<>'' then
//додаємо умову пошуку по полю tab
s:='tab='+edit1.Text;
//якщо друге поле заповнене
if edit2.text<>'' then
//додаємо умову пошуку по полю fam
if s<>'' then
s:=s+' and fam like '''+edit2.Text+'%'''
else
s:=s+'fam like '''+edit2.Text+'%''';
//якщо третє поле заповнене
if edit3.text<>'' then
//додаємо умову пошуку по полю imya
if s<>'' then
s:=s+' and imya like '''+edit3.Text+'%'''
else
s:=s+'imya like '''+edit3.Text+'%''';
//перевіряємо чи задана умова пошуку
//якщо умова задана
if s<>'' then
//формуємо запит на відбір потрібних даних
begin
zquery1.active:=false;
zquery1.sql.clear;
zquery1.sql.add('select * from sotr where '+s);
zquery1.active:=true;
end
//якщо умова не задана
else
//видаємо повідомлення про помилкову операцію
application.messagebox('Умова пошуку не задана','Помилкова дія',mb_ok+mb_iconstop);
end;
Після створення меню його потрібно викликати по клацанню на кнопці Список. Для цього додайте на форму кнопку Button (Standard). Для кнопки вкажіть властивість Сaption=Список. Для кнопки введіть код:
procedure tform1.button4click(sender: tobject);
begin
//викликаємо контекстне меню з розміщенням під кнопкою
popupmenu1.popup(form1.left+button4.left,form1.top+button4.top+button4.height);
end;
Створення процедури для формування списку співробітників
Спочатку потрібно підготувати файл шаблону. Для цього запустіть Microsoft Word, у текст документа введіть довільний заголовок списку, а нижче створіть таблицю, що складається з 1 рядка й 6 стовпчиків. Даний рядок буде відігравати роль шапки таблиці. У чарунках шапки введіть текст: № з/п, Таб.номер, Прізвище, Ім'я, Дата народ. , Фото. Укажіть потрібну ширину стовпців, задайте розмір шрифту, вирівнювання й інші параметри форматування на ваш розсуд. Збережіть файл у теку "shablon". При цьому в полі "Тип Файлу вкажіть "Шаблони документа", а ім'я файлу "Spisok".
Список буде формуватися на підставі даних, відібраних у компоненті ZQuery1. Цей компонент буде містити або всі записи таблиці, або відібрані записи (залежно від обраної команди з контекстного меню).
Сам код формування списку буде однаковим для обох пунктів меню. Тому ми його оформимо у вигляді окремої процедуру, а потім викличемо її для кожного пункту меню. Процедура має вхідний параметр n - номер пункту меню, з якого її викликали.
Угорі коду модуля в розділі опису процедур додайте опис своєї процедури у вигляді:
procedure spisok (n:integer);
Унизу в розділі Implementation уведіть повний текст процедури у вигляді:
procedure tform1.spisok;
//допоміжні змінні
//r – лічильник рядків
//c – кількість стовпців
//p – лічильник малюнків із Blob поля
var r,c,p:integer;
begin
//намагаємося підключитися до запущеної програми word
try
w:=getactiveoleobject('word.application');
//якщо підключення не вдале, запускаємо word
except
w:=createoleobject('word.application');
end;
//створюємо новий документ на основі шаблону
w.documents.add(extractfilepath(application.Exename)+'shablon\spisok.dot');
//стаємо на перший запис у списку
zquery1.first;
//зпочатку число доданих рядків 0
r:=0;
//зпочатку число малюнків 0
p:=0;
//у циклі проходимо по всіх записах
while not zquery1.Eof do
begin
//додаємо новий рядок у таблицю
w.activedocument.tables.item(1).rows.add;
//збільшуємо кількість рядків на 1 після додавання
r:=r+1;
//у першій чарунці відображаємо номер рядка
w.activedocument.tables.item(1).cell(r+1,1).range.text:=inttostr(r);
//у другій чарунці відображаємо поле tab
w.activedocument.tables.item(1).cell(r+1,2).range.text:=zquery1.Fieldbyname('tab').asstring;
//у третій чарунці відображаємо поле fam
w.activedocument.tables.item(1).cell(r+1,3).range.text:=zquery1.Fieldbyname('fam').asstring;
//у четвертій чарунці відображаємо поле imya
w.activedocument.tables.item(1).cell(r+1,4).range.text:=zquery1.Fieldbyname('imya').asstring;
//у п'ятій чарунці відображаємо поле datar
w.activedocument.tables.item(1).cell(r+1,5).range.text:=zquery1.Fieldbyname('datar').asstring;
//перевіряємо, чи заповнене поле foto
if zquery1.Fieldbyname('foto').Asstring <>'' then
//якщо поле не порожнє
begin
//збільшуємо кількість малюнків на 1
p:=p+1;
//зберігаємо вміст поля у файл із ім'ям "pict" з номером N
tblobfield(zquery1.Fieldbyname('foto')).savetofile(extractfilepath(application.Exename)+'pict'+inttostr(p));
//вставляємо в шосту чарунку збережений малюнок
w.activedocument.tables.item(1).cell(r+1,6).range.inlineshapes.Addpicture(Filename:=extractfilepath(application.exename)+'pict'+inttostr(p), Linktofile:=False,Savewithdocument:=True);
//форматуємо малюнок у таблиці, задаючи ширину й висоту
w.activedocument.Inlineshapes.item(p).width:=50;
w.activedocument.Inlineshapes.item(p).height:=60;
//після додавання малюнка в таблицю видаляємо файл
deletefile(extractfilepath(application.exename)+'pict'+inttostr(p));
end;
//переходимо на наступний запис
zquery1.Next;
end;
//після виведення всієї таблиці рахуємо кількість записів
//для цього очищаємо старий текст запиту
zquery1.Active:=false;
zquery1.SQL.clear;
//якщо процедуру викликали з першого пункту контекстного меню
if n=1 then
//рахуємо кількість по всій таблиці
zquery1.sql.add('select count(tab) as kolvo from sotr')
//якщо процедуру викликали із другого пункту контекстного меню
else
//рахуємо кількість тільки відібраних записів
zquery1.sql.add('select count(tab) as kolvo from sotr where '+s);
//активуємо запит для підрахунку кількості
zquery1.Active:=true;
//у таблицю додаємо новий рядок
w.activedocument.tables.item(1).rows.add;
//у змінну записуємо загальне число рядків у таблиці
r:=w.activedocument.tables.item(1).rows.count;
//у змінну записуємо загальне число стовпців
c:=w.activedocument.tables.item(1).columns.count;
//у передостанню чарунку останнього рядка вводимо текст "Усього співробітників"
w.activedocument.tables.item(1).cell(r,c-1).range.text:='Усього співробітників';
//в останню чарунку останнього рядка вводимо знайдену кількість
w.activedocument.tables.item(1).cell(r,c).range.text:=zquery1.Fieldbyname('kolvo').asstring;
//зафарбовуємо останній рядок таблиці сірим кольором
w.activedocument.tables.item(1).rows.item(r).shading.backgroundpatterncolorindex:=16;
//зберігаємо створений файл у теку "output" під ім'ям "spisok.doc"
w.activedocument.saveas(extractfilepath(application.Exename)+'output\spisok.doc');
//після формування списку робимо вікно word видимим
w.visible:=true;
end;
Дану процедуру потрібно викликати в оброблювачах обох команд контекстного меню із зазначенням номера команди, що викликала процедуру. Для цього наприкінці оброблювача першої команди введіть оператор виду:
spisok(1);
Наприкінці гілки then останнього оператора if оброблювача другої команди меню додайте команду виду:
spisok(2);