Модуль збору та обробки статистичної інформації в медичному закладі

Дослідження технології com та принципи створення контролерів автоматизації Ms Office і Ms Excel. Розробка програмного забезпечення для збору статистичного ряду показників в умовах неврологічного відділення Криворізького інституту професійних захворювань.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык украинский
Дата добавления 22.10.2012
Размер файла 2,8 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

OLE-Aut32.DLL). СОМ-бібліотеки містять набір стандартних інтерфейсів, які забезпечують функціональність СОМ-об'єкту, а також невеликий набір функцій API, що відповідають за створення і управління СОМ-об'єктів. В Delphi реалізація і підтримка технології СОМ називається каркасом Delphi ActiveX (Delphi ActiveX framework, DAX). Реалізація DAX описана в модулі Axctris.

4.2 Розвиток СОМ-технологій

Однією з найважливіших задач, які ставила перед собою фірма Microsoft, коли просувала операційну систему Windows, була задача по забезпеченню ефективної взаємодії між різними програмами, що працюють в Windows. Найпершими спробами вирішити цю непросту задачу були буфер обміну, файли, що розділяються, і технологія динамічного обміну даними (Dynamic Data Exchange, DDE). Після цього була розроблена технологія зв'язування і запровадження об'єктів (Object Linking and Embedding, OLE). Перша версія OLE 1 призначалася для створення складних документів. Ця версія була визнана недосконалою і на зміну їй прийшла версія OLE 2. Нова версія дозволяла вирішити питання надання один одному різними програмами власних функцій. Дана технологія активно впроваджувалася до 1996 року, після чого їй на зміну прийшла технологія ActiveX, яка включає автоматизацію (OLE-автоматизацію), контейнери, управляючі елементи, Web-технологію і т.д.

4.3. Склад СОМ-додатку

При створенні СОМ-додатку необхідно забезпечити наступне:

· СОМ-інтерфейс;

· СОМ-сервер;

· СОМ-клієнт.

Розглянемо ці три складові СОМ-додатку.

4.3.1 СОМ - інтерфейс

Клієнти СОМ зв'язуються з об'єктами за допомогою СОМ-інтерфейсів. Інтерфейси - це групи логічно або семантично зв'язаних процедур, які забезпечують зв'язок між постачальником послуги (сервером) і його клієнтом. На рис. 4.1 схематично зображено стандартний СОМ-інтерфейс.

Рис. 4.1 СОМ-інтерфейс

Ключовими аспектами СОМ-інтерфейсів є:

· Одного разу визначені, інтерфейси не можуть бути змінені. Таким чином, на один інтерфейс можна покласти певний набір функцій. Додаткова функціональність реалізовується за допомогою додаткових інтерфейсів.

· За взаємною домовленістю, всі імена інтерфейсів починаються з букви I, наприклад IРersist, IМalloc.

· Кожен інтерфейс гарантовано має свій унікальний ідентифікатор, який називається глобальним унікальним ідентифікатором (Globally Unique Identifier, GUID). Унікальні ідентифікатори інтерфейсів називають ідентифікаторами інтерфейсів (Interface Identifiers, IIDs). Ці ідентифікатори забезпечують усунення конфліктів імен різних версій додатку або різних додатків.

· Інтерфеси не залежать від мови програмування. Для реалізації СОМ-інтерфейсу можна скористатися будь-якою мовою програмування. Мова програмування повинна підтримувати структуру покажчиків, а також мати можливість виклику функції за допомогою покажчика явно або неявно.

· Інтерфейси не є самостійними об'єктами, вони лише забезпечують доступ до об'єктів. Таким чином, клієнти не можуть безпосередньо звертатися до даних, доступ здійснюється за допомогою покажчиків інтерфейсів.

· Всі інтерфейси завжди є нащадками базового інтерфейсу IUnknown.

Базовий СОМ-інтерфейс IUnknown

