Міністерство освіти інауки УкраїниЗакарпатськийдержавний університетФАКУЛЬТЕТ ІНФОРМАТИКИ
КАФЕДРА ІНФОРМАЦІЙНИХ УПРАВЛЯЮЧИХСИСТЕМ ТА ТЕХНОЛОГІЙРеєстраційний №________
Дата ___________________КУРСОВА РОБОТА
Тема:
Проектуваннякористувальницького інтерфейсувC++ BuilderРекомендована до захисту
“____” __________ 2008р.
Робота захищена
“____” __________ 2008р.
з оцінкою
_____________________
Підписи членів комісії
ЗмістВступТеоріяПрактична частинаВисновкиЛітература
Вступ
Borland C++ Builder — створене недавно компанією Borlandзасіб швидкої розробки проектів, що дозволяє створювати проекту мовою C++,використовуючи при цьому середовище розробки та бібліотеку компонентів Delphi.У даній частині роботи розглядається середовище розробки C++ Builder та основніприйоми, застосовувані при проектуванні користувальницького інтерфейсу. C++Builder виробництва корпорації Borland призначена для операційних системWindows 95 та NT. Інтегроване середовище C++ Builder забезпечує швидкістьвізуальної розробки, продуктивність повторно використовуваних компонентів усполученні з міццю мовних засобів C++, удосконаленими інструментами тарізномасштабними засобами доступу до баз даних. C++ Builder може бутивикористаний скрізь, де потрібно доповнити існуючі додатки розширенимстандартом мови C++, підвищити швидкодія та додати користувальницькомуінтерфейсу якості професійного рівня.
Головною метою нашої роботи, буде написання інтерактивноїсистеми навчання програмуванню на мові C++. В теоретичній частині наведемоосновні відомості про інструментарій.
Теорія
Розглянемо характеристики, які притаманні Borland C++ Builderна як системі объєктно-орієнтованого програмування для швидкої розробкисучасного математичного забезпечення персональних комп'ютерів. Borland C++Builder випускається в трьох варіантах: Standard, Professional й Client/ServerSuite.
Швидкість візуальної розробки
Інтегроване середовище розробки поєднує Редактор форм. Інспектороб'єктів. Палітру компонентів. Адміністратор проекту й повністю інтегрованіРедактор коду й Отладчік — інструменти швидкої розробки програмних додатків, щозабезпечують повний контроль над кодом і ресурсами.
Професійні засоби мови C++ інтегровані у візуальне середовище розробки.C++Builder надає швидкодіючий компілятор з мови Borland C++, ефективнийінкрементний завантажник і гнучкі засоби налагодження як на рівні вихіднихінструкцій, так і на рівні ассемблерних команд — у розрахунку задовольнитивисокі вимоги програмістів-професіоналів.
Конструювання по способі «drag-and-drop » дозволяє створювати додаток простимперетаскуванням захоплених мишею візуальних компонентів з Палітри на формудодатка. Інспектор об'єктів надає можливість оперувати із властивостями йподіями компонент, автоматично створюючи заготівлі функцій обробки подій, якінаповнюються кодом і редагуються в процесі розробки.
Механізми двунаправленої розробки (two-way-tools) усувають бар'єри міжпрограмістом і його кодом. Технологія двунаправленої розробки забезпечуєконтроль за вашим кодом за допомогою гнучкого, інтегрованого й синхронізованоївзаємодії між інструментами візуального проектування й Редактором коду.
Властивості, методи й події — це саме ті елементи мови, якізабезпечують швидку розробку додатків у рамках об‘єктно — орієнтованого програмування.Властивості дозволяють легко встановлювати різноманітні характеристикиоб'єктів. Методи роблять певні, іноді досить складні, операції над об'єктом. Подіїзв'язують впливу користувача на об'єкти з кодами реакції на ці впливи. Подіїможуть виникати при таких специфічних змінах стану об'єктів як відновленняданих в інтерфейсних елементах доступу до баз даних. Працюючи спільно,властивості, методи й події утворять середовище RAD (Rapid ApplicationDevelopment) швидкого й інтуїтивного програмування надійних додатків дляWindows.
Візуальне спадкування форм втілює найважливіший аспект об‘єктно-орієнтованого програмування в зручному для користування інструментівізуального проектування. Характеристики нової форми додатки можуть бутиуспадковані від будь-якої іншої існуючої форми, що забезпечує централізованурепродукцію змін користувальницького інтерфейсу, полегшує контроль за кодом ізменшує тимчасові витрати на введення нових якісних атрибутів.
Випробування прототипу дозволяє без праці переходити від прототипу додаткадо повністю функціонального, професійно оформленому програмному продукту, діючив межах інтегрованого середовища. Щоб упевнитися, що ваша програма робитьочікувані результати, раніше доводилося багаторазово проходити по цикліредагування => компіляція => зборка, непродуктивно витрачаючи час.C++Builder поєднує три етапи розробки в єдиний виробничий процес. У результатівдається будувати додатка, що базуються на поточних вимогах замовника, разом зтим гнучкі настільки, щоб швидко адаптувати їх до нових запитів користувачів.
Майстер інсталяції керує створенням уніфікованих дистрибутивних пакетів длярозроблених додатків.
Вихідні тексти Бібліотеки Візуальних Компонентів полегшують розробку новихкомпонентів на базі готових прикладів.
Відриті інструменти API можуть бути безпосередньо інтегровані у візуальнесередовище системи. Ви зможете підключити звичний текстовий редактор абостворити власного майстра для автоматизації виконання повторюваних процедур.
Розширена математична бібліотека містить додаткові уніфікованіфункції статистичних і фінансових обчислень.
Продуктивність компонентів
Бібліотека Візуальних Компонентів VCL придбала статус нового промисловогостандарту й у цей час застосовується більш ніж півмільйоном користувачів,істотно прискорюючи розробку надійних додатків будь-якого ступеня складності.VCL містить близько 100 повторно використовуваних компонентів, які реалізуютьвсі елементи користувальницького інтерфейсу операційної системи Windows 95.Крім того, VCL надають у розпорядження програмістів такі оригінальні об'єкти,як записні книжки із закладками, табличні сітки для відображення вмісту базданих і навіть органи керування пристроями мультимедія. Перебуваючи всередовищі об‘єктно — орієнтованого Програмування C++Builder, компоненти можнавикористати безпосередньо, міняти їхні властивості, вигляд і поводження абопороджувати похідні елементи, з потрібними відмітними характеристиками.
Сховище об'єктів є інструментом нової методики зберігання й повторноговикористання модулів даних, об'єктів, форм і програмної бізнесу-логіки.Оскільки побудова нового додатка на існуючому фундаменті значно заощаджуєтимчасові витрати, сховище об'єктів надає для повторного використання готовіструктури: форми й закінчених програмних модулів. Створюючи прототип новогододатка, ви можете успадковувати, посилатися або просто копіювати існуючуструктуру — точно так само архітектор приступає до проектування нового будинку.
Компонента ChartFX забезпечує негайна побудова на вашій формі різноманітнихграфіків, діаграм, таблиць і передбачає перевірку правопису на багатьох мовах.У варіанті C++Builder Standard цей компонент є єдиним представником групиActive.
Інтеграція компонентів Active дозволяє розширити БібліотекуВізуальних Компонентів, включивши компоненти стандарту Active для розробкидодатків у мережі Internet. Якщо ваш комп'ютер має вихід в Internet,з'єднаєтеся із сервером за адресою
www.borland.com/devsupport/bcppbuilder/netmanage.html
і скачайте файл автоматичної інтеграції OCXINTEG.ZIP (12Кбайт) і файл керування мережею AX602.ZIP (6.5 байт), розроблений фірмоюNetManage. Файл інтеграції автоматично проведе для вас процедуру додаваннянових компонентів до VCL й установить їх на Палітру. У результаті ви одержитеможливість розробляти додатка для Internet, аж до створення власного мережногокоммуникатора (HTML browser).
Потужність язикових засобів C++
Оптимизирующий 32-розрядний компілятор побудований по перевіреної провідноїкомпіляторної технології корпорації Borland, що забезпечує винятково відмінковуй швидку оптимізацію як довжини вихідного коду, що виконує, так і витрачаєпам‘яті, що.
Нові елементи стандарту ANSI/ISO мови C++ представлені шаблонами,просторами імен, виключеннями, інформацією про типи часу виконання (RTTI),поряд з розширенням набору ключових слів bool, explicit, mutable, typename.automated й ін.
Инкрементальный линкер здійснює швидку й надійну зборку додатку у форматіЕХЕ файлів порівняно меншого розміру. Автоматично усуваючи повторну зборку незмінилися вихідних об'єктних файлів і підключення невикористовуваних функцій,інкрементальній линкер будує ефективну виконувану програму з мінімальнимивтратами часу.
Чистий і доступний код додатків, які C++Builder будує на основі надаванихрозроблювачеві компонентних властивостей, подій і методів, виключає сховані йважкі в налагодженні макроси.
Підтримка промислових стандартів Active, OLE, СОМ, MAPI, WindowsSockets TCP/IP, ISAPI. NSAPI, ODBC, Unicode й MBCS.
Отладчик низького рівня CPU View дозволяє проникнути в специфікуроботи вашого додатка на рівні машинних кодів. Вікно отладчіка розділене нап'ять панелей. Панель ассемблерних команд інтерпретує виконання вихідної C++програми. Панель пам'яті показує вміст блоку пам'яті, доступного завантаженомуй модулю, що виконує в даний момент. Панель стека відображає поточний умістверхівки програмного стека. Панель регістрів і панель прапорів показуютьпоточні значення регістрів і службових битов центрального процесора. Кожнапанель включає власне меню, що управляє її видом і поводженням.
Інструменти командного рядка включені в систему на вимогу професіоналів,які завжди прагнуть зберегти детальний контроль над процесами компіляції йзборки своїх програмних файлів.
Створення DLL, LIB, і ЕХЕ файлів надає волю вибору формату цільовогододатка відповідно до вимог конкретного проекту.
Пряме звертання до системних функцій Windows 95 й NT дає можливість програмістам, щопрацюють у середовищі C++Builder. при необхідності скористатися всімавдосконаленнями сучасних операційних систем.
Механізм OLE Automation надає вашому додатку можливість управляти іншимитиповими програмними комплексами для Windows (такими як Microsoft Word, Excel,Visual Basic, Lotus 1-2-3, dBASE й Paradox) за схемою мережної взаємодіїконтролер/сервер.
Масштабовані з'єднання з базами даних
Розробка по способі «drag-and-drop» багаторазово спрощує йприскорює звичайно трудомісткий процес програмування СУБД в архітектуріклієнт/сервер. Широкий вибір компонентів керування візуалізацією й редагуваннямдозволяє легко змінювати вид відображуваної інформації й поводження програми.C++Builder використає Провідник баз даних (Database Explorer) і масштабований Словникданих (Data Dictionary ), щоб автоматично настроїти засобу відображення йредагування стосовно до специфіки вашої інформації.
Провідник баз даних надає графічний спосіб проводки користувача по вмістубази даних, забезпечуючи створення й модифікацію таблиць, ієрархічнихпокажчиків і псевдонімів.
Словник даних підтримує цілісність інформації, що змінюється, про вмісттаблиць баз даних. Користувач може динамічно модифікувати склад Словника. Словникмістить інформацію про розширені атрибути полів у записах: мінімальні ймаксимальні значення, властивості відображення, маски редагування й т.п.
Живі дані (live data) надаються розроблювачеві в процесі візуальногопроектування прототипів і при випробуванні додатків баз даних. Вам не будепотрібно більше писати тестові пастки або багаторазово перетранслювати йзапускати додаток — дані на стадії проектування будуть точно такими ж іпредставлені точно так само, як їх побачить користувач закінченої програми.
Механізм BDE (Borland Database Engine) підтримує високопродуктивний32-розрядний доступ до баз даних dBASE, Paradox: Sybase. Oracle, DB2. MicrosoftSQL Server. Informix, InterBase й Local InterBase. C++Builder використаєконтролер ODBC (Open Database Connectivity) виробництва Microsoft для зв'язкуіз серверами баз даних Excel, Access, FoxPro й Btrieve. Будучи фундаментомбудь-якого додатка бази даних, BDE тісно пов'язаний зі Сховищем об'єктів іМодулями даних.
Об'єкти Модулів даних діють як сполучний каркас додатка — вони визначаютьджерела й бізнес-логіку бази даних, фіксують взаємозв'язку компонентів. Уцентралізованій моделі доступу до даних бізнесу-логіка відділена від розробкиграфічного інтерфейсу з користувачем (GUI). Будь-яка зміна бізнесу-логіки вашоїбази даних позначається на поводженні тільки відповідного Модуля даних, арезультати зміни проявляються негайно у всіх додатках, що використають даниймодуль. Працюючи з модулями даних, ви однократно встановлюєте зв'язки вашогододатка з адресуємої базою даних, а потім по способі «drag-and-drop»можете перетаскувати поля записів на нові форми — у будь-який вузол вашоїмережі. Ніякого додаткового кодування при цьому не потрібно.
Фільтри поля посилань установлюють обмеження пошуку й відображення інформаціїбази даних простим натисканням кнопки. Змінюючи значення властивості Filter укомпонентах доступу, можна специфіцировати деяка підмножина даних, що цікавлятьвас. Посилання забезпечують автоматичне відображення даних з декількох таблиць.
Копійовані відновлення (cached updates) помітно прискорюють відгук SQLсервера за рахунок зменшення загального числа мережних обмінів із клієнтом.Будучи впакованими, множинні комунікації проявляють себе як одиночнітранзакції, тим самим знижуючи завантаженість сервера й поліпшуючипродуктивність вашого додатка.
Звіти Quick Reports дозволяють візуально конструювати стилізовані звітиза даними, що поставляє будь-яким джерелом, включаючи таблиці й запитикомпонентів доступу до баз даних. Звіти можуть містити поля заголовків,колонтитулів, виносок і підсумків. Quick Reports надають потужні коштивідображення звітів у різних видах, автоматичного підведення підсумків іпідрахунку полів — на будь-якому рівні угруповання даних.ЗастосуванняBORLAND C++ BUILDER для створення ігрових програм: BorlandC++ Builder — випущене недавно компанією Borland засіб швидкої розробки проектів, що дозволяє створювати проекту мовою C++,використовуючи при цьому середовище розробки та бібліотеку компонентів Delphi.У даній частині роботи розглядається середовище розробки C++ Builder та основніприйоми, застосовувані при проектуванні користувальницького інтерфейсу. Середовищерозробки C++ Builder
C++ Builder являє собою SDI-додаток, головне вікно якогомістить інструментальну панель, що набудоване (ліворуч) і палітру компонентів(праворуч). Крім цього, при запуску C++ Builder з'являються вікно інспектораоб'єктів (ліворуч) і форма нового проекту (праворуч). Під вікном форми проектуперебуває вікно редактора коду.
/>
Рис.1. Середовище розробки C++ Builder
Форми є основоюпроектів C++ Builder. Створення користувальницького інтерфейсу проекту полягаєв додаванні у вікно форми елементів об'єктів C++ Builder, називанихкомпонентами. Компоненти C++ Builder розташовуються на палітрі компонентів,виконаної у вигляді многостранічного блокнота. Важлива особливість C++ Builderполягає в тому, що він дозволяє створювати власні компоненти та набудовуватипалітру компонентів, а також створювати різні версії палітри компонентів длярізних проектів. КомпонентиC++ Builder
Компоненти розділяються на видимі (візуальні) і невидимі(невізуальні). Візуальні компоненти з'являються під час виконання точно таксамо, як і під час проектування. Прикладами є кнопки та редагують поля, що.Невізуальні компоненти з'являються під час проектування як піктограми на формі.Вони ніколи не видні під час виконання, але мають певну функціональність(наприклад, забезпечують доступ до даних, викликають стандартні діалоги Windows95та ін.)
/>
Рис. 2. Приклад використання видимих і невидимих компонентів
Для додаваннякомпонента у форму можна вибрати мишею потрібний компонент у палітрі таклацнути лівою клавішею миші в потрібнім місці проектованої форми. Компонентз'явиться на формі, і далі його можна переміщати, міняти розміри та іншіхарактеристики.
Кожен компонент C++Builder має три різновиди характеристик: властивості, події та методи.
Якщо вибрати компонентіз палітри та додати його до форми, інспектор об'єктів автоматично покажевластивості та події, які можуть бути використані з тім компонентом. У верхнійчастині інспектора об'єктів є список, що випадає, що дозволяє вибиратипотрібний об'єкт із наявних на формі.
/>
Рис.3. Інспектор об'єктівВластивостікомпонентів
Властивості є атрибутами компонента, що визначають йогозовнішній вигляд і поводження. Багато властивостей компонента в колонкувластивостей мають значення, яке встановлюється за замовчуванням (наприклад,висота кнопок). Властивості компонента відображаються а сторінці властивостей(Properties). Інспектор об'єктів відображає опубліковані (published)властивості компонентів. Крім published-властивостей, компоненти можуть інайчастіше мають загальні (public), опубліковані властивості, які доступнітільки під час виконання проекту. Інспектор об'єктів використається дляустановки властивостей під час проектування. Список властивостей розташовуєтьсяна сторінці властивостей інспектори об'єктів. Можна визначити властивості підчас проектування або написати код для видозміни властивостей компонента під часвиконання проекту.
При визначеннівластивостей компонента під час проектування потрібно вибрати компонент наформі, відкрити сторінку властивостей в інспекторі об'єктів, вибрати обумовленавластивість і змінити його за допомогою редактора властивостей (це може бутипусте поле для уведення тексту або числа, що випадає список, що розкриваєтьсясписок, діалогова панель і т.д.). Події
Сторінка подій (Events) інспектори об'єктів показує списокподій, розпізнаваних компонентом (програмування для операційних систем ізграфічним користувальницьким інтерфейсом, зокрема, для Windows 95 або WindowsNT пре думає опис реакції проекту на ті або інші події, а сама операційнасистема займається постійним опитуванням комп'ютера з метою виявлення настанняякої-небудь події). Кожен компонент має свій власний набір оброблювачів подій.В C++ Builder варто писати функції, називані оброблювачами подій, і зв'язуватиподії із цими функціями. Створюючи оброблювач тої чи іншої події, ви доручаєтепрограмі виконати написану функцію, якщо ця подія відбудеться.
Для того, щоб додати оброблювачподій, потрібно вибрати на формі за допомогою миші компонент, якому необхіднийоброблювач подій, потім відкрити сторінку подій інспектори об'єктів і двічіклацнути лівою клавішею миші на колонку з поруч із подією, щоб змусити C++Builder згенерувати прототип оброблювача подій і показати його в редакторікоду. При цьому автоматично генерується текст порожньої функції, і редакторвідкривається в тім місці, де варто вводити код. Курсор позиціюється усерединіоператорних дужок {… }. Далі потрібно ввести код, що повинен виконуватисяпри настанні події. Оброблювач подій може мати параметри, які вказуються післяімені функції в круглих дужках.
/>
Рис.4. Прототип оброблювача подій.Методи
Метод є функцією, що пов'язана з компонентом, і якаоголошується як частина об'єкта. Створюючи оброблювачі подій, можна викликатиметоди, використовуючи наступну нотацію: ->, наприклад:
Edit1->Show();
Відзначимо, що при створенні форми пов'язані з нею модуль ізаголовний файл із розширенням *.h генеруються обов'язково, тоді як пристворенні нового модуля він не зобов'язаний бути пов'язаний з формою (наприклад,якщо в ньому втримуються процедури розрахунків). Імена форми та модуля можназмінити, причому бажано зробити це відразу після створення, поки на них нез'явилося багато посилань в інших формах і модулях. Менеджерпроектів
Файли, що утворять додаток – форми та модулі — зібрані впроект. Менеджер проектів показує списки файлів і модулів проекту та дозволяєстворювати навігацію між ними. Можна викликати менеджер проектів, вибравшипункт меню View/Project Manager. За замовчуванням знову створений проект одержуєім'я Project1.cpp.
/>
Рис.5. Менеджер проектів
За замовчуванням проектспочатку містить файли для однієї форми та вихідного коду одного модуля. Однакбільшість проектів містять кілька форм і модулів. Щоб додати модуль або формудо проекту, потрібно клацнути правою кнопкою миші та вибрати пункт New Form зконтекстного меню. Можна також додавати існуючі форми та модулі до проекту,використовуючи кнопку Add контекстного меню менеджера проектів і вибираючимодуль або форму, яку потрібно додати. Форми та модулі можна видалити вбудь-який момент протягом розробки проекту. Однак, через те, що форма зв'язанізавжди з модулем, не можна видалити одне без видалення іншого, за виняткомслучаючи, коли модуль не має зв'язку з формою. Видалити модуль із проектуможна, використовуючи кнопку Remove менеджера проектів.
Якщо вибрати кнопкуOptions у менеджері проектів, відкриється діалогова панель опцій проекту, уякій можна вибрати головну форму проекту, визначити, які форми будутьстворюватися динамічно, які параметри компіляції модулів (у тому числістворених в Delphi 2.0, тому що C++ Builder може включати їх у проекти) ікомпонування.
/>
Рис. 6. Установка опцій проекту
Важливим елементомсередовища розробки C++ Builder є контекстне меню, яке з‘являється принатисканні на праву клавішу миші та дозволяє швидкий доступ до найбільше частовикористовуваних команд.
Зрозуміло, C++ Builderмає убудовану систему контекстно-контекстно-залежної допомоги, доступної длябудь-якого елемента інтерфейсу та довідкової інформації, що є великим джерелом,про C++ Builder.
Практична частина
Середою розробки був вибраний інструментарій C++ Builder.Програма складається з 6 основних модулей лістинг який проводиться нище.Зауважимо лише, що вся текстова інформації системи навчання міститься увідповідних .DOC файлах, що дозволяє досить просто таоперативно управляти самою програмою.
Лістинг 1. (project.cpp)
//---------------------------------------------------------------------------
#include
#pragma hdrstop
USERES(«Project1.res»);
USEFORM(«Unit1.cpp», Form1);
USEFORM(«Unit2.cpp», Form2);
USEFORM(«Unit3.cpp», Form3);
USEFORM(«Unit4.cpp», Form4);
USEFORM(«Unit5.cpp», Form5);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1),&Form1);
Application->CreateForm(__classid(TForm2),&Form2);
Application->CreateForm(__classid(TForm3),&Form3);
Application->CreateForm(__classid(TForm4),&Form4);
Application->CreateForm(__classid(TForm5),&Form5);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//---------------------------------------------------------------------------
Лістинг 2. (Unit1.cpp)
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include «Unit2.h»
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
DrawScene();
Yield();
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
BOOL bSetupPixelFormat(HDC hdc)
{
PIXELFORMATDESCRIPTOR pfd, *ppfd;
int pixelformat;
ppfd = &pfd;
ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
ppfd->nVersion = 1;
ppfd->dwFlags = PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
ppfd->dwLayerMask = PFD_MAIN_PLANE;
ppfd->iPixelType = PFD_TYPE_COLORINDEX;
ppfd->cColorBits = 8;
ppfd->cDepthBits = 16;
ppfd->cAccumBits = 0;
ppfd->cStencilBits = 0;
if ( (pixelformat = ChoosePixelFormat(hdc, ppfd))== 0 )
{
MessageBox(NULL, «ChoosePixelFormatfailed», «Error», MB_OK);
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, ppfd) ==FALSE)
{
MessageBox(NULL, «SetPixelFormat failed»,«Error», MB_OK);
return FALSE;
}
return TRUE;
}
void TForm2::DrawScene()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
latitude += latinc;
longitude += longinc;
polarView( radius, 0, latitude, longitude );
glIndexi(RED_INDEX);
glCallList(CONE);
glIndexi(BLUE_INDEX);
glCallList(GLOBE);
glIndexi(GREEN_INDEX);
glPushMatrix();
glTranslatef(0.8F, -0.65F, 0.0F);
glRotatef(30.0F, 1.0F, 0.5F, 1.0F);
glCallList(CYLINDER);
glPopMatrix();
glPopMatrix();
SwapBuffers(ghDC);
}
GLvoid TForm2::resize( GLsizei width, GLsizei height)
{
GLfloat aspect;
glViewport( 0, 0, width, height );
aspect = (GLfloat) width / height;
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 45.0, aspect, 3.0, 7.0 );
glMatrixMode( GL_MODELVIEW );
}
GLvoid TForm2::createObjects()
{
GLUquadricObj *quadObj;
glNewList(GLOBE, GL_COMPILE);
quadObj = gluNewQuadric ();
gluQuadricDrawStyle (quadObj, GLU_LINE);
gluSphere (quadObj, 1.5, 16, 16);
glEndList();
glNewList(CONE, GL_COMPILE);
quadObj = gluNewQuadric ();
gluQuadricDrawStyle (quadObj, GLU_FILL);
gluQuadricNormals (quadObj, GLU_SMOOTH);
gluCylinder(quadObj, 0.3, 0.0, 0.6, 15, 10);
glEndList();
glNewList(CYLINDER, GL_COMPILE);
glPushMatrix ();
glRotatef ((GLfloat)90.0, (GLfloat)1.0,(GLfloat)0.0, (GLfloat)0.0);
glTranslatef ((GLfloat)0.0, (GLfloat)0.0,(GLfloat)-1.0);
quadObj = gluNewQuadric ();
gluQuadricDrawStyle (quadObj, GLU_FILL);
gluQuadricNormals (quadObj, GLU_SMOOTH);
gluCylinder (quadObj, 0.3, 0.3, 0.6, 12, 2);
glPopMatrix ();
glEndList();
}
GLvoid TForm2::initializeGL(GLsizei width, GLsizeiheight)
{
GLfloat maxObjectSize, aspect;
GLdouble near_plane;
glClearIndex( (GLfloat)BLACK_INDEX);
glClearDepth( 1.0 );
glEnable(GL_DEPTH_TEST);
glMatrixMode( GL_PROJECTION );
aspect = (GLfloat) width / height;
gluPerspective( 45.0, aspect, 3.0, 7.0 );
glMatrixMode( GL_MODELVIEW );
near_plane = 3.0;
maxObjectSize = 3.0F;
radius = near_plane + maxObjectSize/2.0;
latitude = 0.0F;
longitude = 0.0F;
latinc = 6.0F;
longinc = 2.5F;
createObjects();
}
void TForm2::polarView(GLdouble radius, GLdoubletwist, GLdouble latitude,
GLdouble longitude)
{
glTranslated(0.0, 0.0, -radius);
glRotated(-twist, 0.0, 0.0, 1.0);
glRotated(-latitude, 1.0, 0.0, 0.0);
glRotated(longitude, 0.0, 0.0, 1.0);
}
void __fastcall TForm2::FormClose(TObject *Sender,TCloseAction &Action)
{
/* Timer1->Enabled = false;
*/
if (ghRC)
wglDeleteContext(ghRC);
if (ghDC)
ReleaseDC(Handle, ghDC);
MediaPlayer1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
ghDC = GetDC(Handle);
if (!bSetupPixelFormat(ghDC))
Close();
ghRC = wglCreateContext(ghDC);
wglMakeCurrent(ghDC, ghRC);
initializeGL(ClientRect.Right, ClientRect.Bottom);
MediaPlayer1->Open();
MediaPlayer1->Play();
ProgressBar1->Position = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormKeyDown(TObject *Sender,WORD &Key,
TShiftState Shift)
{
MediaPlayer1->Close();
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormResize(TObject *Sender)
{
resize(ClientRect.Right,ClientRect.Bottom);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Timer2Timer(TObject *Sender)
{
ProgressBar1->Position++;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include «Unit3.h»
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int step=0;
TForm3::nextstep(){
switch(step){
case 0:
deltatime(300);
break;
case 1:
MediaPlayer1->FileName =«data\\765888.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 2:
deltatime(1000);
break;
case 3:
Shape3->Visible=true;
deltatime(300);
break;
case 4:
MediaPlayer1->FileName =«data\\9564334.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 5:
Label1->Visible = false;
Label2->Visible = false;
Label3->Visible = false;
Label4->Visible = false;
Label5->Visible = false;
Label6->Visible = false;
Label7->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
Label13->Visible = false;
Shape3->Visible=false;
/* Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
Label15->Visible = false;
Label16->Visible = false;*/
Label10->Visible = true;
Label11->Visible = true;
Label12->Visible = true;
Label14->Visible = true;
deltatime(300);
break;
case 6:
MediaPlayer1->FileName =«data\\533677.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 7:
deltatime(400);
break;
case 8:
Label1->Visible = true;
Label2->Visible = true;
Label3->Visible = true;
Label4->Visible = true;
Label5->Visible = true;
Label6->Visible = true;
Label7->Visible = true;
Label8->Visible = true;
Label9->Visible = true;
Label13->Visible = true;
Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
deltatime(300);
break;
case 9:
Shape2->Visible=true;
deltatime(300);
break;
case 10:
MediaPlayer1->FileName =«data\\822567.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 11:
deltatime(400);
break;
case 12:
Shape2->Visible=false;
deltatime(300);
break;
case 13:
MediaPlayer1->FileName =«data\\6345676.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 14:
deltatime(400);
break;
case 15:
Label1->Visible = false;
Label3->Visible = false;
Label4->Visible = false;
Label5->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
Label13->Visible = false;
deltatime(300);
break;
case 16:
MediaPlayer1->FileName =«data\\123423.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 17:
deltatime(300);
break;
case 18:
Label1->Visible = true;
Label2->Visible = true;
Label3->Visible = true;
Label4->Visible = true;
Label5->Visible = true;
Label6->Visible = true;
Label7->Visible = true;
Label8->Visible = true;
Label9->Visible = true;
Label13->Visible = true;
Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
deltatime(300);
break;
case 19:
MediaPlayer1->FileName =«data\\908976.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 20:
deltatime(300);
break;
case 21:
Label2->Visible = false;
Label4->Visible = false;
Label6->Visible = false;
Label7->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
deltatime(300);
break;
case 22:
MediaPlayer1->FileName =«data\\444555.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 23:
deltatime(300);
break;
case 24:
Label1->Visible = true;
Label2->Visible = true;
Label3->Visible = true;
Label4->Visible = true;
Label5->Visible = true;
Label6->Visible = true;
Label7->Visible = true;
Label8->Visible = true;
Label9->Visible = true;
Label13->Visible = true;
Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
deltatime(1500);
break;
case 25:
Label1->Visible = false;
Label2->Visible = false;
Label3->Visible = false;
Label5->Visible = false;
Label6->Visible = false;
Label7->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
Label13->Visible = false;
deltatime(300);
break;
case 26:
MediaPlayer1->FileName =«data\\444777.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 27:
deltatime(300);
break;
case 28:
MediaPlayer1->FileName =«data\\8349244.avi»;
MediaPlayer1->Open();
MediaPlayer1->Play();
Label4->Visible = false;
break;
case 29:
Close();
break;
}
}
TForm3::deltatime(int delta){
Timer1->Interval = delta;
Timer1->Enabled = true;
}
void __fastcall TForm3::FormActivate(TObject*Sender)
{
Label1->Visible = true;
Label2->Visible = true;
Label3->Visible = true;
Label4->Visible = true;
Label5->Visible = true;
Label6->Visible = true;
Label7->Visible = true;
Label8->Visible = true;
Label9->Visible = true;
Label13->Visible = true;
Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
step=0;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::BitBtn1Click(TObject*Sender)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
deltatime(10);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Timer2Timer(TObject *Sender)
{
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::MediaPlayer1Notify(TObject*Sender)
{
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormClose(TObject *Sender,TCloseAction &Action)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
step=1000;
}
//---------------------------------------------------------------------------
int t=1;
void __fastcall TForm3::BitBtn3Click(TObject*Sender)
{
if(t)
{
MediaPlayer1->Notify = false;
MediaPlayer1->Pause();
}
else
{
MediaPlayer1->Resume();
MediaPlayer1->Notify = true;
}
//Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
Лістинг 4. (Unit4.cpp)
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include «Unit4.h»
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
TForm4::deltatime(int delta){
Timer1->Interval = delta;
Timer1->Enabled = true;
}
int step=0;
TForm4::nextstep(){
switch(step){
case 0:
deltatime(200);
break;
case 1:
MediaPlayer1->FileName =«data\\6565.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 2:
deltatime(200);
break;
case 3:
MediaPlayer1->FileName =«data\\555.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 4:
deltatime(200);
break;
case 5:
MediaPlayer1->FileName =«data\\4567.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 6:
Close();
break;
}
}
void __fastcall TForm4::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm4::FormActivate(TObject*Sender)
{
step=0;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm4::MediaPlayer1Notify(TObject*Sender)
{
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm4::FormClose(TObject *Sender,TCloseAction &Action)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
step=1000;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::BitBtn1Click(TObject*Sender)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
deltatime(10);
}
//---------------------------------------------------------------------------
int t=1;
void __fastcall TForm4::BitBtn3Click(TObject*Sender)
{
if(t)
{
MediaPlayer1->Notify = false;
MediaPlayer1->Pause();
}
else
{
MediaPlayer1->Resume();
MediaPlayer1->Notify = true;
}
}
//---------------------------------------------------------------------------
Лістинг 5. (Unit5.cpp)
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include «Unit5.h»
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm5 *Form5;
//---------------------------------------------------------------------------
__fastcall TForm5::TForm5(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int step=0;
TForm5::nextstep(){
switch(step){
case 0:
deltatime(300);
break;
case 1:
MediaPlayer1->FileName =«data\\89674.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 2:
deltatime(300);
break;
case 3:
Image3->Visible = true;
deltatime(300);
break;
case 4:
MediaPlayer1->FileName =«data\\888777.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 5:
deltatime(200);
break;
case 6:
Image3->Visible = false;
deltatime(400);
break;
case 7:
Label1->Visible = true;
Label2->Visible = true;
Label3->Visible = true;
deltatime(200);
break;
case 8:
MediaPlayer1->FileName =«data\\876.mp3»;
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
}
}
TForm5::deltatime(int delta){
Timer1->Interval = delta;
Timer1->Enabled = true;
}
void __fastcall TForm5::FormActivate(TObject*Sender)
{
Label1->Visible = false;
Label2->Visible = false;
Label3->Visible = false;
Label4->Visible = false;
Label5->Visible = false;
Label6->Visible = false;
Label7->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
Label13->Visible = false;
Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
Image1->Visible = false;
Image2->Visible = false;
step=0;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm5::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm5::BitBtn1Click(TObject*Sender)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
deltatime(10);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm5::MediaPlayer1Notify(TObject*Sender)
{
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm5::FormClose(TObject *Sender,TCloseAction &Action)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
step=1000;
}
//---------------------------------------------------------------------------
int t=1;
void __fastcall TForm5::BitBtn3Click(TObject*Sender)
{
if(t)
{
MediaPlayer1->Notify = false;
MediaPlayer1->Pause();
}
else
{
MediaPlayer1->Resume();
MediaPlayer1->Notify = true;
}
//Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
Результат роботи програми
Розроблена нами програма має досить простий інтерфейс тафактично буде являти собою простий док – вьюєр скомпонованих документів, якімістять інформацію для навчання.
/>
Скрін 1. Загальний графічний інтерфейс програми.
/>
Скрін 2. Приклад уроку по Borland C++ Builder в розробленійнами програмі
Висновки
В нашій роботі були проаналізовані питання відноснотеоретичної основи побудови програм з простим інтерфейсом користувача всередовищі Borland C++ Builder а також проблеми, які виникають при цьому.Результатом цього є програма яка реалізує процес навчання програмування наданій мові програмування.
Дана програма має досить простий інтерфейс та алгоритмічнуструктуру.
Література
[1] Касаткин А.И., Вальвачев А.Н.Профессиональное прогрпммирование на языке Си. Мн., 1992. 240 С.
[2] Бруно Бабэ. Просто и ясно оBorland C++. М., 1996. 400 С.
[3] Справочник по классам BorlandC++ 4.0. К., 1994. 256 С.