Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи КПЗ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.24 Mб
Скачать

Лабораторна робота № 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);