Базовий інтерфейс IUnknown забезпечує механізм обліку посилань (лічильник посилань на СОМ-об'єкт). При передачі покажчика на інтерфейс виконується метод інтерфейсу ІUnknown AddRef. Після закінчення роботи з інтерфейсом додаток-клієнт викликає метод Release, який зменшує лічильник посилань.

Під час виклику методу Querylnterface інтерфейсу ІUnknown в метод передається параметр IID, який має тип TGUID, тобто ідентифікатор інтерфейсу. Параметр методу out повертає або посилання на інтерфейс, що запрошувався, або значення NH.

Покажчики СОМ-інтерфейсу

Покажчик інтерфейсу - це 32-бітовий покажчик на екземпляр об'єкту, який є, у свою чергу, покажчиком на реалізацію кожного методу інтерфейсу. Реалізація методів доступна через масив покажчиків на ці методи, який називається vtable. Використання масиву vtable схоже на механізм підтримки віртуальних функцій в Object Pascal.

Рис. 4.2 Схема роботи покажчика СОМ-інтерфейсу

4.3.2 СОМ-сервери

СОМ-сервер є додатком або бібліотекою, яка надає послуги додатку-клієнту або бібліотеці. СОМ-сервер містить один або більше СОМ-об'єктів, де СОМ-об'єкти виступають як набори властивостей, методів і інтерфейсів.

Клієнти не знають як СОМ-об'єкт виконує свої дії. СОМ-об'єкт надає свої послуги за допомогою інтерфейсів. Крім того, додатку-клієнту не потрібно знати, де знаходиться СОМ-об'єкт. Технологія СОМ забезпечує прозорий доступ незалежно від місцезнаходження СОМ-об'єкту.

Коли клієнт запрошує послугу від СОМ-об'єкту, він передає СОМ-об'єкту ідентифікатор класу (CLSID). CLSID - всього лише GUID, який застосовується при зверненні до СОМ-об'єкту. Після передачі CLSID, СОМ-сервер повинен забезпечити так звану фабрику класу, яка створює екземпляри СОМ-об'єктів.

СОМ-сервер повинен виконувати наступне:

· реєструвати дані в системному реєстрі Windows для зв'язування модуля серверу з ідентифікатором класу (CLSID);

· надавати фабрику СОМ-класу, що створює екземпляри СОМ-об'єктів;

· забезпечувати механізм, який вивантажує з пам'яті сервери СОМ, які у даний момент часу не надають послуг клієнтам.

Фабрика класу

СОМ-об'єкти є екземплярами СoСlass. CoСlass - це клас, що підтримує один або більш інтерфейсів. СОМ-об'єкти можуть надавати тільки ті послуги, які визначені в інтерфейсах СoСlass. Екземпляри CoСlass створюються за допомогою спеціального типу об'єкта, який називається фабрика класу.

Фабрика класу - це спеціальний СОМ-об'єкт, який підтримує інтерфейс IСlassFactory і відповідає за створення екземплярів того класу, з яким асоційована дана фабрика класу.

Інтерфейс IСlassFactory має два методи:

· Createlnstance, який створює екземпляр СОМ-об'єкта, асоційованої фабрики класу

· LockServe, який застосовується для зберігання СОМ-сервера в пам'яті. Якщо параметр метода fLock має значення true, то лічильник посилань сервера збільшується, в іншому випадку - зменшується. Коли лічильник досягає значення 0, сервер вивантажується з пам'яті.

Кожного разу, коли послуги СОМ-об'єкта запрошуються клієнтом, фабрика класу створює і реєструє екземпляр об'єкту для конкретного користувача. Якщо послуга того ж СОМ-об'єкту запрошує інший клієнт, фабрика класу створює другий екземпляр об'єкту для обслуговування другого клієнта. СoСlass повинен мати фабрику класу і ідентифікатор класу CLSID. Використання CLSID для СoClass має на увазі, що вони можуть бути відкоректовані кожного разу, коли в клас вводяться нові інтерфейси. Таким чином, на відміну від DLL, нові інтерфейси можуть змінювати або додавати методи, не впливаючи на старі версії.

Локальні і віддалені сервери

З використанням СОМ клієнт не повинен турбуватися про те, де розташовується об'єкт, він просто робить виклик інтерфейсу даного об'єкту. Технологія СОМ забезпечує всі необхідні кроки для того, щоб зробити цей виклик. Кроки можуть відрізнятися, залежно від місцезнаходження об'єкту. Об'єкт може знаходитися в тому ж процесі, де і клієнт, в іншому процесі на тому ж комп'ютері, де розташований клієнт, або на іншому комп'ютері в мережі. Залежно від цього застосовуються різні типи серверів:

· внутрішній сервер (In-process server);

· локальний сервер (Local server);

· видалений сервер (Remote server).

Внутрішній сервер - це бібліотека DLL, яка запущена в одному процесі разом з клієнтом. Додаток-клієнт зв'язується з сервером усередині процесу за допомогою прямих викликів СОМ-інтерфейсу. На рис. 4.3. представлена схема взаємодії клієнта з внутрішнім сервером.

Рис. 4.3 Схема взаємодії клієнта с внутрішнім сервером

Локальний сервер - це додаток ЕХЕ, який запущено в іншому процесі, але на одному комп'ютері разом з клієнтом. Наприклад, лист електронної таблиці Microsoft Excel пов'язаний з документом Microsoft Word. При цьому два різні додатки працюють на одному комп'ютері. Локальні сервери використовують СОМ для з'єднання з клієнтом.

Коли клієнт і сервер знаходяться в різних додатках, а також, коли вони знаходяться на різних комп'ютерах в мережі, СОМ використовує внутрішній проксі для реалізації процедури видаленого виклику. Проксі розташовується в одному процесі разом з клієнтом, тому, з погляду клієнта, виклик інтерфейсів здійснюється так само, як і у разі, коли клієнт і сервер знаходяться усередині одного процесу. Задача проксі полягає в тому, щоб перехоплювати виклики клієнта і перенаправляти їх туди, де запущено сервер. Механізм, який дозволяє клієнту діставати доступ до об'єктів, розташованих в іншому адресному просторі або на іншому комп'ютері, називається маршалінгом (marshaling).

Функції маршалінга:

· приймати покажчик інтерфейсу з процесу серверу і робити покажчик проксі в процесі клієнта доступним;

· передавати аргументи викликів інтерфейсу таким чином, ніби вони відбулися від клієнта і розміщувати аргументи в процес видаленого об'єкту.

Для будь-якого виклику інтерфейсу клієнт поміщає аргументи в стек, викликає необхідну функцію СОМ-об'єкту через покажчик інтерфейсу. Якщо виклик об'єкту відбувся не усередині процесу, виклик проходить через проксі. Проксі пакує аргументи в пакет маршалінга і передає структуру, що вийшла, видаленому об'єкту. Заглушка об'єкту розпаковує пакет маршалінга, вибирає аргументи із стека і викликає необхідну функцію СОМ-об'єкту.

Таким чином, маршалінг - це процес пакування інформації, а демаршалінг - процес розпакування інформації.

Тип маршалінга залежить від об'єктної приналежності СОМ. Об'єкти можуть використовувати стандартний механізм маршалінга, що надається інтерфейсом IDispatch. Стандартний маршалінг дозволяє встановлювати зв'язок за допомогою стандартного системного видаленого виклику процедури (Remote Procedure Call, RFC).

На рис. 4.4 зображена схема, що показує методику взаємодії клієнта і серверу у разі, коли додатки працюють на одному комп'ютері, але в різних процесах.

Рис. 4.4 Схема взаємодії клієнта з сервером в різних процесах на одному комп'ютері

Видалений сервер - це бібліотека DLL або інший додаток, запущений на іншому комп'ютері. Тобто клієнт і сервер працюють на різних комп'ютерах в мережі. Видалений сервер використовує розподілені СОМ-інтерфейси (Distributed COM, DCOM) для зв'язку з клієнтом.

Видалений сервер працює також з допомогою проксі. Відмінність в роботі між локальним і видаленим сервером полягає в типі межпроцесного зв'язку, що використовується. У разі локального серверу - це СОМ, а у разі видаленого серверу - DCOM. Схема взаємодії клієнта і видаленого сервера показана на рис. 4.5.

Рис. 4.5 Схема взаємодії клієнта з сервером на різних комп'ютерах

4.3.3 СОМ-клієнти

Дуже важливим при розробці СОМ-додатків є створення додатків, так називаємих СОМ-клієнтів, що можуть запрошувати інтерфейси об'єктів, щоб визначити ті послуги, які може надати СОМ-об'єкт.

Типовим СОМ-клієнтом є диспетчер автоматизації (Automation Controller). Диспетчер автоматизації - це частина додатка, яка «знає» який тип інформації необхідний йому від різних об'єктів сервера, і вона запрошує дану інформацію у міру потреби.

4.4 Об'єктна модель MS Excel

Об'єктна модель MS Excel за загальними принципами ідентична об'єктній моделі MS Word. Ця модель також має ієрархічну структуру, в корені якої знаходиться об'єкт Application (ExcelApplication), через який забезпечується доступ до будь-якої колекції або внутрішнього об'єкту додатку MS Excel або до компонентів відкритих робочих книг. Загальна структура об'єктної моделі MS Excel представлена на рис. 4.6

Рис. 4.6 Об'єктна модель MS Excel

Як вже сказано, вершиною об'єктної моделі MS Excel є об'єкт Application, що безпосередньо включає такі об'єкти і колекції, як Selection -- поточний виділений об'єкт, WorkBooks -- колекція відкритих робочих книг, колекції різних елементів управління, діалогових вікон і інші властивості додатку MS Excel.

Об'єкт Selection має властивості поточного виділеного об'єкту, тому немає сенсу розглядати тут структуру моделі цього об'єкту. Якщо виділена комірка, то Selection = Комірка, якщо діаграма, то Selection = Діаграма.

Коли виділена область комірок, Selection = Колекції стовпців і рядків. Колекція робочих книг є списком відкритих робочих книг, доступ до яких здійснюється по індексу. Кожен елемент такої колекції є об'єктом "робоча книга". Панелі управління, меню, кнопки, діалоги і інші об'єкти, призначені для управління додатком, зібрані у відповідні колекції елементів управління.

Основним елементом об'єкту "робоча книга" є колекція робочих аркушів. Елементом колекції є окремий робочий аркуш, який може бути звичайним аркушем (у вигляді таблиці) або бути у вигляді діаграми. У останньому випадку він нічого, окрім діаграми, містити не може. Розглянемо варіант аркуша у вигляді таблиці (рис. 4.7).

Рис. 4.7 Об'єктна модель листа робочої книги

Основний об'єкт робочого аркуша, з яким доводиться працювати, -- комірка. Комірка як об'єкт сама володіє безліччю властивостей і об'єктів, що входять в неї. З них найбільш важливими і часто використовуваними є: текст, шрифт, стиль тексту, межі, заливка. Щоб дістати доступ до них, необхідно дістати доступ до самої комірки, а потім змінювати її властивості. Комірки об'єднані у області комірок Range. Властивості області комірок багато в чому співпадають з властивостями самої комірки, але є і відмінності, що полягають в завданні координат і розмірів області. Комірки об'єднані в рядки і стовпці. Об'єднання рядків і стовпців є колекціями, доступ до яких проводиться по числовому індексу або по буквеному позначенню стовпця. На робочому аркуші можуть розташовуватися зовнішні об'єкти: малюнки, фрагменти документів Word, звуки, відеозаписи і інші об'єкти, які об'єднані в колекцію зовнішніх OLE-об'єктів. Прорисовка або, точніше, відтворення цих об'єктів повністю виконується зовнішніми програмами, зареєстрованими в системі як OLE-сервери. Доступ до таких об'єктів проводиться через елементи колекції OLEObjects, а доступ до їх властивостей можливий тільки через ці OLE-сервери. Застосування Excel володіє великим набором власних графічних об'єктів, які можна розмістити на робочому аркуші. Ми можемо використовувати малюнки, написи, геометричні фігури, діаграми, які звичайно об'єднані в колекції. Наприклад, колекція ChartObjects містить набір діаграм, які розташовуються на робочому або на окремому аркуші. Кожна діаграма, у свою чергу, також містить набір об'єктів і колекцій.

Щоб переконатися в гнучкості, універсальності і великих можливостях для програмування об'єктів MS Office, розглянемо ще одну колекцію об'єктів, присутню як в Word, так і в Excel. Це колекція діалогів (діалогових вікон), які користувач звичайно відкриває натисненням тієї або іншої кнопки або вибором команди меню. Вона належить об'єкту Application. У об'єктній моделі всі діалоги представлені у вигляді елементів колекції Dialogs, доступ до яких забезпечується через числовий індекс. За допомогою параметрів методу Show елементу колекції відбуваються передача параметрів в діалог і його виконання -- така модель діалогів для додатків Excel (рис. 4.8, а), для додатків Word модель діалогу дещо відрізняється. Відмінність полягає в тому, що в Word параметри передаються через властивості об'єкту-елементу колекції (рис. 4.8, б).

У об'єкту Item() разом з типовими властивостями і методами присутні властиві тільки йому властивості і методи. Наприклад, у діалогу Знайти і замінити є властивість Find, що визначає текст для пошуку -- до запуску діалогу.

У Excel об'єкт колекції Dialogs дещо відрізняється від діалогів Word. Розглянемо об'єктну модель колекції діалогів для Ехсel в цілому (рис. 4.9).

Рис. 4.8 Об'єктні моделі Знайти в Excel (а) и Знайти та змінити в Word (б)

Рис. 4.9 Об'єктна модель діалогів MS Excel

На цьому рисунку представлена тільки мала частина всіляких діалогів колекції -- показані діалоги, найбільш часто використовувані програмістами і користувачами. Звичайно в діалог передаються значення, які встановлюють значення елементів управління, а повертаються значення True або False, залежно від результату дії користувача.

Додатки зі складу MS Office, наприклад Word і Excel, є взаємозв'язані об'єкти і колекції об'єктів. Кожен об'єкт або колекція включає безліч параметрів і інших об'єктів, колекцій. У свою чергу, самі об'єкти і колекції мають господаря (Parent), до складу якого вони входять. На вершині об'єктної моделі знаходяться об'єкти WordApplication для текстового процесора Word і Excel.Application -- для табличного процесора Excel. Через ці об'єкти, в основному, і здійснюється зв'язок цих додатків із зовнішніми програмами.

4.5 Загальні принципи створення контролерів автоматизації MS Office

Office - це середовище, в якому більшість завдань можна вирішувати без якого-небудь програмування. Але вся цінність застосувань Office для розробника полягає в тому, що все, що можна зробити руками, можна зробити програмним шляхом з використанням засобів VBA (Visual Basic for Application). Крім того, додатки Office поставляють сервери COM, які надають інтерфейс доступу до додатку і його об'єктів. Завдяки цьому, розробник в середовищі Delphi має можливість, створивши контролер автоматизації, управляти сервером. Насправді додаток розглядається як сукупність об'єктів зі своїми методами, властивостями, подіями, які забезпечують скелет додатку. Програміст Office є не творцем додатку, як, наприклад це робиться в Delphi, а він бере участь в створенні системи документів. Таким чином, ДОКУМЕНТ, а не програма є метою розробки. Спадкоємство - могутній інструмент побудови нового класу, проте програмістам відомий ще один спосіб отримання класу - вбудовування. Як і спадкоємство, вбудовування транзитивне відношення. У об'єктній моделі Office немає спадкоємства в повному розумінні цього слова, а є тільки вбудовування.

Завжди існує кореневий об'єкт, він завжди називається Application. Кожний додаток Office має свій власний кореневий об'єкт - Word.Application, Excel.Application. Не дивлячись на це в об'єкт Application вбудовується вся решта об'єктів (учасники), які є властивостями головного об'єкту. У учасників можуть бути свої учасники і так далі.

Як тільки відкривається новий документ, будь то PowerPoint, Excel, Word, автоматично створюється каркас нового документа, який є набором бібліотек з класами.

Об'єкти цих класів будуть доступні в даному документі. Завданням розробника контролера автоматизації є дати доступ до кореневого об'єкту сервера, побудувати ланцюжок доступу до об'єктів - учасників (вбудованих об'єктів), правильно передати параметри.

