Главная Рефераты по сексологии Рефераты по информатике программированию Рефераты по биологии Рефераты по экономике Рефераты по москвоведению Рефераты по экологии Краткое содержание произведений Рефераты по физкультуре и спорту Топики по английскому языку Рефераты по математике Рефераты по музыке Остальные рефераты Рефераты по авиации и космонавтике Рефераты по административному праву Рефераты по безопасности жизнедеятельности Рефераты по арбитражному процессу Рефераты по архитектуре Рефераты по астрономии Рефераты по банковскому делу Рефераты по биржевому делу Рефераты по ботанике и сельскому хозяйству Рефераты по бухгалтерскому учету и аудиту Рефераты по валютным отношениям Рефераты по ветеринарии Рефераты для военной кафедры Рефераты по географии Рефераты по геодезии Рефераты по геологии Рефераты по геополитике Рефераты по государству и праву Рефераты по гражданскому праву и процессу Рефераты по делопроизводству Рефераты по кредитованию Рефераты по естествознанию Рефераты по истории техники Рефераты по журналистике Рефераты по зоологии Рефераты по инвестициям Рефераты по информатике Исторические личности Рефераты по кибернетике Рефераты по коммуникации и связи |
Дипломная работа: Візуальний облік вхідних даних інтерфейсу RS-232Дипломная работа: Візуальний облік вхідних даних інтерфейсу RS-232МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ ЧЕРНІВЕЦЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ ІМЕНІ ЮРІЯ ФЕДЬКОВИЧА Фізичний факультет Кафедра комп’ютерних систем та мереж 7.091501 комп’ютерні системи та мережі Візуальний облік вхідних даних інтерфейсу RS-232 Дипломна робота 2010 АНОТАЦІЯ Програма Візуальний облік вхідних даних інтерфейсу RS-232” призначена для ведення обліку даних, що поступають на вхід стандартного інтерфейсу RS-232(COM-порт), а також для графічного відображення вхідних даних у вигляді графіку та збереження отриманих даних у файлах відповідних форматів. Програма дозволяє відображувати дані, що приходять на СОМ-порти, у вигляді, який необхідний користувачу. Для відображення графіку використовуються низка опцій, за допомогою яких користувач може отримати зображення графіка таким, який йому необхідний. Програмний продукт реалізований за допомогою інструментальних засобів візуально об’єктно-орієнтованої мови програмування високого рівня Delphi 6.0. ВСТУП На сучасному етапі темпи розвитку комп’ютерної техніки надзвичайно високі. В зв’язку з цим кожного дня в світ виходять десятки нових периферійних пристроїв, які можна підключати до персонального комп’ютера. І саме тому для людей, як займаються розробкою та удосконаленням існуючих пристроїв гострою є проблема написання програм, які могли б аналізувати дані, що приходять на порти ЕОМ, адже для цього необхідно мати фундаментальні знання функціонування портів. Програмне забезпечення для обслуговування портів існує, проте воно є спеціалізоване, і в більшості випадків написане на мовах низького рівня програмування, що вимага від користувачів вивчення основ функціонування самих ОС. До того ж зручний інтерфейс таких програм було досить складно розробляти. Раніше для написання програм даного типу використовувалясь мова програмування Assembler, яка дозволяла напряму працювати з портами та регістрами. При цьому ОС були однозадачними, і тому не було сенсу враховувати те, дані, які поступають на порт призначені зовсім іншому додатку. Ось чому написати програму, яка працю з пристроєм через COM-порт, для MS-DOS було не так важко і це часто робили не програмісти, а самі розробники пристроїв. З платформою Win32 дана проблема є більш складною. Складніше зробити зручний нтерфейс користувача, чим зазвичай і займаються професійні програмісти. Звичайно, працювати безпосередньо з регістрами портів було досить зручно, але у Windows це не можливо. Однак перевагою програмування для Win32 є те, що не принциповим питанням роботи різними реалізаціями цих портів (i8055, 16450, 16550A), а також відсутня проблема розробки обробників переривань. Все це здійснюється самою операційною системою. Програмісту достатньо знати лише з якими структурами працює даний порт. В даній роботі була зроблена програма, яку можна було б використати для графічного відображення даних, що поступають на стандартні інтерфейси ЕОМ, зокрема СОМ-порт, для Win32 операційних систем. Програма не вимагає від користувача спеціалізованих навичок в роботі з комп’ютером, оскільки написана з використанням стандартних елементів інтерфейсу операційної системи Windows. Програма призначена для візуального відображення даних, що надходять на інтерфейс RS-232, а також для їх обробки, яка включає в себе: Можливість візуального відображення отриманих даних у вигляді: лінійно гістограми; звичайного графіка; табличних значень; Автоматичне маштабування отриманої інформації по осях координат (кількість, частота); Можливість збереження даних з подальшим їх зчитуванням; Збереження графіків у відповідних графічних форматах; Можливість згладження графіка функції; Отримання результатів вимірювань протягом періоду часу, що залежить лише від розміру оператичної пам’яті та розміру файла підкачки. В програмі реалізована можливість подальшого використання отримання даних для нших інтерфейсів ЕОМ. Для цього необхідно лише створити модулі читання даних з відповідних інтерфейсів. 1. ТЕХНІЧНЕ ЗАВДАННЯ Назва: Візуальний облік вхідних даних інтерфейсу RS-232”. Програма призначена для візуального відображення даних, що поступають на вхід стандартного інтерфейсу RS-232(COM-порт), а також для графічного відображення вхідних даних у вигляді графіку та збереження отриманих даних у файлах відповідних форматів. Програма може використовуватись при дослідженні працездатності, правильност функціонування та статистичного аналізу даних, що поступають з пристрою, який підключений до СОМ-порту ЕОМ. 1.1 Мета розробки Дана програма допомогає користувачам (особливо радіотехнічних спеціальностей) отримувати числові значення, проводити візуальне спостереження за зміною отримуваних даних в реальному часі з подальшим їх збереженням у зручному для користувача форматі як текстовому, так і графічному. 1.2 Вимоги до функціональних характеристик Програма повинна відповідати наступним вимогам: працювати під управлінням операційних систем типу Windows 9.x/NT/XP. відображати дані як у вигляді графіка функції, так і в табличному представленні. забезпечити можливість вибору інтерфейсів, з якого будуть отримуватись дані. зберігати у відповідних форматах файлів текстову та графічну інформацію. 1.3 Вимоги до середовища експлуатації Рекомендован технічні параметри для робочої станції для нормального функціонування програми наведен нижче. - Процесор Intel Pentium 75 Mhz. - Об’єм ОЗП – 8 МБ. - 300 КБ вільного простору на жорсткому диску. - Графічна система, що дозволяє забезпечити роздільну здатність 800x600 пікселів. Необхідними вимоги до системного програмного забезпечення являється тільки наявність операційної системи Windows 95 або вище. 2. АНАЛІТИЧНИЙ ОГЛЯД 2.1 Основн типи портів До основних типів портів персонального комп’ютера відносять наступні: • послідовн нтерфейси(СОМ – порти або RS-232); • паралельн нтерфейси (LPT – порти); • інш нтерфейси Паралельн нтерфейси характеризуються тим, що в них для передачі біт у слов використовуються окремі сигнальні лінії, і біти передаються одночасно. Паралельні інтерфейси використовують логічні рівні ТТЛ (транзисторно-транзисторної логіки), що обмежує довжину кабелю через невисоку перешкодозахищеність ТТЛ-інтерфейса. Гальванічна розв'язка відсутня. Паралельн нтерфейси використовують для підключення принтерів. Передача даних може бути як односпрямованою (Centronics), так і двоспрямованою (Bitronics). Інод паралельний інтерфейс використовують для зв'язку між двома комп'ютерами. Для підключення принтера по інтерфейсу Centronics у PC був введений порт паралельного інтерфейсу — так виникла назва LPT-nopт (Line PrinTer — порядковий принтер). Хоча зараз через цей порт підключаються не тільки порядкові принтери, назва «LPT» залишилася. Адаптер паралельного інтерфейсу являє собою набір регістрів, розташованих у простор введення/висновку. Регістри порту адресуються щодо базової адреси порту, стандартними значеннями якого є 378h и 278h. Порт може використовувати лінію запиту апаратного переривання, звичайно IRQ7 або IRQ5. Порт має зовнішню 8-бітну шину даних, 5-бітну шину сигналів стану і 4-бітну шину керуючих сигналів. BIOS підтримує до чотирьох (іноді до трьох) LPT-портів (LPT1-LPT4) своїм сервісом перериванням INT 17h, що забезпечує через них зв'язок із принтером по нтерфейсі Centronics. Цим сервісом BIOS здійснює висновок символу (по опитуванню готовності, не використовуючи апаратних переривань), ініціалізацію нтерфейсу і принтера, а також опитування стану принтера. Послідовний нтерфейс для передачі даних використовує одну сигнальну лінію, по якій нформаційні біти передаються друг за другом послідовно. Звідси й назва нтерфейсу і порту. Англійські терміни — Serial Interface і Serial Port. Послідовна передача дозволяє скоротити кількість сигнальних ліній і збільшити дальність зв'язку. Характерною рисою є застосування не-ТТЛ сигналів. У ряд послідовних інтерфейсів застосовується гальванічна розв'язка зовнішніх сигналів від схемної землі пристрою, що дозволяє з'єднувати пристрої, що знаходяться під різними потенціалами. Послідовна передача даних може здійснюватися в асинхронному або синхронному режимах. При асинхронній передачі кожному байтові передує стартовий-байт, що сигналізу приймачеві про початок посилки, за яким слідують біти даних і, можливо, біт паритету. Завершує посилку стоп-байт, що гарантує паузу між посилками. Стартовий-байт наступного байта посилається в будь-який момент після стопового-байта, тобто між передачами можливі паузи довільної тривалості. Байт, що має завжди строго визначене значення (логічний 0), забезпечує простий механізм синхронізац приймача але сигналові від передавача. Мається на увазі, що приймач і передавач працюють на одній швидкості обміну. Внутрішній генератор синхронізації приймача використовує лічильник-дільник опорної частоти, обнулюються у момент прийому початку стартового-байта. Цей лічильник генерує внутрішні строби, по яких приймач фіксує наступні приймаючі біти. В ідеалі строби розташовуються в середині бітових інтервалів, що дозволяє приймати дані і при незначній неузгодженості швидкостей приймача і передавача. 2.2 Основні характеристики СОМ-портів та їх застосування На фізичному рівні послідовний інтерфейс має різні реалізації, що розрізняються способом передачі електричних сигналів. Існує ряд стандартів: RS-232C, RS-423A, RS-422A і RS-485. Несиметричн лінії інтерфейсів RS-232C і RS-423A мають саму низьку захищеність від синфазно перешкоди, диференціальний вхід приймача RS-423A трохи зм'якшує ситуацію. Кращ параметри має двохточковий інтерфейс RS-422A і його магістральний аналог RS-485, що працюють на симетричних лініях зв'язку. У них для передачі кожного сигналу використовуються диференціальні сигнали з окремої парою проводів. Найбільше поширення в PC одержав найпростіший з перерахованих — стандарт RS-232C, реалізований Сомами-портами. У промисловій автоматиці широко застосовується RS-485, а також RS-422A, що зустрічається й у деяких принтерах. Існують перетворювачі сигналів для узгодження цих родинних інтерфейсів. Стандарт RS-232C використовує несиметричні передавачі і приймачі - сигнал передається щодо загального проводу — схемної землі. Інтерфейс НЕ ЗАБЕЗПЕЧУЄ ГАЛЬВАНІЧНОЇ РОЗВ'ЯЗКИ пристроїв. Логічній одиниці відповідає напруга на вході приймача в діапазоні -• 12...-3 В. Для ліній керуючих сигналів цей стан називається ON («включене»), для ліній послідовних Даних — MARK. Логічному нулеві відповіда діапазон +3...+12 В. Для ліній керуючих сигналів стан називається ОFF(«виключене»), а для ліній послідовних даних — SPACE. Діапазон -3...+3 В зона нечутливості, що обумовлює гистерезис приймача: стан лінії буде вважатися зміненим тільки після Перетинання порога (мал. 2.5). Рівні сигналів на виходах передавачів повинні бути в діапазонах -12...-5 В и +5...+12 В для представлення одиниці і нуля відповідно. Різниця потенціалів між схемними землями пристроїв, що з'єднуються, повинна бути менш 2 В, при більш високій різниці потенціалів можливо невірне сприйняття сигналів. Інтерфейс припускає наявність ЗАХИСНОГО ЗАЗЕМЛЕННЯ для пристроїв, що з'єднуються, якщо вони обоє живляться від мереж змінного струму і мають мережеві фільтри. Послідовний нтерфейс СОМ-порт (Communication Port — комунікаційний порт) з'явився в перших моделях IBM PC. Він був реалізований на мікросхемі асинхронного прийому передатчиків Intel 8250. Порт мав підтримку BIOS (INT 14h), однак широко застосовувалося ( застосовується) взаємодія з портом на рівні регістрів. Тому у всіх PC-сумісних комп'ютерах для послідовного інтерфейсу застосовують мікросхеми прийомопередатчиків, сумісні з 18250. У ряді вітчизняних PC-сумісних комп'ютерів для послідовного інтерфейсу застосовувалася мікросхема КР580ВВ51 — аналог i8251. Сумісності з PC на рівні регістрів Сома-порту такі комп'ютери не мають. Сумісність на рівні регістрів СОМ-порту вважається необхідною. Багато розроблювачів комунікаційних пакетів пропонують роботу і через BІOS INT 14h, однак на високих швидкостях це неефективно. Говорячи про СоОМ-порт PC, за замовчуванням будемо мати на увазі сумісність реєстрової моделі з i8250 реалізацію асинхронного інтерфейсу RS-232C. Хоча на даний час існують більш швидкі комунікаційні інтерфейси, однак виробники материнських плат включають в склад своїх продуктів підтримку цих портів. Адже в світі залишилося багато техніки, яка використовує старі СОМ та LPT порти. Для цих портів розробляють навіть деякі сучасні периферійні пристрої. До областей застосування СОМ-порту можна віднести: підключення маніпуляторів (миша, трекбол) підключення зовнішніх модемів зв'язку двох комп'ютерів підключення принтерів і плоттеров підключення електронних Ключів беспроводних комунікацій та деякі інші Комп'ютер може мати до чотирьох послідовних портів СОМ 1-COM4 (для машин класу AT типова наявність двох портів). Сом-порти мають зовнішні раз’єми вилку DB25P або DB9P, виведені на задню панель комп'ютера. Соми-порти реалізуються на мікросхемах UART, сумісних із сімейством 18250. Вони займають у просторі введення/висновку по 8 суміжних 8-бітних регістрів і можуть розташовуватися по стандартних базових адресах. Порти виробляють апаратн переривання. Можливість поділюваного використання однієї лінії запиту декількома портами (або її поділу з іншими пристроями) заноситься від реалізації апаратного підключення і ПО. При використанні портів, установлених на твань ISA, поділювані переривання звичайно не працюють. 2.4 Конфігурація СОМ-портів Керування послідовним портом розділяється на дна етапу — попереднє конфигурування (Setup) апаратних засобів порту і поточне (оперативне) переключення режимів роботи прикладним або системним ПО. Конфигурування СОМ-порту залежить від його виконання. Порт на платі розширення конфигурується джамнерами на самій платі. Порт на системній платі конфигурується через BIOS Setup. Конфигуруванню підлягають наступні параметри: Базова адреса, що може мати значення 3F8h, 2F8h, 3E8h (3EOh, 338h) або 2E8h (2EOh, 238h). При ініціалізації BIOS перевіряє наявність портів по адресах саме в цьому порядку і привласнює виявленим портам логічні імена СОМ1, COM2, COM3 COM4. Для PS/2 стандартними для портів СОМЗ-СОМ8 є адреси 3220h,3228h,4220h, 4228h, 5220h і 52281) відповідно. Використовувана лінія запиту переривання: для СОМ1 і COM3 звичайно використовується IRQ4 або IRQ11, для COM2 і COM4 — IRQ3 або IRQ10. У принципі номер переривання можна призначати в довільних сполученнях з базовою адресою (номером порту), але деяк програми і драйвери набудовані на стандартні сполучення. Кожному портові, що відповіда апаратному перериванні, призначають окрему лінію, що не збігається з лініями запиту переривань інших пристроїв. Переривання необхідні для портів, до яких підключаються пристрої введення, UPS або модеми. Режим роботи порту за замовчуванням (2400 біт/з, 7 біт даних, 1 стогін-битий контроль парності), заданий при ініціалізації порту під час BIOS POST, може змінюватися в будь-який момент при настроюванні комунікаційних програм або командою DOS MODE COMx: із указівкою параметрів. У процесі початкового тестування POST BIOS перевіряє наявність послідовних портів (регістрів UART 8250 або сумісних) по стандартних адресах і поміщає базов адреси виявлених портів в осередки ВІOS Data Area 0:0400, 0402, 0404, 0406. Ц осередки зберігають адреси портів з логічними іменами СОМ1-COM4. Нульове значення адреси є ознакою відсутності порту з даним номером. В осередки 0:047С, 047D, 047Е, 047F заносяться константи, що задають тайм-аут для портів. Виявлен порти иніціалізуються на швидкість обміну 2400 біт/з, 7 біт даних з контролем на парність, 1 стоп-битий. Керуючі сигнали інтерфейсу DTR і RTS переводяться у вихідний стан («виключена» — позитивна напруга). Порти підтримуються сервісом BIOS INT 14h, що забезпечує наступні функції: 00h ніціалізація (установка швидкості обміну і формату посилок, заданих регістром AL; заборона джерел переривань). На сигнали DTR і RTS впливу не робить (після апаратного скидання вони пасивні). 0lh висновок символу з регістра AL (без апаратних переривань). Активуються сигнали DTR і RTS, і після звільнення регістра THR у нього міститься виведений символ. Якщо за заданий час регістр не звільняється, фіксується помилка тайм-ауту функція завершується. 02h уведення символу (без апаратних переривань). Активується тільки сигнал DTR (RTS переходить у пасивний стан), і очікується готовність прийнятих даних, прийнятий символ міститься в регістр AL. Якщо за заданий час дані не отримані, функція завершується з помилкою тайм-ауту. 03h опитування стану модему і лінії (читання регістрів MSR і LSR). Цю гарантовано швидку функцію звичайно викликають перед функціями введення/висновку щоб уникнути ризику чекання тайм-ауту. 2.5 Структури управління портами У літературі, найчастіше, керування послідовним і паралельним портами описується на рівні регістрів цих портів, причому приклади програм приводяться мовою Assembler. Послідовний порт досить повільний пристрій, до того ж специфічний. Тому в програмах працюючих з портами використовуються переривання. Паралельний порт швидший, але теж повільний і не менш специфічний. Узяти хоча б можливість цього порту працювати в двох напрямках. З послідовними паралельними портами в Win32 працюють як з файлами, проте для правильного функціонування необхідно заповнити певні структури, які задають параметри роботи портів. Працюючи з портами починати треба з його відкриття як файлу. Для цього необхідно використовувати стандартні функції роботи з файлами open fopen. При цьому необхідно скористатися функцією CreateFile. Ця функція описана у Win32 API. Її прототип виглядає так: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); Функція має багато параметрів. Розглянемо короткий опис параметрів даної функції: lpFileName Вказівник на рядок з ім'ям, що відкривається або створюваного файлу. Формат цього рядка може бути дуже складним. Зокрема можна вказувати мережеві імена для доступу до файлів на інших комп'ютерах. Можна відкривати логічні розділи або фізичні диски працювати в обхід файлової системи. Послідовні порти мають імена "COM1", "COM2", "COM3", "COM4". Паралельні порти називаються "LPT1", "LPT2" і так далі. Необхідно врахувати, що якщо до порту СОМ1 підключена миша, Windows не дасть відкрити цей порт. Аналогічно не вдасться відкрити LPT1 якщо підключено принтер. dwDesiredAccess Задає тип доступу до файлу. Можливе використання наступних значень: 0- Опитування атрибутів пристрою без одержання доступу до нього. GENERIC_READ - Файл буде зчитуватися. GENERIC_WRITE - Файл буде записуватися. GENERIC_READ|GENERIC_WRITE- Файл буде і зчитуватися і записуватися. dwShareMode Зада параметри спільного доступу до файлу. Комунікаційні порти не можна робити роздільними, тому даний параметр повинний дорівнювати 0. lpSecurityAttributes Зада атрибути захисту файлу. Підтримується тільки в Windows NT. Однак при роботі з портами повинний у будь-якому випадку дорівнювати NULL. dwCreationDistribution Для комунікаційних портів даний параметр завжди повинен задаватися як OPEN_EXISTING. dwFlagsAndAttributes Зада атрибути створюваного файлу. Так само керує різними режимами обробки. Для наших цілей цей параметр повинний бути або рівним 0, або FILE_FLAG_OVERLAPPED. Нульове значення використовується при синхронній роботі з портом, а FILE_FLAG_OVERLAPPED при асинхронної, або іншими словами, при фоновій обробц введення/виведення. hTemplateFile Зада описувач файлу-шаблона. При роботі з портами завжди повинний дорівнювати NULL. При успішному відкритті файлу, у нашому випадку порту, функція повертає описувач (HANDLE) файлу. При помилці INVALID_HANDLE_VALUE. Відкритий порт повинний бути закритий перед завершенням роботи програми. У Win32 закриття об'єкта по його описувача виконує функція CloseHandle: BOOL CloseHandle( HANDLE hObject ); Функція має єдиний параметр - описувач об'єкта, що закривається. При успішному завершенні функція повертає не нульове значення, при помилці нуль. Відкривши порт ми отримуємо його у своє розпорядження. Тепер з портом може працювати тільки наша програма. Однак, перш ніж займатися введенням/виведенням, ми повинні настроїти порт. Це стосується тільки послідовних портів, для яких необхідно задати швидкість обміну, параметри парності, формат даних та інше. Крім того існує трохи специфічних для Windows параметрів. Мова йде про тайм-аути, що дозволяють контролювати як інтервал між прийнятими байтами, так загальний час прийому повідомлення. Основн параметри послідовного порту описуються структурою DCB. Тимчасові параметри структурою COMMTIMEOUTS. Настроювання порту полягає в заповненні керуючих структур і наступному виклику функцій настроювання. Основну нформацію містить структура DCB: typedef struct _DCB { DWORD DCBlength; // sizeof(DCB) DWORD BaudRate; // current baud rate DWORD fBinary:1; // binary mode, no EOF check DWORD fParity:1; // enable parity checking DWORD fOutxCtsFlow:1; // CTS output flow control DWORD fOutxDsrFlow:1; // DSR output flow control DWORD fDtrControl:2; // DTR flow control type DWORD fDsrSensitivity:1; // DSR sensitivity DWORD fTXContinueOnXoff:1; // XOFF continues Tx DWORD fOutX:1; // XON/XOFF out flow control DWORD fInX:1; // XON/XOFF in flow control DWORD fErrorChar:1; // enable error replacement DWORD fNull:1; // enable null stripping DWORD fRtsControl:2; // RTS flow control DWORD fAbortOnError:1; // abort reads/writes on error DWORD fDummy2:17; // reserved WORD wReserved; // not currently used WORD XonLim; // transmit XON threshold WORD XoffLim; // transmit XOFF threshold BYTE ByteSize; // number of bits/byte, 4-8 BYTE Parity; // 0-4=no,odd,even,mark,space BYTE StopBits; // 0,1,2 = 1, 1.5, 2 char XonChar; // Tx and Rx XON character char XoffChar; // Tx and Rx XOFF character char ErrorChar; // error replacement character char EofChar; // end of input character char EvtChar; // received event character WORD wReserved1; // reserved; do not use } DCB; Якщо уважно придивитися, то можна помітити, що ця структура містить майже всю керуючу інформацію, що у реальності розташовується в різних регістрах послідовного порту. Тепер розберемося, що означає кожне з полів найважливішо структури: DCBlength Зада довжину, у байтах, структури DCB. Використовується для контролю коректност структури при передачі її адреси у функції настроювання порту. BaudRate Швидкість передачі даних. Можлива вказівка наступних констант: CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000. Як видно, ці константи відповідають усім стандартним швидкостям обміну. Насправді, це поле містить числове значення швидкості передачі, а константи просто символічними іменами. Тому можна вказувати, наприклад, і CBR_9600, і просто 9600. Однак рекомендується вказувати символічні константи. fBinary Включа двійковий режим обміну. Win32 не підтримує недвійковий режим, тому дане поле завжди повинне бути дорівнює 1, або логічній константі TRUE. У Windows 3.1, якщо це поле було дорівнює FALSE, включається текстовий режим обміну. У цьому режимі символ, що надійшов на вхід порту, заданий полем EofChar свідчив про кінець прийнятих даних. fParity Включа режим контролю парності. Якщо це поле дорівнює TRUE, то виконується перевірка парності, при помилці у програму, видається відповідний код завершення. fOutxCtsFlow Включа режим спостереження за сигналом CTS. Якщо це поле дорівнює TRUE і сигнал CTS скинутий, передача даних припиняється до установки сигналу CTS. Це дозволяє підключеному до комп'ютера приладу призупинити потік передачі в нього інформації, якщо він не встигає її обробляти. fOutxDsrFlow Включа режим спостереження за сигналом DSR. Якщо це поле дорівнює TRUE і сигнал DSR скинутий, передача даних припиняється до установки сигналу DSR. fDtrControl Зада режим керування обміном для сигналу DTR. Це поле може приймати наступн значення: DTR_CONTROL_DISABLE - Забороняє використання лінії DTR DTR_CONTROL_ENABLE - Дозволяє використання лінії DTR DTR_CONTROL_HANDSHAKE - Дозволяє використання рукостискання для виходу з помилкових ситуацій. Цей режим використовується, зокрема, модемами при відновленні в ситуації втрати зв'язку. fDsrSensitivity Зада чутливість комунікаційного драйвера до стану лінії DSR. Якщо це поле дорівню TRUE, то всі прийняті дані ігноруються драйвером (комунікаційний драйвер розташований в операційній системі), за винятком тих, котрі приймаються при установленом сигналі DSR. fTXContinueOnXoff Задає, чи припиняється передача при переповненні буфера прийому і передачі драйвером символу XoffChar. Якщо це поле дорівнює TRUE, то передача продовжується, незважаючи на те, що буфер прийому містить більш XoffLim символів і близький до переповнення, а драйвер передав символ XoffChar для призупинення потоку прийнятих даних. Якщо поле дорівнює FALSE, то передача не буде продовжена доти, поки в буфері прийомуне залишиться менше XonLim символів і драйвер не передасть символ XonChar для поновлення потоку прийнятих даних. У такий спосіб це поле вводить якусь залежність між керуванням вхідним і вихідним потоками інформації. fOut Зада використання XON/XOFF керування потоком при передачі. Якщо це поле дорівню TRUE, то передача зупиняється при прийомі символу XoffChar, і відновляється при прийомі символу XonChar. fIn Зада використання XON/XOFF керування потоком при прийомі. Якщо це поле дорівню TRUE, то драйвер передає символ XoffChar, коли в буфері прийому знаходиться більш ніж XoffLim і XonChar, коли в буфері залишається менш XonLim символів. fErrorChar Вказу на необхідність заміни символів з помилкою парності на символ, що задається полем ErrorChar. Якщо це поле дорівнює TRUE, і поле fParity дорівнює TRUE, то виконується заміна. fNull Визнача дія, яка виконується при прийомі нульового байта. Якщо це поле TRUE, то нульов байти відкидаються при передачі. fRtsControl Зада режим керування потоком для сигналу RTS. Якщо це поле дорівнює 0, то за замовчуванням мається на увазі RTS_CONTROL_HANDSHAKE. Поле може приймати одне з наступних значень: RTS_CONTROL_DISABLE - Забороняє використання лінії RTS RTS_CONTROL_ENABLE - Дозволяє використання лінії RTS RTS_CONTROL_HANDSHAKE - Дозволяє використання RTS рукостискання. Драйвер встановлює сигнал RTS коли прийомний буфер заповнений менш, ніж на половину, і скидає, коли буфер заповнюється більш ніж на три чверті. RTS_CONTROL_TOGGLE - Задає, що сигнал RTS встановлений, коли є дані для передачі. Коли всі символи з буфера передані, сигнал скидається. fAbortOnError Зада гнорування всіх операцій читання/запису при виникненні помилки. Якщо це поле дорівнює TRUE, драйвер припиняє всі операції читання/запису для порту при виникненні помилки. Продовжувати працювати з портом можна буде тільки після усунення причини помилки і виклику функції ClearCommError. fDummy2 Зарезервовано не використовується. wReserved Не використовується і повино бути встановлене в 0. XonLim Зада мінімальне число символів в буфері прийому перед посилкою символу XON. XoffLim Визнача максимальну кількість байт у буфері прийому перед посилкою символу XOFF. Максимально припустима кількість байт у буфері обчислюється вирахуванням даного значення з розміру применого буфера в байтах. ByteSize Визнача число інформаційних біт у переданих і прийнятих байтах. Parity Визнача вибір схеми контролю парності. Дане поле повинне містити одне з наступних значень: EVENPARITY Доповнення до парності MARKPARITY Біт парності завжди 1 NOPARITY Біт парності відсутній ODDPARITY Доповнення до непарності SPACEPARITY Біт парності завжди 0 StopBits Зада кількість стопових біт. Поле може приймати наступні значення: ONESTOPBIT- Один стоповый біт ONE5STOPBIT - Півтора стоповых біта TWOSTOPBIT - Два стоповых біти XonChar Зада символ XON, який використовується як для примйому, так і для передачі. XoffChar Зада символ XOFF, який використовується як для прийому, так і для передачі. ErrorChar Зада символ, що використовується для заміни символів з помилковою парністю. EofChar Зада символ, що використовується для сигналізації про кінець даних. EvtChar Зада символ, що використовується для сигналізації про подію. wReserved1 Зарезервовано не використовується. Так, як поля структури DCB використовуються для конфигурування мікросхем портів, то на них накладаються певні обмеження. Розмір байта повинний бути 5, 6, 7 або 8 біт. Комбінація з п'яти бітного байта і двох стопових біт є неприпустимою. Так само як і комбінація із шести, семи або восьми бітного байта і півтора стопових біт. Розглянута нами структура DCB найбільша з усіх, що використовуються для настроювання послідовних портів. Але вона і найважливіша. Заповнення всіх полів ц структури може викликати ускладнення, тому що треба дуже чітко представляти як працює послідовний порт. Тому ручну установку полів можна порекомендувати досвідченим програмістам. Якщо ж Ви почуваєте себе не дуже упевнене, скористайтеся функцією BuildCommDCB, що дозволяє заповнити поля структури DCB на основі рядка, по синтаксисі аналогічному рядкові команди mode 3. ПРОЕКТНО-ПОЯСНЮВАЛЬНИЙ РОЗДІЛ 3.1 Вибір інструментальних засобів розробки програми Найважливішим питанням, перед створенням – вибір інструментальних засобів, за допомогою яких буде реалізована програма. В цьому напрямку потрібно розглянути наступні засоби: Засоби низького рівня. Їх характеризує висока швидкодія, можливість написання коду програми на низькому рівні. До недоліків можна віднести відносну непрозорість коду, ускладнення самого кодування, яке вимагає створення програми, яка б працювала в захищеному режимі, що відповідно збільшує саму складність розробки даної програми, а також багато ручної роботи. Прикладами можуть бути Assembler та інші мови низького програмування. RAD-засоби. RAD (Rapid Application Development – Швидка Розробка Додатків)-засоби характеризуються легкістю супроводу, високою швидкістю створення додатків, гнучкістю, великою кількістю компонент для проектування, прозорістю програмного коду. До таких засобів відносяться Delphi, C++ Builder, Jbuilder, VisualBasic т.д.; HTML-технолог та застосування мов написання сценаріїв – Perl, JavaScript, VBScript. Очевидним недоліком є неможливість роботи даних систем з апаратурою ЕОМ тому, що вони, як правило, є апаратно незалежними від неї і покладають все на ОС. З вище сказаного слідує, що перевагу слід надати RAD-засобам. Додатки, що написані з їх допомогою, можна легко масштабувати, вони мають достатню універсальність. Вибір засобів програмування звузився до вибору Delphi чи C++ Builder, оскільки вони є найбільш близькими до синтаксису відповідних мов Pascal та C++. Оскільки для мене більш звично програмувати на мові Pascal, то мій вибір зупинився на Delphi. Проте великих розбіжностей між Delphi чи C++ Builder немає. Ус компоненти, форми і модулі даних, працюють у Delphi та C++Builder для Windows без будь-яких змін. Delphi залишається найлегшою у використанні і самою продуктивною RAD-системою. C++Builder ідеально підійде тим розробникам, що надають перевагу програмуванню мовою C++, і хочуть зберегти продуктивність Delphi. Унікальний взаємозв'язок цих систем програмування дозволяє при створенні додатка без ускладнень переходити з одного середовища розробки в ншу. Політика, що проводиться сучасними виробниками програмного забезпечення світу, полягає в відносній сумісності з іншими мовами програмування. Неухильно слідуючи цій політиці, C++Builder зберігає матеріальні вкладення в Delphi, увібравши в себе бібліотеку візуальних компонентів, інтуїтивне інтегроване середовище, візуальн механізми двонаправленої розробки, методику наслідування форм і різномасштабн засоби доступу до баз даних та апаратного забезпечення. Таким чином питання вибору між вище описаними двома середовищами розробки не таке уже й суттєве, тим більше що обидва ці продукти розроблені однією і тією ж фірмою (Borland). Як правило, всі компоненти, які існують в Builder C++ існують в Delphi. Програмісти можуть працювати в тому середовищі, що краще і швидше забезпечить реалізацію поставленого поточного завдання. Delphi і Builder C++ скомпілюють і зберуть готовий додаток з однаковим успіхом. Написавши деякий об'єкт для проекту Delphi, ви зможете повторно використовувати його, без змін, у проекті Builder C++. Delphi пропонує програмістам дуже простий, легкий в освоєнні синтаксис мови. При реалізації складних проектів великою командою програмістів будь-який її учасник вільний вибрати мову Object Pascal або C++ відповідно до індивідуального смаку, навичками і прихильністю. У будь-яких комбінаціях результатом спільної розробки буде єдина високоефективна програма, що виконується. 3.2 Огляд середовища програмування DELPHI Delphi - це комбінація декількох найважливіших технологій: Високопродуктивний компілятор у машинний код Об’єктно-орієнтована модель компонентів Візуальна побудова додатків із програмних прототипів Масштабуєм засоби для побудови баз даних Новітня система об’єктно-орієнтованого програмування Delphi виробництва корпорац Inprise (Borland) призначена для операційних систем Windows 9.x/NT/XP. Інтегроване середовище Delphi забезпечує швидкість візуальної розробки, продуктивність повторно використовуваних компонентів у поєднанні з потужністю мовних засобів Objict Pascal, удосконаленими інструментами і різномасштабними засобами доступу до баз даних. Delphi може бути використаний скрізь, де потрібно доповнити існуючі додатки розширеним стандартом мови Pascal, підвищити швидкодію і додати користувальницькому нтерфейсові якості професійного рівня. Традиційний підхід до архітектури програмних бібліотек (у тому числі обєктно-орієнтованих) не передбачає розбіжності в поведінці на етапі розробки (design-time) і в період автономного виконання (run-time). Менеджер проекту Новий менеджер проекту дозволяє Вам об'єднувати проекти які працюють разом в єдину проектну групу. Це дозволяє організувати як роботу взаємозалежних проектів, таких як однозадачні та багатозадачні додатки або DLL, так і спільну роботу програм, що виконуються. Новий провідник Новий провідник містить виконувані класи, навігацію по модулях, і браузер коду. Провідник коду робить створення класів простішим, автоматизую багато кроків Уведіть прототип методу в розділі інтерфейсу і властивість виконуваного класу сгенерує кістяковий код у розділі реалізації. Також провідник дозволяє швидко переміщатися через файли модуля, а так само між інтерфейсом і реалізацією. Використання символу Tooltip, дозволяє переглядати інформацію про оголошення будь-якого ідентифікатора, потім використовуючи браузер код, можна перейти до його оголошення. Вікна нструментів, що закріплюються IDE (Інтегроване Середовище Розробки) містить більш гнучку конфігурацію вікон нструментів, які можна закріплювати з редактором коду. Просто перетягніть відпустіть вікно інструменту до того місця, до якого хочете. Провідник коду менеджер проекту можна як закріплювати, так і не закріплювати. Поліпшене налагодження Інтегрований відладчик має багато нових властивостей, включаючи віддалені і багатопроцесорне налагодження, перегляд коду центрального процесора, інспекторів, удосконален точки переривання, відладчик специфічних підміню і закріплених вікон. Удосконалення Active Delphi4 забезпечує розширену підтримку Active. Удосконалення VCL Ієрархія об'єктів Delphi була розширена, щоб включити новий компонент для NT Service додатків. Крім того, новий компонент виконуваного списку (на Стандартній сторінці палітри), дозволяє Вам централізувати керування меню і команд від кнопок. Керування VCL розширене, щоб підтримувати drag-and-drop перетаскування, забезпечувати додатковий контроль над розміщенням вікна, і багато чого іншого. 4. ПРОЕКТНО-ТЕХНОЛОГІЧНИЙ РОЗДІЛ 4.1 Опис діаграми станів Розглянемо діаграму стану програми, яку зображено на рис. 1. Рис. 1. Діаграма стану програми При ніціалізації головної форми здійснюються початкові настройки для відображення вхідних даних та стандарнте заповнення структур для роботи з портами. Після ніціалізації основної форми користувач має доступ до Головного меню та панел нструментів. При виборі пункта Головного меню або кнопки з панелі інструментів відбуваєтьсявиконання певних дій. Опишемо основні пункти Головного меню. Меню включає в себе наступні пункти: Файл Запуск Вид Настройка Допомога Пункт Файл виконує основні операції збереження даних, створення нового графіка та вихід. Пункт Файл містить наступні операції: Новий графік. Призначений для очищення динамічного списку, який містить в собі дані, отримані при зчитуванні з порта або створені генератором. Завантажити дані. Призначений для завантаження даних в динамічний список з файла, який зберігав користувач. Файл повинен мати розширення *.grf, та містити такі дані: дату створення виміру, знак „|”, числове значеня виміру(тип integer). Зберегти графік. Призначений для збереження графіку, який отримав користувач на екрані в результаті роботи програми. Якщо користувач бажає зберегти графік, який не відображається на екрані, то для цього йому необхідно отримати зображення необхідної частини графіка за допомогою полоси прокрутки. Зберегти дані. Призначений для збереження результатів вимірювання в файлі з розширенням *.grf. Вихід. Вихід з програми без попередження про збереження результатів. Пункт Запуск має всього два підпункти, які призначені відповідно для запуску та зупинки отримання даних. При запуску дані, що надійшли передаються в динамічний список, який в подальому є основою для відображення даних на екрані в графічному та текстовому вигляді. Зупинка призначена для зупинки таймера відліку, який призначений для отримання даних з порту в період вказаний користувачем. Пункт Вид призначений для вибору графічного відображення даних. Даний пункт містить групу перемикачів, що дозволяють відображати графік у вигляді простого графіку функції, або у вигляді стовбцевої гістограми. Пункт Настройка призначений для задання опцій портів, а також відображення графіка функції в необхідному для користувачу вигляді. Даний пункт розділений на дв частини: Вибір джерела вхідних даних. Задання опції відображення графіка для сітки та осей координат. Вибір джерела даних являє собою радіогрупу підпунктів для вказання звідки саме будуть зчитуватися дані. Тут передбачена подальше вдосконалення програми, та розширення її можливостей для роботи з LPT портами. Для наглядного зображення працездатності програми в програмі було також використано генератор випадкових чисел. Задання опцій відображення призначені для вибору користувачем можливих опцій настройки портів та таймера, задання відображення осей координат та сітки графіка, вибір кольорів та інше. Розділ Допомога призначений для виводу інформації про прграму, а також виклик вікна, в якому виводиться інструкція користувача даної програми. Для зручності користування програмою всі основні дії, які пов’язані з роботою програми, продубльовані у вигляді кнопок та інших елементів інтерфейсу користувача на основній формі. Так було створено Панель інструментів та задання опцій таймера. 4.2 Опис відношення модулів Рис. 2. Відношення модулів Ініціалізу візуальну обробку даних модуль MainForm. На даній формі ми розмістили елементи нтерфейсу користувача, компоненту для порта, компоненти для роботи головного меню, а також основну компоненту для відображення даних – GraphicDiagram. Як додаткові елементи інтерфейсу, на основну форму були добавлені компоненти для запису та зчитування файлів даних та полосу прокрутки, а також включає в себе основну роботу з реакціями на натискування кнопок панелі інструментів, відображення настройки частоти таймера. Модуль СPort включає в себе всі необхідні структири для функціонування СОМ-порта, а також процедури та функції для настройки порта, отримання та запис даних в порт та деякі інші. Модуль Unit3 призначений для створення додаткових елементів інтерфейсу користувача, включає в себе відображення форми для задання опцій відображення графіка. В даному модуді створерий багатосторінковий блокнот, на листах якого відображаються опції відображення осей координат та сітки графіка. Модуль Unit4 призначений для запуску окремої модальної форми настройки частоти таймера. Тут вказується частота, з якою програма буде звертатися до джерела даних для їх отримання. Частоту необхідно задавати в мілісекундах. 4.2 Техніко-економічні показники Програмний продукт складається з файлів: MainForm.dcu MainForm.dfm основна форма проекту MainForm.pas CPort.dcu CPort.dfm файли, які оперують структурами СОМ-портів CPort.pas Project1.cfg Project1.dof Project1.dpr файли проекту Project1.dsk Project1.exe Project1.res Unit3.dcu Unit3.dfm файли, що релізують настройку відображення графіка Unit3.pas Unit4.dcu Unit4.dfm реалізація форми настройки частоти таймера Unit4.pas aboutBox.dcu aboutBox.dfm форма відомостей про програму та інструкція aboutBox.pas користувача Загальний розмір папки з проектом та тестовими результами становить 1,03 Мb. Запускний файл Project1.exe має розмір 510Кb та отриманий за допомогою компілятора Inprise DELPHI 6.0. 4.5. Виклик та завантаження Трансляція, редагування, завантаження та виконання програми відбувається за допомогою стандартних засобів операційної системи та інтегрованого середовища Delphi 6. Для завантаження програми необхідно завантажити файл Project1.exe. 5. ОПИС РОБОТИ З ПРОГРАМОЮ 5.1 Головна форма програми Рис.3 Основна форма програми. На рис.3. зображений вигляд основної форми. Закриття цього вікна приведе до завершення роботи програми. У верхній частині форми ми можемо побачити головне меню форми, яке і відповідає за основні дії в програмі. Дане меню створене як більшусть стандартних меню ОС Windows, і тому не вимагає від користувача засвоєння нових принципів при роботі з данию програмою. Головна форма, як видно з рис.3 містить наступні елементи інтерфейсу користувача: Головне меню Панель нструментів Панель для відображення графіка Полосу прокрутки Елементи для відображення 15 останніх проведених вимірів Елементи для задання частоти запуску таймера Для запуску програми необхідно натиснути зелену кнопку на Панелі інструментів, або відповідний підпункт меню Запуск. При цьому на графіку починають з’являтися результати вимірів, а також починають змінюватися текстові значення 15 останніх результатів вимірювань. Одночасно з натискання кнопки Запуск інші кнопки Панел нструментів стають неактивними (крім кнопки Зупинити та Про програму). Відповідно до змін на Панелі інструментів неактичними стають також відповідн підпункти основного меню. Це здійснено для того, щоб користувач не мав змоги пошкодити дані, які знаходяться в динамічному списку. 5.2 Компонент GraphicDiagram та зміна його вигляду В центрі головної форми знаходиться розроблена мною компонента для зображення графіку GraphicDiagram. Дана компонента призначена для автоматизованого відображення даних, які знаходяться в динамічному списку даної компоненти. Графік може мати різний вигляд, в залежності від бажань користувача. Він може зображатися у вигляді звичайного графіка функції та лінійної гістограми. Зображення графіка можна змінити за допомогою задання опцій відображення графіка, як знаходяться в підпункті Опції графіка меню Настройки. В даному меню можна змінити відображення осей координат, сітки графіка, а також відповідні їм кольори. По бажанню користувача, графік може зображатися без осей координат та сітки графіка, або мати різні поєднання даних опції. Вигляд даного вікна можна побачити на рис.4. Рис.4. Вікно для задання опцій відображення графіка Для вибору кольору зображення осей або сітки в програмі було використано компонент ColorBox. Зміни у відображенні графіка здійснюються одразу ж після натиснення кнопки Ок. 5.3 Збереження даних та їх формат Для збереження даних служать кнопки Зберегти дані та Зберегти графік. Існують також відповідн підпункти в меню Файл. При натисненні на дані кнопки відкриваються відповідно діалоги для збереження та читання даних з файлів. В даних діалогах користувач може вибирати каталоги, куди необхідно записати дані, а також створювати нові, якщо це необхідно. Дані діалоги надають зручний інтерфейс для користувача. Рис 5. Вікно для збереження даних Зберігати графіки можна в графічних форматах файлу. В програмі реалізовані наступн формати графічних файлів: Bitmaps (*.bmp) JPEG Image File (*.jpg) JPEG Image File (*.jpeg) Icons (*.ico) All (*.jpg;*.jpeg;*.bmp;*.ico;*.emf;*.wmf) Збереження текстових даних проводиться в текстових файлах з розширенням *.grf. Формат збереження даного файлу наступний: Час створення виміру Знак |” Числове значення виміру Полоса прокрутки, що зназодиться на основній формі призначена для прокрутки зображення графіка. На початку роботи програми вона є неактивною. Неактивною вона є до тих пір, поки кількість вимірів не перейде за максимальну кількість вимірів, що можуть зображатися на графіку. Ще однією важливою умовою активізації полоси прокрутки являється зупинка отримання вимірів. Для збереження певної частини графіка, необхідно за допомогою полоси прокрутки вибрати фрагмент графіка, який необхідно записати у файл, та виконати дію запису графіку. 5.4 Додаткові елементи інтерфейсу До додаткових елементів інтерфейсу відносяться елементи для текстового представлення відображуваної інформації, та елементи встановлення часу спрацювання таймера. В нижній частині головної форми присутне текстове представлення 15 останніх результатів вимірювань. Дане текстове представлення змінюється зі зміною останніх даних, і не змінюється при прокрутці графічного зображення. Також в нижній частині реалізовані елементи для швидкої зміни частоти запуску таймера. По замовчуванню таймер спрацювує кожні 200 млс, що призводить до зчитування даних з джерела, та занесення значення в динамічний список. Дан елементи інтерфейсу користувача програми можна побачити на рис.3. ВИСНОВОК Програма Візуальний облік вхідних даних інтерфейсу RS-232” призначена для ведення обліку даних, що поступають на вхід стандартного інтерфейсу RS-232(COM-порт), а також для графічного відображення вхідних даних у вигляді графіку та збереження отриманих даних у файлах відповідних форматів. Програма дозволяє відображувати дані, що приходять на СОМ-порти, у вигляді, який необхідний користувачу. Для відображення графіку використовуються низка опцій, за допомогою яких користувач може отримати зображення графіка таким, який йому необхідний. Програмний продукт розрахований на користувачів, яким необхідно досліджувати особливост роботи пристроїв, які підключаються до стандартних інтерфейсів ЕОМ. Програма створена для Win32 операційних систем і має зручний та лекий в засвоєнн графічний інтерфейс, оскільки дуже нагадує стандартні інтерфейси Windows. Розроблені діалоги, підказки та інструкція дозволяють користувачам, у яких малий досвід роботи з комп’ютером та подібним програмним забезпеченням, в короткі сроки освоїти програму. Програма реалізована за допомогою сучасних інструментальних засобів візуально об’єктно-орієнтованої мови програмування Delphi 6.0 та задовільняє всі пункти передбачені в технічному завданні. ЛІТЕРАТУРА 1. Ай Пен, Разработка периферийных устройств. 2. Титов Олег, Работа с коммуникационными портами (COM и LPT) в программах для Win32. 3. Как программировать на Delphi 4.0: Пер. с англ./ Франк Энго. – К.: Издательство “ДиалСофт”, 1999. – 430с. 4. Надежность и эффективность в технике: Справочник: в 10 т.-М.:Машиностроение: Том 5. Проетный анализ надежности. – 1988 г., 316 с. 5. Основы эксплуатации ЭВМ: Учеб. Пособие для вузов/Под ред. Б.М. Кагана. – 2-е изд., перераб и доп.-М.: Эенергоатомиздат, 1988. –432 с.: ил. 6. Секреты 32-разрядного программирования в Delphi: Пер. с англ./ Сван Том. – К.: Диалектика, 1997. – 480с., ил. 7. Секреты Delphi 2: Пер. с англ./Рэй Лишнер. – К.: НИПФ «ДиаСофтЛтд.», 1996. – 800 с. ДОДАТОК ТЕКСТ ПРОГРАМИ “ВІЗУАЛЬНИЙ ОБЛІК ВХІДНИХ ДАНИХ ІНТЕРФЕЙСУ RS-232” Текст основної програми program Project1; uses Forms, MainForm in 'MainForm.pas' {Form1 Головна форма}, GraphicDiagram in 'GraphicDiagram.pas', Unit3 in 'Unit3.pas' {Form3}, aboutProgram in 'aboutProgram.pas' {AboutBox}, Unit4 in 'Unit4.pas' {Form4}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.CreateForm(TAboutBox, AboutBox); Application.CreateForm(TForm3, Form3); Application.CreateForm(TForm4, Form4); Application.Run; end. Текст форми MainForm unit MainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, Buttons, StdCtrls, GraphicDiagram, ExtDlgs, ComCtrls, ToolWin, ActnList, ImgList; type TForm1 = class(TForm) MainMenu1: TMainMenu; Fileitem: TMenuItem; ItemNew: TMenuItem; N2: TMenuItem; SavePicture: TMenuItem; SaveData: TMenuItem; N5: TMenuItem; ItemExit: TMenuItem; Run: TMenuItem; StartLoad: TMenuItem; Pause: TMenuItem; Face: TMenuItem; Pilar: TMenuItem; Lines: TMenuItem; Options: TMenuItem; COMport: TMenuItem; LPTport: TMenuItem; Generator: TMenuItem; N19: TMenuItem; PortOption: TMenuItem; GeneratorOption: TMenuItem; Help: TMenuItem; About: TMenuItem; UserGuide: TMenuItem; Panel1: TPanel; PanelInstrument: TPanel; SpeedButton1: TSpeedButton; SpeedButton3: TSpeedButton; SpeedButton2: TSpeedButton; SpeedButton4: TSpeedButton; SpeedButton5: TSpeedButton; SpeedButton6: TSpeedButton; Timer1: TTimer; GraphicDiagram1: TGraphicDiagram; ScrollBar1: TScrollBar; SavePictureDialog1: TSavePictureDialog; SaveDialog1: TSaveDialog; ActionList1: TActionList; ImageList1: TImageList; newGraphic: TAction; saveDataGr: TAction; LoadDataGR: TAction; SaveGraph: TAction; StartGr: TAction; StopGr: TAction; HelpPr: TAction; ExitPr: TAction; N7: TMenuItem; SpeedButton7: TSpeedButton; N8: TMenuItem; OpenDialog1: TOpenDialog; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Edit10: TEdit; Edit11: TEdit; Edit12: TEdit; Edit13: TEdit; Edit14: TEdit; Edit15: TEdit; Label1: TLabel; Edit16: TEdit; BitBtn1: TBitBtn; procedure ItemExitClick(Sender: TObject); procedure Panel1Resize(Sender: TObject); procedure FormResize(Sender: TObject); procedure PanelInstrumentResize(Sender: TObject); procedure ItemNewClick(Sender: TObject); // procedure SavePictureClick(Sender: TObject); // procedure SaveDataClick(Sender: TObject); procedure PauseClick(Sender: TObject); procedure ClearClick(Sender: TObject); procedure LinesClick(Sender: TObject); procedure Start(Sender: TObject); procedure FormCreate(Sender: TObject); procedure SavePictureClick(Sender: TObject); procedure GeneratorClick(Sender: TObject); procedure LPTportClick(Sender: TObject); procedure COMportClick(Sender: TObject); procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); procedure N2Click(Sender: TObject); procedure N3Click(Sender: TObject); procedure N4Click(Sender: TObject); procedure N6Click(Sender: TObject); procedure AboutClick(Sender: TObject); procedure newGraphicExecute(Sender: TObject); procedure ExitPrExecute(Sender: TObject); procedure StartGrExecute(Sender: TObject); procedure StopGrExecute(Sender: TObject); procedure SaveGraphExecute(Sender: TObject); procedure saveDataGrExecute(Sender: TObject); procedure HelpPrExecute(Sender: TObject); procedure LoadDataGRExecute(Sender: TObject); procedure ChangeTable(k:integer); procedure BitBtn1Click(Sender: TObject); procedure GeneratorOptionClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Unit3, aboutProgram, Unit4; {$R *.dfm} procedure TForm1.ItemExitClick(Sender: TObject); begin close; end; procedure TForm1.ChangeTable(k:integer); var t:integer; begin t:=GraphicDiagram1.GetPointsCount; if t<>0 then begin if t>15 then begin Edit1.Text:=Edit2.Text; Edit2.Text:=Edit3.Text; Edit3.Text:=Edit4.Text; Edit4.Text:=Edit5.Text; Edit5.Text:=Edit6.Text; Edit6.Text:=Edit7.Text; Edit7.Text:=Edit8.Text; Edit8.Text:=Edit9.Text; Edit9.Text:=Edit10.Text; Edit10.Text:=Edit11.Text; Edit11.Text:=Edit12.Text; Edit12.Text:=Edit13.Text; Edit13.Text:=Edit14.Text; Edit14.Text:=Edit15.Text; Edit15.Text:=IntToStr(k); end else begin case t of 1: Edit1.Text:=IntToStr(GraphicDiagram1.GetValue(0)); 2: Edit2.Text:=IntToStr(k); 3: Edit3.Text:=IntToStr(k); 4: Edit4.Text:=IntToStr(k); 5: Edit5.Text:=IntToStr(k); 6: Edit6.Text:=IntToStr(k); 7: Edit7.Text:=IntToStr(k); 8: Edit8.Text:=IntToStr(k); 9: Edit9.Text:=IntToStr(k); 10: Edit10.Text:=IntToStr(k); 11: Edit11.Text:=IntToStr(k); 12: Edit12.Text:=IntToStr(k); 13: Edit13.Text:=IntToStr(k); 14: Edit14.Text:=IntToStr(k); 15: Edit15.Text:=IntToStr(k); end; end; end; end; procedure TForm1.Panel1Resize(Sender: TObject); begin // panel1.Width:=form1.Width-10; // panel1.Height:=form1.Height-200; end; procedure TForm1.FormResize(Sender: TObject); begin GraphicDiagram1.Resize(TControl(panel1)); // panel1Resize(self); PanelInstrumentResize(self); end; procedure TForm1.PanelInstrumentResize(Sender: TObject); begin PanelInstrument.Width:=form1.Width-10; end; procedure TForm1.ItemNewClick(Sender: TObject); var n:integer; begin GraphicDiagram1.Clear; ScrollBar1.Enabled:=false; end; procedure TForm1.PauseClick(Sender: TObject); begin if GraphicDiagram1.GetPointsCount<>1 then begin if SpeedButton4.Caption='Запуск' then begin Fileitem.Enabled:=false; // Interpolation.Enabled:=false; Options.Enabled:=false; SpeedButton1.Enabled:=false; SpeedButton2.Enabled:=false; SpeedButton3.Enabled:=false; SpeedButton4.Caption:='Зупинити'; StartLoad.Caption:='Зупинити'; Timer1.Interval:=GraphicDiagram1.NumMiliSec; Timer1.Enabled:=True; Pause.Enabled:=true; SpeedButton5.Enabled:=true; end else begin if GraphicDiagram1.GetPointsCount>GraphicDiagram1.DrawCount then begin ScrollBar1.Enabled:=true; ScrollBar1.SetParams(GraphicDiagram1.GetPointsCount,0,GraphicDiagram1.GetPointsCount); end; Fileitem.Enabled:=true; // Interpolation.Enabled:=true; Options.Enabled:=true; SpeedButton1.Enabled:=true; SpeedButton2.Enabled:=true; SpeedButton3.Enabled:=true; SpeedButton4.Caption:='Запуск'; StartLoad.Caption:='Запуск'; Timer1.Enabled:=false; Pause.Enabled:=false; SpeedButton5.Enabled:=false; //Stop; end; end else begin ScrollBar1.Enabled:=false; Pause.Enabled:=false; SpeedButton5.Enabled:=false; end; end; procedure TForm1.ClearClick(Sender: TObject); begin form1.ItemNewClick(self); end; procedure TForm1.Start; var n:TPoint; begin new(n); n^:=Random(255); GraphicDiagram1.AddValue(n); ChangeTable(n^); end; procedure TForm1.LinesClick(Sender: TObject); begin if not(Lines.Checked)then begin GraphicDiagram1.TypeDiagram:=tdLine; Lines.Checked:=true; Pilar.Checked:=false; end else begin GraphicDiagram1.TypeDiagram:=tdColumn; Lines.Checked:=false; Pilar.Checked:=true; end; end; procedure TForm1.FormCreate(Sender: TObject); begin inherited; randomize; Form1.Pause.Enabled:=false; Form1.SpeedButton5.Enabled:=false; ScrollBar1.Enabled:=false; Edit1.Text:='0'; // SaveDialog1.Create(self); end; procedure TForm1.SavePictureClick(Sender: TObject); var k:integer; t:String; begin if SavePictureDialog1.Execute then begin t:=SavePictureDialog1.FileName; repaint; k:=GraphicDiagram1.SavePicture(t); if k=0 then MessageDlg('Помилка при записі файла '+t,mtError,[mbOk],0); end; end; procedure TForm1.GeneratorClick(Sender: TObject); begin if not(Generator.Checked) then begin Generator.Checked:=true; COMport.Checked:=false; LPTport.Checked:=false; end; end; procedure TForm1.LPTportClick(Sender: TObject); begin if not(LPTport.Checked)then begin Generator.Checked:=false; COMport.Checked:=false; LPTport.Checked:=true; end; end; procedure TForm1.COMportClick(Sender: TObject); begin if not(COMport.Checked)then begin Generator.Checked:=false; COMport.Checked:=true; LPTport.Checked:=false; end; end; procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin if ScrollCode=scEndScroll then begin if (ScrollPos<>0) and (ScrollPos<>GraphicDiagram1.GetPointsCount) then begin GraphicDiagram1.DrawStart:=ScrollPos-1; GraphicDiagram1.Invalidate; end else if ScrollPos=0 then begin GraphicDiagram1.DrawStart:=0; GraphicDiagram1.Invalidate; end else begin GraphicDiagram1.DrawStart:=ScrollPos-1; GraphicDiagram1.Invalidate; end; end; end; procedure TForm1.N2Click(Sender: TObject); begin Form3.Showmodal; end; procedure TForm1.N3Click(Sender: TObject); begin //form2.Show; end; procedure TForm1.N4Click(Sender: TObject); begin form3.Show; end; procedure TForm1.N6Click(Sender: TObject); begin // form4.show; end; procedure TForm1.AboutClick(Sender: TObject); begin aboutbox.showmodal; end; procedure TForm1.newGraphicExecute(Sender: TObject); begin form1.ItemNewClick(self); end; procedure TForm1.ExitPrExecute(Sender: TObject); begin close; end; procedure TForm1.StartGrExecute(Sender: TObject); begin ScrollBar1.Enabled:=false; Fileitem.Enabled:=false; // Interpolation.Enabled:=false; Options.Enabled:=false; SpeedButton1.Enabled:=false; SpeedButton2.Enabled:=false; SpeedButton3.Enabled:=false; Timer1.Interval:=GraphicDiagram1.NumMiliSec; Timer1.Enabled:=True; Pause.Enabled:=true; SpeedButton5.Enabled:=true; end; procedure TForm1.StopGrExecute(Sender: TObject); begin if GraphicDiagram1.GetPointsCount>GraphicDiagram1.DrawCount then begin ScrollBar1.Enabled:=true; ScrollBar1.SetParams(GraphicDiagram1.GetPointsCount,0,GraphicDiagram1.GetPointsCount); end; Fileitem.Enabled:=true; // Interpolation.Enabled:=true; Options.Enabled:=true; SpeedButton1.Enabled:=true; SpeedButton2.Enabled:=true; SpeedButton3.Enabled:=true; Timer1.Enabled:=false; Pause.Enabled:=false; end; procedure TForm1.SaveGraphExecute(Sender: TObject); begin SavePictureClick(Sender); end; procedure TForm1.saveDataGrExecute(Sender: TObject); begin if SaveDialog1.Execute then GraphicDiagram1.SaveData(SaveDialog1.FileName); end; procedure TForm1.HelpPrExecute(Sender: TObject); begin aboutBox.ShowModal; end; procedure TForm1.LoadDataGRExecute(Sender: TObject); begin if openDialog1.Execute then begin if fileExists (openDialog1.FileName) then GraphicDiagram1.LoadData(openDialog1.FileName) else messageDlg('Немає такого файлу!!',mtError,[mbOk],0); end; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin try GraphicDiagram1.NumMiliSec:=StrToInt(Edit16.Text); except MessageDlg('Число повинне бути цілим та додатнім!!!',mtError,[mbOk],0); end end; procedure TForm1.GeneratorOptionClick(Sender: TObject); begin Form4.showmodal; end; end. Текст компонента GraphicDiagram unit GraphicDiagram; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; const WM_MYMessage = WM_USER+1000; const MAX_COUNT = 10000; type TTypeDiagram = (tdLine,tdColumn,tdUser); TPoint = ^Longint; TPointArray = TList; TCount = 0..MAX_COUNT; TnewMouseMoveEvent = procedure (Sender:TObject;Shift:TShiftState;x,y:integer; var DoDefault:boolean) of Object; TGraphicDiagram = class(TGraphicControl) private FTypeDiagram:TTypeDiagram; FpointStart:Longint;//початок відображення точок на графіку FPointDrawCount:Longint; //Кінець відображення точок на графіку FNumSeccond,FNumMSeccond:word; // кількість мілісекунд, після яких добавляється точка FPointYMax:Longint; //максимальна точка по Ігрик FDrawX:Boolean; FDrawY:Boolean; FDRAWColor:TColor; FDrawGridX:Boolean; FDrawGridY:Boolean; FDrawGridColor:TColor; FPointsValue:TPointArray; // тільки додатні елементи FDataStart,FDataStop:TDateTime;//початок відображення точок на графіку FEnabled:Boolean; FOnMouseMove:TnewMouseMoveEvent; OurTime:longint; MashtabX:real; MashtabY:real; FMashTab:Boolean; //маштаб якщо він змінився то true // function GetValue(index:Longint): Longint; //читає точку Procedure SetValue(index,value:Longint); //добавляє точку procedure SetTypeDiagram(typeD:TTypeDiagram); procedure SetMashtabX; procedure SetMashtabY; protected procedure paint;override; procedure WritePoints(stream:TStream);virtual; procedure ReadPoints(stream:TStream);virtual; procedure DefineProperties(Filer:TFiler);override; procedure WMMouseMove(var Mes:TWMMouse); message WM_MOUSEMOVE; procedure MyMouseMove(Shift:TShiftState;x,y:integer);dynamic; Procedure WMMyMessage(var Mes:TMessage); message WM_MyMessage; public { Public declarations } constructor create(AOwner:TComponent);override; destructor Destroy; override; procedure AddValue(value:TPoint);overload; function GetPointsCount:Longint; //читає точку function getList:TPointArray; function SaveData(filename:String):integer; function LoadData(filename:String):integer; function SavePicture(filename:String):integer; procedure Start; procedure Stop; procedure Clear; procedure Resize(Sender:TControl); function GetValue(index:Longint): Longint; //читає точку // procedure AddValue(value:longint);overload; published { Published declarations } property TypeDiagram:TTypeDiagram read FTypeDiagram write FTypeDiagram; property DrawCount:integer read FPointDrawCount Write FPointDrawCount; property DrawX:Boolean read FDrawX Write FDrawX; property DrawY:Boolean read FDrawY Write FDrawY; property DrawGridX:Boolean read FDrawGridX Write FDrawGridX; property DrawGridY:Boolean read FDrawGridY Write FDrawGridY; property DrawColor:TColor read FDrawColor Write FDrawColor; property DrawGridColor:TColor read FDrawGridColor Write FDrawGridColor; property DrawStart:integer read FPointStart Write FPointStart; property NumSeccondShow:word read FNumSeccond write FNumSeccond stored false; property NumMiliSec:word read FNumMSeccond write FNumMSeccond stored false; property OnMouseMove:TnewMouseMoveEvent read FOnMouseMove write FOnMouseMove; end; procedure Register; implementation procedure TGraphicDiagram.Resize; begin Height:=Sender.Height-30; Width:=Sender.Width-15; invalidate; end; function TGraphicDiagram.getList:TPointArray; begin result:=FPointsValue; end; procedure TGraphicDiagram.Start; begin FDataStart:=now; end; procedure TGraphicDiagram.Stop; begin FDataStop:=now; end; destructor TGraphicDiagram.destroy; begin Self.clear; inherited; end; procedure TGraphicDiagram.Clear; var l:^Longint; i:TPoint; n:Longint; begin n:=FPointsValue.Count-1; FPointsValue.clear; FpointStart:=0; new (i); i^:=0; AddValue(i); invalidate; end; function TGraphicDiagram.LoadData; var i:Longint; n:^Longint; f:textFile; st:String; begin result:=-1; FpointsValue.Clear; FpointStart:=0; if not FileExists(filename) then exit; assignFile(f,filename); reset(f); while not eof(f) do begin readln(f,st); i:=pos('|',st); if i=0 then Exception.create('Неправильний формат файлу '+filename); FDataStart:=StrToDateTime(copy(st,1,i-1)); new (n); n^:= StrToInt(copy(st,i+1,10)); FpointsValue.add(n); end; closeFile(f); invalidate; result:=0; end; function TGraphicDiagram.SavePicture; var tp:TBitMap; st:TStream; p:pointer; rin:TRect; begin rin:=Rect(0,0,width,height); //TCanvas tp:= TBitmap.Create; // p:=addr(self.canvas.pixels[0,0]) tp.width:=width; tp.height:=height; tp.canvas.CopyRect (rin, self.canvas,rin); tp.SaveToFile (filename); tp.free; end; function TGraphicDiagram.SaveData; var i:Longint; n:^Longint; f:textFile; begin result:=-1; assignFile(f,filename); rewrite(f); for i:=0 to FPointsValue.count-1 do begin n:=FpointsValue.items[i]; writeln(f,DateTimeToStr(FDataStart+(FDataStart-FDataStop)/FPointsValue.count),'|',n^); end; closeFile(f); result:=0; end; function TGraphicDiagram.GetPointsCount:Longint; // begin result:=FPointsValue.Count; end; procedure TGraphicDiagram.SetTypeDiagram(typeD:TTypeDiagram); begin FTypeDiagram:=typeD; invalidate; end; procedure TGraphicDiagram.WMMouseMove(var Mes:TWMMouse); begin inherited; if not (csNoStdEvents in ControlStyle) then with mes do MyMouseMove (KeysToShiftState(Keys),Xpos,YPos); end; procedure TGraphicDiagram.MyMouseMove(Shift:TShiftState;x,y:integer); var def:Boolean; begin def:=true; if Assigned(FOnMouseMove) then FOnMouseMove(Self,shift,x,y,def); {if def then оброблювач по замовчуванню!!!} end; procedure TGraphicDiagram.WMMyMessage(var Mes:TMessage); begin Canvas.Pen.Color:= clRed; inValidate; end; procedure TGraphicDiagram.DefineProperties(Filer:TFiler); begin inherited DefineProperties(Filer); // Filer.DefineBinaryProperty('TypeDiagram',ReadType,WritePoints,true); end; procedure TGraphicDiagram.WritePoints(stream:TStream); begin // stream.WriteBuffer(FPointsValue,SizeOf(FPointsVAlue)); end; procedure TGraphicDiagram.ReadPoints(stream:TStream); begin // stream.ReadBuffer(FPointsValue,SizeOf(FPointsVAlue)); end; constructor TGraphicDiagram.create; var i:integer; n:TPoint; begin inherited create (AOwner); FDrawColor:=clBlack; FDrawGridColor:=clBlack; FDrawX:=true; FDrawY:=true; FDrawGridX:=true; FDrawGridY:=true; FPointYMax:=1; Height:=100; Width:=200; FNumSeccond:=20; FNumMSeccond:=200; FPointDrawCount:=(FNumSeccond*1000) div FNumMSeccond; MashtabX:=Width/FPointDrawCount; MashtabY:=(Height-30); FTypeDiagram:= tdColumn; FPointsValue:=TList.Create; new (n); n^:=0; addValue(n); FEnabled:=true; FMashTab:=true; //маштаб по Ігрику end; function TGraphicDiagram.getValue; begin if index<FPointsValue.count then Result:=Longint(FPointsValue.items[index]) else result:=0; end; procedure TGraphicDiagram.setValue; var l:^Longint; begin if index<FPointsValue.count then begin l:=FPointsValue.Items[index]; if l<>nil then dispose(l); FPointsValue.Items[index]:=@value; if value>FPointYMax then begin FPointYMax:=Value; FMashtab:=true; end; invalidate; end; end; procedure TGraphicDiagram.AddValue(value:TPoint); var knum:Longint; begin FPointsValue.Add(value); knum:=FPointsValue.Count; if ((knum-FPointStart)+3>FPointDrawCount) then FPointStart:=knum-FPointDrawCount+3; if value^>FPointYMax then begin FPointYMax:=Value^; FMashtab:=true; end; invalidate; end; //Встановлення маштабу по Y procedure TGraphicDiagram.SetMashtabY; begin try MashtabY:=(Height-30)/FPointYMax; except MashtabY:=(Height-30)/10 end; end; //Встановлення маштабу по X procedure TGraphicDiagram.SetMashtabX; begin MashtabX:=(width-10)/FPointDrawCount; end; procedure TGraphicDiagram.paint; var i:longint; //Отримання координати Х точки у відповідності до маштабу по Х function GetX(p:longint):integer; begin result:=10 + Round(p*MashtabX); end; //Отримання координати Y точки у відповідності до маштабу по Y function GetY(p:longint):integer; begin result:=Height -10 - Round(p*MashtabY); end; procedure drawKoordinate; var i:integer; temp:TColor; begin with canvas do begin //Відобрахкння координатних осей pen.Width:=2; temp:=pen.Color; pen.Color:=FDrawColor; //Вісь Х if FDrawX then begin moveTo(10,height-10); lineTo(width-5,height-10); moveTo(width-5,height-10); lineTo(width-15,height-15); moveTo(width-5,height-10); lineTo(width-15,height-5); //Поділки на вісі Х for i:=0 to 9 do begin moveTo(10+(width) div 10 *i,height-5); lineTo(10+(width) div 10 *i,height-15); end; end; //Вісь Y if FDrawY then begin moveTo(10,height-10); lineTo(10,5); moveTo(10,5); lineTo(5,15); moveTo(10,5); lineTo(15,15); //Поділки на вісі Y for i:=0 to 9 do begin moveTo(5,height-10- height div 10*i); lineTo(15,height-10- height div 10*i); end; end; moveTo(10,height-10); pen.Width:=1; pen.Style:=psDot; pen.Color:=FDrawGridColor; //Відображення координатної сітки if FDrawGridX then begin //Сітка по вісі Х for i:=0 to 9 do begin moveTo(10+(width) div 10 *i,height-5); lineTo(10+(width) div 10 *i,0); end; end; if FDrawGridY then begin //Сітка по вісі Y for i:=0 to 9 do begin moveTo(5,height-10- height div 10*i); lineTo(width,height-10- height div 10*i); end; end; moveTo(10,height-10); pen.style:=psSolid; pen.Color:=temp; end; end; var l:longint; p:^Longint; rx:longint; ry:longint; begin if FMashtab then begin SetMashtabX; SetMashtabY; end; if csDesigning in ComponentState then inherited Canvas.pen.Style:= psDash else inherited Canvas.pen.Style:= psSolid; l:=FPointsValue.Count-1; with inherited Canvas do begin Brush.Style:=bsClear; // Rectangle(0,0,Width,Height); p:=FPointsValue.items[FPointStart]; moveTo(0,GetY(p^)); pen.Style:= psSolid; pen.color:=clBlack; DrawKoordinate; if FTypeDiagram=tdLine then for i:=FPointStart to l do begin p:=FPointsValue.items[i]; rx:=GetX(i-FPointStart); ry:=GetY(p^); LineTo(rx,ry) end else if FTypeDiagram=tdColumn then begin Brush.Style:= bsSolid; Brush.Color:= clBlue; for i:=FPointStart to l do begin p:=FPointsValue.items[i]; rx:=GetX(i-FPointStart); ry:=GetY(p^); FillRect(Rect(rx,Height-10,rx+1,ry)); end; end; end; end; procedure Register; begin RegisterComponents('ActiveX', [TGraphicDiagram]); end; end. Текст модуля Unit3 unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ComCtrls, StdCtrls, Buttons, ExtCtrls; type TForm3 = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; BitBtn1: TBitBtn; BitBtn2: TBitBtn; GroupBox1: TGroupBox; RBX: TRadioButton; RBY: TRadioButton; RbXY: TRadioButton; RBNone: TRadioButton; GroupBox2: TGroupBox; RBGX: TRadioButton; RBGY: TRadioButton; RBGXY: TRadioButton; RBGNone: TRadioButton; ColorBox1: TColorBox; ColorBox2: TColorBox; procedure FormShow(Sender: TObject); procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; implementation uses MainForm; {$R *.dfm} procedure TForm3.FormShow(Sender: TObject); begin with Form1 do if GraphicDiagram1.DrawX and GraphicDiagram1.DrawY then RBXY.Checked:=true else if GraphicDiagram1.DrawX then RBX.Checked:=true else if GraphicDiagram1.DrawY then RBY.Checked:=true else RBNONe.Checked:=true; end; procedure TForm3.BitBtn1Click(Sender: TObject); begin with Form1 do begin //Перевірка для осей координат if RBXY.Checked then begin GraphicDiagram1.DrawX:=true; GraphicDiagram1.DrawY:=true;end; if RBY.Checked then begin GraphicDiagram1.DrawX:=false; GraphicDiagram1.DrawY:=true;end; if RBX.Checked then begin GraphicDiagram1.DrawX:=true; GraphicDiagram1.DrawY:=false;end; if RBNone.Checked then begin GraphicDiagram1.DrawX:=false; GraphicDiagram1.DrawY:=false;end; //Перевірка для сітки if RBGXY.Checked then begin GraphicDiagram1.DrawGridX:=true; GraphicDiagram1.DrawGridY:=true;end; if RBGY.Checked then begin GraphicDiagram1.DrawGridX:=false; GraphicDiagram1.DrawGridY:=true;end; if RBGX.Checked then begin GraphicDiagram1.DrawGridX:=true; GraphicDiagram1.DrawGridY:=false;end; if RBGNone.Checked then begin GraphicDiagram1.DrawGridX:=false; GraphicDiagram1.DrawGridY:=false;end; GraphicDiagram1.DrawColor:=ColorBox2.Selected; GraphicDiagram1.DrawGridColor:=ColorBox1.Selected; GraphicDiagram1.Invalidate; end; end; end. |
|