
- •Лабораторна робота № 1 Тема: "Створення шаблонів форм і їх використання в нових проектах"
- •Лабораторна робота № 2 Тема: "Прийоми обробки однотипних компонентів "
- •Лабораторна робота № 3 Тема: Створення незалежних модулів для зберігання незалежних процедур
- •Лабораторна робота № 4 Тема: "Створення шаблонів компонентів"
- •Лабораторна робота № 5 Тема: "Створення динамічної бібліотеки процедур"
- •Лабораторна робота № 6 Тема: "Створення програм із зовнішніми компонентами"
- •Лабораторна робота № 7 Тема: "Створення інформаційної системи за технологією файлового сервера"
- •Лабораторна робота № 8 Тема: "Створення інформаційної системи за технологією клієнт/сервер"
- •Лабораторна робота № 9 Тема: "Робота з базами даних серверної субд"
- •Лабораторна робота № 10 Тема: "Обробка таблиці клієнт/серверної субд за допомогою запитів"
- •Лабораторна робота № 11 Тема: «Робота з com сервером Microsoft Word»
- •Лабораторна робота № 12 Тема: «Робота з com сервером Microsoft Excel»
- •Лабораторна робота № 13 Тема роботи: Створення довідкової системи та її інтеграція в програму
Лабораторна робота № 12 Тема: «Робота з com сервером Microsoft Excel»
Ціль роботи: отримати практичні навички по створенню звітів у електронній таблиці Microsoft Excel
Хід роботи
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 Excel", Position="DesktopCenter", Borderstyle="bsSingle".
У вікні 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. Під сіткою знаходиться кнопка Анкета, яка виводить у програмі Excel дані полів поточного запису в сітці. При цьому дані поміщаються в книгу, створену на підставі розробленого раніше шаблону й збереженого у вкладеній папці.
Вказівки: У теці із програмою створіть теку shablon для зберігання шаблонів і теку output для зберігання отриманих документів. Запустіть Microsoft Excel, розробіть довільний шаблон з іменами #tab#, #fam#, #imya#, #datar#. Збережіть файл у теку shablon. При цьому в поле тип файлу вкажіть Шаблон, а ім'я файлу Anketa.
Для формування анкети нанесіть на форму кнопку Button (Standard). У властивості Caption укажіть Анкета.
Для роботи з COM сервером підключіть в коді модуля форми файл comobj. Угорі модуля опишіть глобальну змінну виду:
e:variant;
Для кнопки напишіть код виду:
//намагаємося підключитися до сервера Excel
try
e:=getactiveoleobject('excel.application');
//якщо підключення не вдале, то запускаємо Excel
except
e:=createoleobject('excel.application');
end;
//створюємо нову книгу на основі шаблону
e.workbooks.add(extractfilepath(application.Exename)+'shablon\anketa.xlt');
//привласнюємо імені аркуша прізвище обраного співробітника
e.activeworkbook.sheets.item[1].name:=ztable1.Fieldbyname('fam').asstring;
//заміняємо ім'я #tab# на значення поля tab
e.activeworkbook.sheets.item[1].cells.replace(what:='#tab#', replacement:=ztable1.Fieldbyname('tab').asstring);
//заміняємо ім'я #fam# на значення поля fam
e.activeworkbook.sheets.item[1].cells.replace(what:='#fam#', replacement:=ztable1.Fieldbyname('fam').asstring);
//заміняємо ім'я #imya# на значення поля imya
e.activeworkbook.sheets.item[1].cells.replace(what:='#imya#', replacement:=ztable1.Fieldbyname('imya').asstring);
//заміняємо ім'я #datar# на значення поля datar
e.activeworkbook.sheets.item[1].cells.replace(what:='#datar#', replacement:=ztable1.Fieldbyname('datar').asstring);
//робимо видимим вікно Excel
e.visible:=true;
5. Кнопка Список викликає контекстне меню, яке містить дві команди. Перша команда формує в програмі Excel книгу зі списком усіх співробітників підприємства. Друга команда формує в програмі Excel книгу зі списком відібраних співробітників підприємства. При цьому умови відбору задаються в полях на панелі Параметри фільтрації.
Книга зі списком формується на основі розробленого раніше шаблону й збереженого у вкладеній теці.
У книзі зі списком у кінець таблиці додати рядок, в останній чарунці якого відобразити загальне число співробітників.
Вказівки: За допомогою кнопки «Список» розкривається контекстне меню з командами «Всі дані» й «Тільки відібрані дані». Перша команда виводить список усіх співробітників, а друга команда виводить список тільки відібраних співробітників. Список відображається у вигляді таблиці. Під усіма рядками списку вставляється ще один рядок, в останньому стовпчику якої відображається загальне число співробітників, а сам рядок заливається сірим кольором.
Створення контекстного меню
Нанесіть на форму компонент PopupMenu (Standard). Подвійним клацанням на компоненті розкрийте редактор команд меню й уведіть дві команди: Усі дані, Тільки відібрані дані.
Формувати список співробітників будемо на підставі запиту. Нанесіть на форму компонент ZQuery1 (ZeosAccess). Для компонента вкажіть властивість Connection=ZConnection1.
Для введення команд для пунктів контекстного меню два рази клацніть на компоненті PopupMenu, а потім подвійним клацанням на потрібному пункті меню відкрийте вікно для введення потрібного коду.
Для першого пункту меню введіть код:
//формуємо запит на відбір усіх даних таблиці
zquery1.Active:=false;
zquery1.SQL.clear;
zquery1.sql.add('select * from sotr');
zquery1.Active:=true;
Для другого пункту меню спочатку потрібно створити панель уведення умов відбору данных. Нанесіть на форму компонент Groupbox (Standard) і вкажіть властивість Caption=Параметри фільтрації. На компоненті розмістіть написи й текстові поля як показано на малюнку (див. завдання).
Угорі коду модуля опишіть глобальну змінну для зберігання умови пошуку у вигляді:
//змінна для формування умови відбору
s:string;
Після створення панелі пошуку для другого пункту контекстного меню введіть код:
//спочатку умова порожня
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);
Після створення меню його потрібно викликати по клацанню на кнопці Список. Для цього додайте на форму кнопку Button (Standard). Для кнопки вкажіть властивість Caption=Список. Для кнопки введіть код:
//викликаємо контекстне меню з розміщенням під кнопкою
popupmenu1.Popup(form1.Left+button4.left,form1.Top+button4.top+button4.height);
Створення процедури для формування списку співробітників
Спочатку потрібно підготувати файл шаблону. Для цього запустіть Microsoft Excel, у текст книги введіть довільний заголовок списку, а нижче на третьому рядку створіть таблицю, що складається з 1 рядка і 5 стовпчиків. Даний рядок буде відігравати роль шапки таблиці. У чарунках шапки введіть текст: № з/п, Таб.номер, Прізвище, Ім'я, Дата народ. Укажіть потрібну ширину стовпців, границі, задайте розмір шрифту, вирівнювання й інші параметри форматування на ваш розсуд. Збережіть файл у теку shablon. При цьому в полі тип файлу вкажіть Шаблон, а ім'я файлу Spisok.
Список буде формуватися на підставі даних, відібраних у компоненті ZQuery1. Цей компонент буде містити або всі записи таблиці, або відібрані записи (залежно від обраної команди з контекстного меню).
Сам код формування списку буде однаковим для обох пунктів меню. Тому ми його оформимо у вигляді окремої процедуру, а потім викличемо її для кожного пункту меню.
Угорі коду модуля в розділі опису процедур додайте опис своєї процедури у вигляді:
procedure spisok;
Унизу в розділі реалізації процедур модуля ведіть повний текст процедури у вигляді:
procedure Tform1.Spisok;
var i,n:integer;
begin
//намагаємося підключитися до запущеної програми excel
try
e:=getactiveoleobject('excel.application');
//якщо підключення не вдале, запускаємо excel
except
e:=createoleobject('excel.application');
end;
//створюємо нову книгу на основі шаблону
e.workbooks.add(extractfilepath(application.Exename)+'shablon\spisok.xlt');
//стаємо на перший запис у списку
zquery1.First;
//лічильнику рядків привласнюємо 3, тому що в перший рядок таблиці (шапка)
//знаходиться у третьому рядку аркуша книги
i:=3;
//n - лічильник записів для стовпчика № п/п
n:=0;
//виділяємо шапку таблиці (за умови, що вона знаходиться на 3 рядку)
e.activeworkbook.sheets.item[1].range['a3:e3'].select;
//копіюємо виділену шапку в буфер обміну
e.activeworkbook.sheets.item[1].range['a3:e3'].copy;
//у циклі проходимо по всіх записах
while not zquery1.Eof do
begin
//збільшуємо кількість рядків на 1
i:=i+1;
//збільшуємо лічильник записів на 1
n:=n+1;
//стаємо в першу чарунку наступного рядка (ai)
e.activeworkbook.sheets.item[1].range['a'+inttostr(i)].select;
//вставляємо в наступний рядок скопійовану шапку
e.activeworkbook.sheets.item[1].paste;
//заповнюємо стовпчик № п/п у новому рядку
e.activeworkbook.sheets.item[1].cells[i,1].value:=n;
//заповнюємо стовпчик Таб.номер у новому рядку
e.activeworkbook.sheets.item[1].cells[i,2].value:=zquery1.Fieldbyname('tab').asstring;
//заповнюємо стовпчик Прізвище в новому рядку
e.activeworkbook.sheets.item[1].cells[i,3].value:=zquery1.Fieldbyname('fam').asstring;
//заповнюємо стовпчик Ім'я в новому рядку
e.activeworkbook.sheets.item[1].cells[i,4].value:=zquery1.Fieldbyname('imya').asstring;
//заповнюємо стовпчик Дата народження в новому рядку
e.activeworkbook.sheets.item[1].cells[i,5].value:=zquery1.Fieldbyname('datar').asstring;
//переходимо на наступний запис
zquery1.Next;
end;
// в окремому рядку розраховуємо кількість співробітників у списку
//збільшуємо число рядків на 1
i:=i+1;
//стаємо в першу чарунку нового рядка
e.activeworkbook.sheets.item[1].range['a'+inttostr(i)].select;
//у таблиці в новий рядок вставляємо скопійовану шапку
e.activeworkbook.sheets.item[1].paste;
//очищаємо скопійовану шапку від даних
e.activeworkbook.sheets.item[1].range['a'+inttostr(i)+':e'+inttostr(i)].clearcontents;
// у передостанній чарунці доданого рядка відобразимо текст
e.activeworkbook.sheets.item[1].cells[i,4].value:='Кількість';
// в останній чарунці доданого рядка відобразимо кількість співробітників
//для цього використаємо функцію підрахунку кількості значень в діапазоні (counta)
e.activeworkbook.sheets.item[1].cells[i,5].formula:='=counta(r4c1:r'+inttostr(i-1)+'c1)';
//зафарбовуємо останній рядок сірим кольором
e.activeworkbook.sheets.item[1].range['a'+inttostr(i)+':e'+inttostr(i)].interior.colorindex:=16;
//після формування списку робимо вікно excel видимим
e.visible:=true;
end;
Дану процедуру потрібно викликати в оброблювачах обох команд контекстного меню. Для цього наприкінці оброблювача першої команди і наприкінці гілки then останнього оператора if оброблювача другої команди меню додайте команду виду:
spisok;