Контролер автоматизації -- це програма, яка "уміє" управляти додатками MS Office і процесом створення документів в середовищі Word і Excel. Для того, щоб все це працювало коректно, програма-контролер повинна виконати наступні функції:

· Перевірити, запущений додаток (Word, Excel) чи ні.

· Якщо додаток не запущено, запустити його.

· Виконати ряд необхідних маніпуляцій із додатком, документом.

· Закрити документ і додаток.

· Очистити пам'ять.

Використовуючи контролери автоматизації, в додатках, створених в середовищі Delphi, можна так само просто, як при звичайній роботі з Word і Excel, створювати документи зі всіма можливими елементами. Таблиці, написи, текст, діаграми і інші компоненти повноцінних документів з'являться у такому вигляді, неначе вони створені користувачем.

4.6 Принципи створення контролерів автоматизації MS Excel

4.6.1 Створення об'єкту Excel.Application, запуск і візуалізація вікна системи

Запуск і візуалізація додатку Excel проводиться аналогічно запуску і візуалізації додатку Word, з тією лише різницею, що функція CreateOleObject звертається до об'єкту Excel.Application.

Створений і запущений екземпляр додатку Excel не містить жодної робочої книги. Всі робочі книги, які в даний момент можуть бути активними або належати об'єкту Application, є приналежністю колекції WorkBooks, яка у свою чергу належить кореневому об'єкту. Властивість Count:integer колекції WorkBooks містить кількість відкритих робочих книг.

Метод Add колекції WorkBooks дозволяє створити нову робочу книгу. При цьому якщо аргументом методу буде рядок, що вказує на файл шаблона, то нова книга буде створена на основі цього шаблона. Якщо аргументів немає, то буде створена звичайна книга в режимі "за умовчанням".

Використання методів колекції WorkBooks дозволяє не тільки створювати, але і відкривати наявні робочі книги, які зберігаються у файлах. Для цієї мети призначені методи Open і OpenText. Перший метод відкриває файл формату XLS, а другий - звичайні текстові файли. Частіше за все використовується метод Open з одним аргументом - рядком-покажчиком на файл.

Повна специфікація виклику методу Open має наступний вигляд:

Open(FileName, UpdateLinks, Readonly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMRU);

Обов'язковим є перший аргумент. Для завдання специфічних режимів відкриття файлу можна використовувати і інші аргументи.

Об'єкти Item(i:integer) містять посилання на всі робочі книги колекції WorkBooks (i:integer - індекс книги в колекції). Як аргумент при зверненні до Item може виступати і строкова змінна, що містить ім'я книги. Властивість Count колекції містить кількість відкритих документів колекції. Використовуючи ці властивості колекції ми можемо вивести список всіх робочих книг і взятися до роботи з будь-якою з них.

Одержання списку робочих книг і посилання на обрану робочу книгу:

procedure TOKBottomDlg2.FormCreate(Sender: TObject);

var a_:integer;

begin

WorkBooks:=Forml.E.WorkBooks;

for a_:=l to WorkBooks.count do begin

ListBoxl.Items.Add(WorkBooks.Item[a_].name+

1; '+Workbooks.Item[a_].FullName);

end;

end;

procedure TOKBottomDlg2.ListBoxlClick(Sender: TObject);

begin

WorkBooks.item[ListBoxl.Itemlndex+l].Activate;

WorkBook:=WorkBooks.item[ListBoxl.Itemlndex+l];

end;

Для активізації робочої книги із списку відкритих використовується метод Activate об'єкту Item(i:integer), де i - індекс відкритої робочої книги, а об'єкт Item(i:integer) є посиланням на робочу книгу.

Після того, як робоча книга вибрана, її можна редагувати, зберегти під колишнім або іншим ім'ям і закрити. Для цього використовуємо методи Save, SaveAs і Close.

Збереження робочої книги:

procedure TOKBottomDlg2.Button2Click(Sender: TObject);

begin

WorkBook.Save;

end;

procedure TOKBottomDlg2.Button3Click(Sender: TObject);

begin

if not SaveDialogl.Execute then exit;

WorkBook.SaveAs(SaveDialogl.FileName);

end;

Закриття робочої книги:

procedure TOKBottomDlg2.Button6Click(Sender: TObject);

begin

Workbook.Close;

end;

4.6.2 Робота з аркушами робочої книги

Аркуш, комірки якого безпосередньо зберігають інформацію, є приналежністю книги. В робочій книзі може бути більше одного аркуша. Доступ до списку аркушів або до будь-якого аркуша робочої книги можна отримати за допомогою колекції Sheets. Як і будь-яка колекція, вона містить властивість Count:integer (кількість елементів колекції) і набір об'єктів Item(i:integer) - власне аркуши, де i - індекс вибраного аркуша (від 1 до Count). Деякі методи колекції Sheets: Select - виділення всіх аркушів робочої книги, Copy - копіювання всіх аркушів в нову робочу книгу, PrintPreview - попередній перегляд друку, Printout - вивід на друк, Add - додавання нового аркушу в робочу книгу.

Розглянемо метод Add докладніше. Його можна використовувати як без аргументів, так і з аргументами, що визначають місце, куди будуть додані аркуші (аркуш), їх кількість і тип. Якщо використовувати метод Add так, як показано в наступному прикладі, то буде додано аркуш перед аркушем Sheet:

procedure TOKBottomDlg3.ButtonlClick(Sender: TObject);

begin

Sheets.Add(Before:=Sheet);

end;

Додавши аркуші або просто відкривши або створивши робочу книгу, ми можемо отримати список аркушів і доступ до будь-якого аркуша робочої книги.

Отримання списку аркушів робочої книги:

procedure TOKBottomDlg3.FormCreate(Sender: TObject);

var a_:integer;

begin

for a_:=l to Sheets.count do ListBoxl.Items.Add(Sheets.Item[a_].name);

end;

Отримання доступу до аркуша робочої книги:

var Sheet:variant;

procedure TOKBottomDlg3.ListBoxlClick(Sender: TObject);

begin

Sheet :=Sheets . item[List.Boxl. ItemІndex+l];

end;

Для того, щоб перейменувати вибраний робочий аркуш, у властивість Name записується нове значення імені аркуша, наприклад:

Sheet.Name: = 'Новий аркуш';

За допомогою методу Сору об'єкту Sheet можна скопіювати аркуш і його зміст. Цей метод дозволяє копіювати аркуш і вставляти копію або до, або після оригіналу - це залежить від значення аргументу методу Сору:

Sheet.Copy(before:=Sheet);

або

Sheet.Copy(after:=Sheet);

Після роботи з книгою може знадобитися видалити деякі аркуші. Для цього призначений метод Delete об'єкту Sheet: Sheet.Delete;

Для доступу до комірок можна використовувати два різні об'єкти - об'єкт типа Range, який асоціюється з областю комірок, або безпосередньо об'єкт Cell (комірка аркуша робочої книги). Якщо перший об'єкт зручний для роботи з цілими областями комірок, то другий більше підходить для роботи з окремо взятою коміркою. Ці об'єкти належать об'єкту "аркуш" і вимагають завдання координат комірки або області комірок при зверненні до них. Наприклад, для завдання об'єкту, асоційованого з областю комірок A1:D5 використовуємо наступний оператор:

MyRange:=Sheet.Range[Al:D5];

де Sheet - посилання на аркуш робочої книги. Після вдалого виконання даного оператора змінна MyRange:variant містить посилання на об'єкт, асоційований з вибраною областю комірок.

Забезпечити доступ до окремої комірки можна з допомогою як об'єкту Range, так і об'єкту Cell. Використання останнього в операторі отримання доступу до комірки може виглядати так:

MyCell:=Sheet.Cells[1,1];

При виконанні даного оператора змінна MyCell зберігатиме посилання на комірку А1.

Запис інформації в комірки аркуша робочої книги:

procedure T0KBottomDlg4.ButtonlClick(Sender: TObject);

var a_:integer;

begin

randomize;

for a_:=l to 100 do Sheet.Cells(a_,1):=random(10000);

end;

Якщо для запису в комірки об'єкту Cells(row, column) привласнюється значення, то для зчитування даних використовується оператор, в якому строковій змінній привласнюється значення об'єкту Cells(row, column).

4.6.3 Робота з комірками

Основа введення і відображення інформації в робочих книгах Excel - робота з комірками аркуша. Кожна комірка є об'єктом з безліччю властивостей, необхідних для відображення інформації. Основною властивістю кожної комірки є її зміст або значення. Але часто буває недостатньо просто відобразити яке-небудь значення, будь то рядок або число, тому для кращого сприйняття інформації використовується таке поняття, як спосіб відображення. На спосіб відображення впливають такі чинники, як формат уявлення, різні способи розміщення значення щодо меж комірки, шрифт, товщина і колір ліній меж, а також колір і стиль заливки комірки.

Для доступу до всіх властивостей і вмісту комірок в Excel використовуються два об'єкти - Range і Cells. Між ними є тільки одна відмінність - перший об'єкт забезпечує доступ до області комірок, а другий - тільки до однієї комірки. Для завдання адреси комірок, на які потрібно отримати посилання, використовуються аргументи цих методів. Для Range аргументом є рядок адреси, а для Cells - номери рядка і стовпця.

Так, наприклад, для отримання посилання на об'єкт-область можна використовувати наступний оператор:

MyRange: =Е. ActiveSheet. Range [' В2 ' ] ;

Оператор з використанням об'єкту Cells:

MyRange:=E.ActiveSheet.Cells[2,2];

Змінна, яку відображає комірка, зберігається у властивостях Text і Value об'єкту Range (Cells), тому для того, щоб її отримати, достатньо зчитати значення однієї з цих властивостей. Якщо тип даних (формат) значення комірки невідомий використовуємо властивість Text, щоб отримати його у вигляді рядка. Коли тип даних відомий, можна спробувати використовувати властивість Value.

Висота і ширина комірки

Використовуючи властивості ColumnWidth і RowHeight об'єктів Range або Cells, можна змінити ширину і висоту комірки. Очевидно, що ці зміни спричинять зміни ширини стовпця і висоти рядка. Як приклад використання цих властивостей розглянемо процедури, що дозволяють змінити розміри заданої комірки:

procedure TOKBottomDlg5.ColumnWidthChange(Sender: TObject);

begin

Columns.Item(col).ColumnWidth:=StrToFloat(ColumnWidth.Text);

end;

procedure TOKBottomDlg5.RowHeightChange(Sender: TObject);

begin

Rows.Item(row).RowHeight:=StrToFloat(RowHeight.Text);

end;

Вирівнювання тексту в комірці

Значення, що відображається, можна розмістити в комірці Excel по-різному. Звичайно спосіб розміщення відповідає типу і величині значення комірки. Для числових даних текст зміщений до правої межі, а для строкових - до лівої межі комірки, але бувають виключення. Виключення з правил визначаються вимогами, що припускають ефективне відображення інформації для більш повного її сприйняття. В таких випадках і використовують властивості комірки, що дозволяють задати режими горизонтального і вертикального вирівнювання, встановити режим переносу по словах і вибрати кут повороту тексту.

Розглянемо ці властивості. Наступний програмний код задає режими горизонтального і вертикального вирівнювання тексту по центру.

Вирівнювання тексту в комірці:

const

xlHAlignCenter = -4108;

xlVAlignCenter = -4108;

procedure TOKBottomDlg8.HorizontalAlignmentChange(Sender: TObject);

begin

range.HorizontalAlignment:=xlHAlignCenter;

end;

procedure TOKBottomDlg8.VerticalAlignmentChange(Sender: TObject);

begin

range.VerticalAlignment:=xlVAlignCenter;

end;

Якщо довжина тексту перевершує ширину комірки, то це може спричинити за собою спотворення відображення значення комірки. Для вирішення цієї проблеми можна скористатися режимом переносу по словах. Він включається коли властивість комірки WrapText встановлена в значення True, і відключається, коли властивість WrapText встановлена в значення False.

Перенос по словах:

procedure TOKBottomDlg8.WrapTextClick(Sender: TObject);

begin

Range.WrapText:=WrapText.Checked;

end;

Ще один спосіб зміни розташування тексту в комірці - його поворот. Поворот тексту, що відображає значення комірки, визначається властивістю Orientation і може бути заданий величиною від -90 до +90 градусів.

Поворот тексту в комірці:

procedure TOKBottomDlg8.OrientationChange(Sender: TObject);

begin

Range.Orientation:=Orientat ion.Value;

end;

Якщо довжина тексту, розміщуваного в комірці, настільки велика, що він не може бути розміщений там без істотних змін розмірів комірки, а за конкретних умов задачі розміри рядків і стовпців змінювати не можна, то слід використовувати режим об'єднання комірок. Об'єднання комірок здійснюється установкою в значення True властивості MergeCells об'єкту Range, асоційованого з областю комірок:

procedure T0KBottomDlg9.MergeCellsClick(Sender: TObject);

begin

Range.MergeCells:=MergeCells.Checked;

end;

Межі комірки

Комірка є прямокутною областю. Ця область, окрім значень, які відображаються в ній, має такі властивості, як заливка і межа. Як заливка осередку, так і межа мають відповідні властивості (колір, товщину, тип, узор, колір узору). Розглянемо ці властивості докладніше. Межі комірки є лініями, що обмежують її з чотирьох сторін. Лінії з'єднані в колекцію Borders, доступ до будь-якої з них здійснюється через елементи цієї колекції. Кожний елемент колекції надає доступ до відрізка прямій, прилеглому до тієї або іншої сторони комірки. Діагоналі комірки також є елементами цієї колекції. Кожний елемент колекції Borders є об'єктом і має свої індивідуальні властивості, що дозволяє задати тип лінії і колір окремо для кожної лінії межі комірки. Наступні процедури дозволяють встановити товщину, тип і колір лінії межі вибраної комірки:

Встановлюємо товщину лінії межі комірки:

procedure TOKBottomDlg6.WeightChange(Sender: TObject);

begin

Border.Weight:=Weight.Itemlndex;

end;

Встановлюємо тип лінії межі комірки:

procedure T0KBottomDlg6.LineStyleChange(Sender: TObject);

begin

Border.LineStyle:=xlDouble;

end;

Встановлюємо колір лінії межі комірки

procedure T0KBottomDlg6.ButtonlClick(Sender: TObject);

begin

if not ColorDialogl.Execute then exit;

Border. Color: =ColorDialogl. Color;

end;

Заливка комірки

Заливка комірки визначається комбінацією наступних складових - кольору, узору і кольору узору, що заповнює простір комірки. Програмний доступ до параметрів заливки забезпечує властивість Interior об'єкту Range, де Range - посилання на комірку або область. Властивість Interior представляє собою об'єкт, властивості якого пов'язані з візуальними властивостями внутрішнього простору комірки.

Колір заливки визначається властивістю Color об'єкту Interior і задається як комбінація трьох кольорів: Color:=RGB(R, G, В); де R, G, В - числові значення, відповідні червоному, зеленому і синьому кольорам. Колір заливки можна також задати як вибраний на палітрі кольорів - для цього використовується властивість ColorІndex об'єкту Interior.

Узор заливки області комірки визначається властивістю Pattern, а її колір - властивістю PatternColor об'єкту Interior. Колір також можна вибрати на палітрі кольорів Excel шляхом запису у властивість PatternColorІndex індексу вибраного кольору.

4.6.4 Пошук і заміна тексту

Пошук тексту виконується шляхом виклику методу Find.

Повна специфікація виклику методу Find:

Find(What, After, Lookln, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte);

В найпростішому випадку метод Find повинен містити один аргумент - шуканий текст. Якщо вимагається уточнити режим пошуку, то використовуються додаткові необов'язкові аргументи цього методу, які дозволяють визначити напрям пошуку, область пошуку і інші параметри.

Після успішного пошуку тексту метод Find повертає посилання на об'єкт-комірку, використовуючи який можна змінити зміст комірки. Повторюючи пошук і заміну багато разів, можна сформувати необхідний документ, але для цього є більш ефективний спосіб - використання функції пошуку і заміни. Ця функція в Excel реалізується методом Replace, який має два обов'язкові аргументи - шуканий текст і текст для заміни. Повна специфікація методу Replace:

Replace(What, Replacement, LookAt, SearchOrder, MatchCase, MatchByte);

4.6.5 Формули

Формула є математичним виразом, що складається з констант, адрес комірок, стандартних функцій Excel, призначених для користувача функцій і математичних символів, записаних у вигляді рядка. Для надання комірці таких властивостей використовують запис рядка, що представляє формулу, у властивість Formula об'єкту Range. Для зчитування формули також використовується властивість Formula.

Можливо також використання майстра функцій, що є послідовністю діалогових вікон, які дозволяють конструювати формулу для даної комірки по кроках. Для активізації даного способу необхідно викликати метод FunctionWizard об'єкту Range:

procedure TOKBottomDlg2.ButtonlOClick(Sender: TObject);

begin

Range.FunctionWizard;

end;

Іноді вимагається перевірити, що знаходиться в комірці - значення, записане користувачем, або сформоване в результаті виконання формули. Для цього можна аналізувати вміст властивості Formula об'єкту Range, але краще використовувати властивість HasFormula. Якщо воно має значення True, то комірка містить формулу, якщо False - то ні.

Перевірка наявності формули в комірці:

procedure TOKBottomDlg2.Button9Click(Sender: TObject);

begin

if Range.HasFormula

then messagebox(handle, 'Дана комірка містить формулу!','Увага!',0)

else messagebox(handle,'Дана комірка не містить формулу!','Увага!',0)

end;

Визначивши, що потрібна комірка містить формулу, ми можемо прочитати цю формулу з метою коректування або аналізу її вмісту.

Процедура читання формули може бути такою:

procedure TOKBottomDlg2.Button8Click(Sender: TObject);

begin

valuel.Text:=Range.Formula;

end;

контролер автоматизація програмний захворювання

5. ОПИС ФУНКЦІОНАЛЬНИХ МОЖЛИВОСТЕЙ ТА ПРОГРАМНОЇ РЕАЛІЗАЦІЇ ПРОЕКТОВАНОЇ СИСТЕМИ

5.1 Функціональне призначення та технологічні особливості розробки

Метою виконання дипломної роботи є автоматизація збору статистичних інформації в умовах неврологічного відділення Криворізького інституту професійних захворювань.

В якості вхідних даних служать файли виписок з історії хвороби у форматі MS Word, які містять більшість необхідної для статистичних досліджень інформації і мають схожу структуру базових елементів. Також є список захворювань і професій, для яких ведеться збір інформації, який формується лікарем-дослідником та зберігається у базі даних.

Призначення системи - отримання лікарем-дослідником статистичного ряду згідно обраним показникам, які в подальшому можуть бути передані до обробки в пакети MS Excel та Statistica.

Інтерфейс системи був створений за допомогою інструментального засобу прискореної розробки програмного забезпечення Delphi з використанням пакетів альтернативних компонентів Development Express та AlphaControls 2010. У зв'язку з великим об'ємом вхідних даних та тривалим часом їх обробки пошук та збір даних був реалізований за допомогою системи пакетної обробки PowerShell, що базується на основі технології .NET Framework. При цьому скрипт сценарію генерується та виконується автоматично на основі умов, заданих користувачем системи та під управлінням оболонки системи. В розробці також був використаний безкоштовний конвертор файлів DocConverterX.exe

Вхідна інформація системи - виписки з історії хвороби у вигляді файлів формату *.doc повинні зберігатися в каталозі doc, в тій же директорії, де знаходиться виконавчий файл.

5.2 Розробка схеми інформаційних потоків та логіко-функціональної схеми роботи системи

Рис. 5.1 Схема інформаційних потоків системи

Логіко-функціональна схема роботи системи наведена на рис. 5.2.

Рис. 5.2 Логіко-функціональна схема роботи системи

5.3 Опис інтерфейсу користувача

Після запуску оболонки системи на екрані з'являється наступне вікно.

Рис. 5.3 Головне вікно оболонки системи

Спочатку користувачеві необхідно визначити список професій та список захворювань, за якими буде проводитись пошук. Цей список зберігається у відповідних таблицях баз даних та завантажується при відкритті форми.

У будь який момент рядок зі списку можна видалити (для цього необхідно клацнути по ньому правою клавішею мишки та обрати пункт „Удалить”). Також можна додати необхідне захворювання чи професію до переліку. Для цього треба ввести назву у відповідному текстовому полі та натиснути кнопку „ОК”.

Якщо текст не буде введений на екрані з'явиться наступне попередження.

Рис. 5.4 Попередження системи про некоректний ввод

Після формування вхідних даних необхідно нажати кнопку „Преобразовать файлы в текстовый формат”. При цьому буде створений та автоматично виконаний командний файл, який переконвертує файли формату *.doc до формату *.txt. В нижній частині робочого вікна буде відображений статус роботи системи, тобто кількість перетворюваних файлів та очікуваний час обробки.

Рис. 5.5 Відображення статусу системи - триває конвертація файлів у текстовий формат

Оскільки оброблювані файли схожі за структурою та об'ємом, на основі статистичних досліджень був зроблений висновок, що у середньому конвертація файлу триває 0,25 с.

Це дозволило візуалізувати процес обробки файлів за допомогою відповідних елементів інтерфейсу користувача. Після закінчення конвертації файлів система виводить на екран відповідне повідомлення (рис. 5.6).

Рис. 5.6 Відображення статусу системи - конвертація файлів у текстовий формат завершена

Після конвертації файлів в текстовий формат відбувається наступний етап - формування та запуск скрипта PowerShell. Для цього необхідно натиснути кнопку „Запустить скрипт”. Аналогічним чином (рис. 5.7 та 5.8) система відображує статус виконання роботи. За статистичними даними обробка файлу триває біля 0,77 с.

Рис. 5.7 Відображення статусу системи - пошук та обробка даних за допомогою скрипта PowerShell

Після закінчення обробки система видає відповідне повідомлення.

Рис. 5.8 Відображення статусу системи - обробка файлів завершена

Після закінчення обробки за допомогою скрипту PowerShell буде сформований файл statOut.csv, який містить всю необхідну інформацію.

Але проглядання, пошук та фільтрація даних у цьому форматі має деякі незручності. Тому після формування вихідного фалу скрипта вся необхідна інформація заноситься до бази даних. Для цього ми нажимаємо кнопку „Сформировать базу данных на основе выходного файла” у головному вікні системи.

Система також дозволяє виключити із набору, що буде відображений у вікні системи деякі групи полів. Інформація залишається в базі даних, але не буде доки відображуватися для користувача. Ця можливість реалізована для того, щоб, по перше зменшити „інформаційний шум” та зосередитись на необхідній інформації, по друге - навіть використовуючи засоби PowerShell, час обробки інформації є достатньо великим, у зв'язку з великим накопиченим об'ємом даних. Тому в наступному вікні (рис. 5.9) користувач системи в змозі обрати групи полів, що будуть відображені у вікні результатів пошуку.

Рис. 5.9 Вибір груп полів, що будуть відображені у вікні результатів пошуку

Нарешті, після здійснення всіх операцій, ми можемо побачити вікно із зібраними статистичними даними (рис. 5.10). Як вже було зазначено вище, інтерфейс системи був спроектований за допомогою пакету альтернативних компонентів Development Express. Використання компонентів Development Express дозволило автоматизувати процес сортування та фільтрації даних в головній таблиці. Після отримання необхідного набору, дані можна експортувати в MS Excel, натиснувши відповідну кнопку.

Рис. 5.10 Вікно відображення результатів пошуку, фільтрації та експорту статистичних даних

5.4 Програмна реалізація системи

5.4.1 Реалізація інтерфейсної оболонки засобами Delphi

При роботі системи використовується файл бази даних формату mdb, який містить три не пов'язані між собою таблиці. Розглянемо структуру полів цих таблиць.

Перша таблиця - довідник професій - призначена для зберігання інформації про професії, стосовно яких ведеться пошук.

Рис. 5.11 Структура полів таблиці - довідника професій

Аналогічну структуру має таблиця - довідник захворювань.

Рис. 5.12 Структура полів таблиці - довідника професій

Кожна з таблиць має спеціальне поле-ознаку, тобто назва професії або захворювання може бути присутньою в базі даних, але пошук по цим назвам здійснюватися не будить.

Третя таблиця призначена для зчитування інформації з вихідного файлу statOut.csv та проміжного зберігання інформації. Розглянемо призначення полів цієї таблиці більш детально.

Рис. 5.13 Структура полів таблиці для проміжного зберігання інформації

Наступна подія відбувається при створенні головної форми системи

procedure Tmain.FormCreate(Sender: TObject);

var f:TSearchRec;

begin

path:=extractfilepath(Application.ExeName); // визначення повного шляху

до виконавчого файлу системи

end;

При появі головної форми системи зчитуємо з таблиць бази інформацію про те, для яких професій та захворювань вестиметься пошук и формуємо відповідні списки. Також зчитуємо інформацію із ini-файлу про те, які категорії полів нам потрібно експортувати в MS Excel.

procedure Tmain.FormShow(Sender: TObject);

var j:integer;

begin

ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'my.ini'); // створення

об'єкту - ini-файлу

for j:=0 to customize.sCheckListBox1.Items.Count-1 do // перебираємо в

циклі усі категорії полів, що знаходяться у списку

customize.sCheckListBox1.Checked[j]:=ini.ReadBool('pole','p'+inttostr(j),tr

ue) ; // зчитуємо інформацію з ini-файлу і, якщо поле активне,

встановлюємо наптроти його назви прапорець

ini.Free; // знищуємо об'єкт ini-файл

ADOTable1.First; // перехід на перший запис таблиці - довідника

професій

sCheckListBox1.Clear; // очищаємо список професій

while not ADOTable1.Eof do // перебираємо усі записи

begin

sCheckListBox1.Items.Add(ADOTable1prof.AsString); // додаємо назву

професії в список

sCheckListBox1.Checked[ADOTable1.RecNo-1]:=

ADOTable1checked.AsBoolean; // встановлюємо ознаку, чи вестиметься

пошук для цієї професії

ADOTable1.Next // перехід до наступного запису

end;

ADOTable2.First; // перехід на перший запис таблиці - довідника

захворювань

sCheckListBox2.Clear; // очищаємо список захворювань

while not ADOTable2.Eof do // перебираємо усі записи

begin

sCheckListBox2.Items.Add(ADOTable2zabolevanie.AsString); // додаємо

назву захворювання в список

sCheckListBox2.Checked[ADOTable2.RecNo-1]:=

ADOTable2checked.AsBoolean; // встановлюємо ознаку, чи вестиметься

пошук для цього захворювання

ADOTable2.Next // перехід до наступного запису

end;

end;

Розглянемо процедуру зберігання інформації в ini-файлі

procedure Tcustomize.sButton1Click(Sender: TObject);

var j:integer;

begin

ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'my.ini'); // створення

об'єкту - ini-файлу

for j:=0 to sCheckListBox1.Items.Count-1 do // перебираємо в циклі усі

елементи списку

ini.writebool('pole','p'+inttostr(j),sCheckListBox1.Checked[j]); // якщо

прапорець встановлений, записуємо відповідне значення в ini-файл

ini.Free; // знищуємо об'єкт ini-файл

close

end;

Додавання професій або захворювань в базу даних здійснюється за допомогою наступних процедур.

procedure Tmain.sButton1Click(Sender: TObject);

begin

if sEdit1.Text='' then // якщо поле назви професії пусте

begin

ShowMessage('Вы не ввели профессию');

exit // завершення процедури

end;

ADOTable1.Insert; // додаємо запис в таблицю бази даних

ADOTable1prof.AsString:=sEdit1.Text; // заносимо введену інформацію

у відповідне поле

ADOTable1.Post;

main.FormShow(Sender); // оновлення списку

end;

procedure Tmain.sButton2Click(Sender: TObject);

begin

if sEdit2.Text='' then // якщо поле назви захворювання пусте

begin

ShowMessage('Вы не ввели болезнь!');

exit // завершення процедури

end;

ADOTable2.Insert; // додаємо запис в таблицю бази даних

ADOTable2zabolevanie.AsString:=sEdit2.Text; // заносимо введену

інформацію у відповідне поле

ADOTable2.Post;

main.FormShow(Sender); // оновлення списку

end;

За допомогою наступних процедур здійснюється видалення інформації.

procedure Tmain.N1Click(Sender: TObject);

begin

ADOTable1.Locate('prof',sCheckListBox1.Items[sCheckListBox1.ItemInde

x],[]); // пошук в таблиці бази даних обраної в списку професії

ADOTable1.Delete;// видалення рядку

main.FormShow(Sender); // оновлення списку

end;

procedure Tmain.MenuItem1Click(Sender: TObject);

begin

ADOTable2.Locate('zabolevanie',sCheckListBox2.

Items[sCheckListBox2.ItemIndex],[]); // пошук в таблиці бази даних

обраного в списку захворювання

ADOTable2.Delete; // видалення рядку

main.FormShow(Sender); // оновлення списку

end;

Розглянемо процедуру перетворення вхідної інформації у тестовий формат.

procedure Tmain.sBitBtn1Click(Sender: TObject);

var

f:TSearchRec;

begin

memo1.Clear; // очищаємо компонент

memo1.Lines.Add('del '+path+'\doc\*.txt');// формуємо команду -

видалити усі текстові файли в заданому каталозі

bat_path:=path+'\delete_txt.bat'; // формуємо повний шлях до bat-файлу

(він з'явиться в тому ж каталозі, де і розташований виконавчий файл

системи

Memo1.Lines.SaveToFile(bat_path);// зберігаємо текст команди в

зовнішньому bat-файлі

ShellExecute(Handle, nil, PChar(bat_path), nil, nil, SW_HIDE); //

виконуємо створений bat-файл

if FindFirst(path+'\doc\*.doc', faAnyFile, f)<>0 then // проводимо

перевірку, чи присутні файли формату doc в робочому каталозі

begin

Showmessage('Исходных файлов в папке нет!');

exit; // завершення роботи процедури

end;

bat_path:=path+'\conv.bat'; // формуємо повний шлях до командного

файлу, за допомогою якого будемо проводити конвертацію файлів у

формат txt

memo1.Clear;

memo1.Lines.Add(path+'DocConverterX.exe '+path+'doc\*.doc '+path+'doc\

-cTXT'); // формуємо команду, де вказаний повний шлях до

зовнішнього конвертору та папки, де зберігаються файли

Memo1.Lines.SaveToFile(bat_path); // створюємо командний файл

ShellExecute(Handle, nil, PChar(bat_path), nil, nil, SW_HIDE); //

запускаємо файл на виконання

sLabel1.Caption:='Идет преобразование данных в текстовый формат';

sLabel1.Visible:=true;

sLabel2.Visible:=true;

ii:=0;

repeat // в цьому циклі ми підраховуємо загальну кількість фалів, що

будуть конвертовані у текстовий формат

ii:=ii+1;

until FindNext(f) <> 0;

FindClose(f);

sLabel2.Caption:='Количество файлов -'+inttostr(ii); // виводимо

кількість файлів з вхідною інформацією

sProgressBar1.Max:= ii div 4; // вважаємо, що конвертація одного файлу

триває в середньому 0,25 с

sProgressBar1.Position:=0;

sLabel3.Visible:=true;

sLabel3.Caption:='Ориентрировочное время обработки - '+inttostr(ii div

4)+' c'; // виводимо орієнтований час обробки даних

Timer1.Enabled:=true; // запускаємо таймер, за допомогою якого буде

візуалізований час обробки даних

end;

Розглянемо процедуру, за допомогою якої можна визначити, чи закінчилася конвертація файлів у текстовий формат.

procedure Tmain.Timer1Timer(Sender: TObject);

var Wnd: hWnd;

buff: array[0..127] of Char;

begin

flag:=false;

Wnd := GetWindow(Handle, gw_HWndFirst);

while Wnd <> 0 do begin // перебираємо усі процеси, що запущені в

системі, не враховуючи:

if (Wnd <> Application.Handle) and // власне вікно системи

(GetWindow(Wnd, gw_Owner) = 0) and // дочірні вікна

(GetWindowText(Wnd, buff, sizeof(buff)) <> 0) // вікна без заголовків

then begin

GetWindowText(Wnd, buff, sizeof(buff)); // отримуємо назву процесу

if StrPas(buff)= 'Total Doc ConverterX' then flag:=true; // ознака того, що

конвертація ще не завершена - процес з назвою 'Total Doc ConverterX'

запущений

end;

Wnd := GetWindow(Wnd, gw_hWndNext);

end;

sProgressBar1.Position:=sProgressBar1.Position+1; // збільшуємо позицію

візуального елементу, що відображає процес виконання

if not flag then // якщо процес закінчено

begin

Timer1.Enabled:=false; // зупиняємо таймер

sLabel1.Caption:='Преобразование в текстовый формат закончено!'; //

виводимо відповідне повідомлення на екран

end;

end;

Схожим чином відбувається процедура запуску на виконання сформованого скрипту PowerShell.

procedure Tmain.sBitBtn2Click(Sender: TObject);

var

f:TSearchRec;

begin

if FindFirst(path+'\doc\*.txt', faAnyFile, f)<>0 then // визначаємо, чи є в

робочому каталозі текстові файли

begin

Showmessage('Файлы для обработки данных не найдены!');

exit; // завершення роботи процедури

end;

bat_path:=path+'\shell.bat'; // визначаємо шлях до командного файлу

memo1.Clear;

memo1.Lines.Add('D:\WINDOWS\system32\WindowsPowerShell\v1.0\po

wershell.exe '+path+'script.ps1'); // формуємо текст команди - повний

шлях до утиліти powershell.exe та шлях до виконуємого скрипта

Memo1.Lines.SaveToFile(bat_path); // створюємо командний файл

ShellExecute(Handle, nil, PChar(bat_path), nil, nil, SW_HIDE);//

запускаємо командний файл на виконання

sLabel1.Caption:='Идет сбор и обработка данных';

sLabel1.Visible:=true;

sLabel2.Visible:=true;

ii:=0;

repeat // в циклі визначаємо кількість файлів, що будуть оброблені


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.