Побудова клавіатурного тренажера

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

Кафедра загальної інформатики та математичного моделювання





Реєстраційний №________

Дата___________________

	







КУРСОВА РОБОТА

	(З дисципліни Об’єктно-Оріентовне Програмування)

	Тема: ”Побудова клавіатурного тренажера”







Рекомендовано до захисту

"_____"__________2007р.

Робота захищена

"_____"__________2007р.

з оцінкою

_____________________


Зміст

	

	Вступ

	Теоретична частина

Застосування C++ BUILDER для створення інтерфейсних програм

Опис VCL компонентів

Робота з графікою GDI

Практична частина

Опис роботи програми

Лістинг програми

Результат роботи програми

Висновки

Використана Література


Вступ



Основною задачею даної роботи є створення відносно простої програми клавіатурний тренажер. В якості мови розробки було вибрано BC++ BILDER 6.0, який дозволяє створювати програмні продукти із складним програмним інтерфейсом. 

Borland C++ Builder - це засіб швидкої розробки програм, що дозволяє створювати програми мовою C++, використовуючи при цьому середовище розробки і бібліотеку компонентів Delphi. Надалі в теоретичній частині буде розглядатися середовище розробки C++ Builder і основні прийоми, застосовувані при проектуванні інтерфейсу для клавіатурного тренажера. 

IDE-середовище володіє всіма необхідними інструментами програмування і є робочою областю створюваного розробником проекту. Тут створюються елементи управління і компоненти, вводиться код, настроюється С++ Builder, а також можуть задаватися властивості проекту.


Теоретична частина



Застосування C++ BUILDER для створення інтерфейсних програм



Інтегроване середовище розробки С++ Builder складається з наступних основних частин:

-	головне меню;

-	панель інструментів;

-	палітра компонентів;

-	редактор форм;

-	редактор коду.

-	інспектор об’єктів. 





Рис. 1. Загальне середовище С++ Builder.



У верхній частині вікна IDE-середовища ви бачите панель головного меню.

Панель інструментів в С++ Builder зображена на рис.2. Призначення розміщених на панелі кнопок можна дізнатися з ярличків, що з'являються, якщо ви наведете курсор миші на відповідну кнопку і на деякий час затримаєте його.





Рис. 2. Панель інструментів.



Палітра компонентів – це вітрина бібліотеки візуальних компонентів (Visual Component Library - VCL), зображена на рис. 3. Вона дозволяє згрупувати компоненти відповідно до їх призначення. Імена компонентів, які відповідають тій або іншій піктограмі, ви можете дізнатись з ярличка, що з'являється, якщо ви затримаєте над цією піктограмою курсор миші. Якщо ви виберете в палітрі компонент і натиснете клавішу F1, то вам буде показано довідку по типу даного компоненту.





Рис. 3. Палітра компонентів



Основою майже всіх проектів С++ Builder є форма, показана на рис. 4. Її можна розуміти як типове вікно Windows. Форма є основою, на якій розміщуються інші компоненти.





Рис. 4. Вікно форми



Однією з найважливіших частин середовища С++ Builder є вікно редактора коду, яке показано на рис. 5.





Рис. 5. Вікно редактора коду.



Інспектор об'єктів забезпечує простий і зручний інтерфейс для зміни властивостей об'єктів С++ Builder і управління подіями, на які реагує об'єкт.



а)  б) 

Рис. 6. Сторінка властивостей (а) та сторінка подій (б)

інспектора об'єктів.

Вікно інспектора об'єктів (рис. 6) має дві сторінки. Вверху є випадний список всіх компонентів, розміщених на формі. У ньому ви можете вибрати той компонент, властивості якого вас цікавлять.

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

Сторінка подій (events) складає другу частину інспектора об'єктів (рис. 6. б). На ній вказані всі події, на які може реагувати вибраний об'єкт. Для того, щоб додати обробник подій, потрібно вибрати на формі за допомогою миші компонент, якому необхідний обробник подій, потім відкрити сторінку подій інспектора об'єктів і двічі натиснути лівою клавішею миші на колонці значень поряд з подією, щоб примусити C++ Builder згенерувати прототип обробника подій і показати його в редакторі коду. При цьому автоматично генерується текст порожньої функції, і редактор відкривається в тому місці, де слід вводити код. Далі потрібно ввести код, який повинен виконуватися при настанні події.



Опис VCL компонентів



Палітра компонентів VCL – бібліотеки візуальних компонентів С++ Builder, має ряд сторінок, на яких представлені піктограми всіх компонентів в С++ Builder. 


Таблиця 1. Компоненти закладки Standard палітри компонентів.

Компонент

Призначення

Frames

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

MainMenu

Використовується для створення головного меню.

PopupMenu

Використовується для створення спливаючого меню, яке з’являється після натиснення правої кнопки миші користувачем. 

Label

Відображення тексту, який не змінюється користувачем

Edit

Відображення, введення і редагування однорядкових текстів.

Memo

Відображення, введення і редагування багаторядкових текстів.

Button

Використовується для створення кнопок, якими користувач виконує команди в проекті.

CheckBox

Дозволяє користувачу вмикати і вимикати опції програми

RadioButton

Пропонують користувачу набір альтернатив, з якого вибирається одна. Набір реалізується необхідною кількістю радіокнопок, розміщених в одному контейнері (формі, панелі).

ListBox

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

ComboBox

Об’єднує функції ListBox і Edit

ScrollBar

Є стандартною лінійкою прокрутки Windows і служить для управління положенням видимої частини форм або компонентів.

GroupBox

Є контейнером, об'єднуючим групу зв'язаних органів управління, таких, як радіокнопки RadioButton, контрольні індикатори CheckBox і т.д.

RadioGroup

Є комбінацією групового вікна GroupBox з набором радіокнопок RadioButton; служить спеціально для створення груп радіокнопок.

Panel

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



Таблиця 2. Основні компоненти закладок Additional, Win32, і System.

Компонент

Призначення

BitBtn

Використовується для створення кнопок, з можливістю розміщення на них бітової графіки.

MaskEdit

Використовується для форматування даних або для введення символів відповідно до шаблону.

StringGrid

Відображення текстової інформації в таблиці з рядків і стовпців з можливістю переміщатися по рядках і стовпцях і здійснювати вибір.

DrawGrid

Використовується для відображення в рядках і стовпцях нетекстових даних.

Image

Використовується для відображення графіки

ScrollBox

Використовується для створення зон відображення з прокруткою.

Chart

Компонент використовується для створення діаграм і графіків.

RichEdit

Компонент є вікном редагування в стилі Windows у форматі RTF, який дозволяє вибирати атрибути шрифту, пошук тексту і багато іншого.

UpDown

Кнопка-лічильник, яка в поєднанні з компонентами Edit і іншими дозволяє вводити цифрову інформацію.

Timer

Використовується для запуску процедур, функцій і подій у вказані інтервали часу.

PaintBox

Використовується для створення на формі деякої області, в якій можна малювати.

MediaPlayer

Використовується для створення панелі управління відтворенням звукових файлів, а також пристроїв мультимедіа.



Для відображення різних написів на формі використовуються в основному компоненти Label, StaticText, Panel. Перші два з цих компонентів – мітки, спеціально призначені для відображення текстів. Основне призначення панелі Panel: компоновка компонентів у вікні форми. Проте панель можна використовувати і для виводу текстів.

Тексти, які відображаються в перерахованих компонентах, визначаються значенням їх властивості Caption. Її можна встановлювати в процесі проектування або задавати і змінювати програмно під час виконання проекту. Наприклад: 

Label1->Caption = “Hello”;

Для мітки Label колір і шрифт – єдині доступні елементи оформлення напису. Компоненти StaticText і Panel мають окрім того властивість BorderStyle, що визначає рамку тексту – бордюр. На рис. 7 ви можете побачити впливи бордюру на елементи StaticText і Panel. 





Рис. 7. Приклад застосування компонентів Label, StaticText і Panel.

На рис. 8 можна побачити приклади вікон редагування Edit і MaskEdit. У даних елементах, текст, що вводиться і виводиться, міститься у властивості Text. 	Вікна редагування можна використовувати і як компоненти відображення тексту. Для цього треба встановити в true їх властивість ReadOnly. 





Рис. 8. Приклад застосування елементів Edit і MaskEdit.



На рис. 9 показані приклади кнопок Button і BitBtn. Простою і найчастіше використовуваною кнопкою є кнопка Button. Рідше використовується кнопка BitBtn, яка відрізняється можливістю зобразити на її поверхні зображення. Більшість властивостей, методів і подій у цих кнопок однакові. Основна властивість кнопки – Caption, за допомогою якої можна вивести любий напис на кнопці.

Основна подія будь-якої кнопки – OnClick, виникає при натисненні на ній. Саме в обробнику цієї події записуються оператори, які повинні виконуватися при натисканні користувача на кнопці.

Зображення на кнопці BitBtn задається властивістю Glyph. Положення зображення по відношенню до напису визначається властивістю Layout, яка може приймати значення: blGlyphLeft – зліва, це значення прийняте за замовчуванням, BlGlyphRight – справа, blGlyphTop – вгорі, blGlyphBottom – внизу. 





Рис. 9. Приклад застосування компонентів Button і BitBtn.



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

RadioGroup – це панель, яка може містити регулярно розташовані стовпцями і рядками радіокнопки. Напис у верху панелі визначається властивістю Caption. А написи кнопок і їх кількість визначаються властивістю Items.

Визначити, яку з кнопок вибрав користувач, можна по властивості ItemIndex, яка показує індекс вибраної кнопки. За замовчуванням ItemIndex = -1, що означає відсутність вибраної кнопки.





Рис. 10. Приклад застосування компонентів RadioGroup, RadioButton,GroupBox и CheckBox



Панель GroupBox виглядає на формі так само, як RadioGroup, і напис в її верхньому лівому кутку так само визначається властивістю Caption. Ця панель сама по собі порожня. Її призначення – служити контейнером для інших управляючих елементів, зокрема, для радіокнопок RadioButton.

Розглянемо властивості радіокнопки RadioButton. Властивість Caption містить напис, що з'являється біля кнопки. Властивість Checked визначає, вибрана дана кнопка користувачем, чи ні. Якщо Checked рівне true, то кнопка вибрана, якщо false, то ні.

Розміщення кнопок RadioButton в панелі GroupBox, як можна бачити з рис. 10 дає велику свободу в порівнянні з компонентом RadioGroup і дозволяє розмістити кнопки не регулярно.

Індикатори з прапорцем CheckBox (рис. 10) використовуються в проектах в основному для того, щоб користувач міг вмикати чи вимикати якісь опції. Основна властивість State має два значення: cbChecked – компонент виділений, cbUnchecked – компонент не виділений. Перевіряти стан індикатора можна не тільки із значення властивості State, але і по значенню властивості Checked. Якщо Checked рівне true, то індикатор вибраний, якщо false, то ні.

В С++ Builder є два компоненти, за допомогою яких можна розробити меню: MainMenu – головне меню, і PopupMenu – спливаюче меню. 

Компонент MainMenu – це невізуальний компонент. Основна властивість компоненту – Items. Його заповнення відбувається за допомогою конструктора меню, що викликається подвійним натисканням на компоненті MainMenu. В результаті відкриється вікно, вид якого показаний на рис. 11. При роботі в конструкторі меню нові розділи можна вводити, поміщаючи курсор в рамку, яка вказує місце розташування нового розділу.



Рис. 11. Вид вікна при створенні меню





Рис. 12. Приклад застосування компоненту MainMenu



Компонент Timer дозволяє задавати в проекті інтервали часу. Таймер – невізуальний компонент. Він має дві властивості, які ним керують: Interval – інтервал часу в мілісекундах і Enabled – доступність.

Якщо задати Interval = 0 або Enabled = false, то таймер перестає працювати. Щоб запустити відлік часу треба або задати Enabled = true, якщо встановлене позитивне значення Interval, або задати позитивне значення Interval, якщо Enabled = false.

Наприклад, якщо потрібно, щоб через 5 секунд після запуску проекту закрилася форма – заставка, що відображає логотип проекту, на ній треба розмістити таймер, задати в ньому інтервал Interval = 5000, а в обробник події OnTimer вставити оператор Close, що закриває вікно форми.


Робота з графікою GDI



Часто виникає потреба прикрасити свій проект картинками. Це може бути графічна заставка, що є логотипом вашого проекту, можуть бути чиїсь фотографії, картинки, графіка. 

Почнемо знайомство з компоненту Image. Його властивість, яка може містити картинку – Picture. Вона дозволяє відкрити який-небудь графічний файл (кнопка Load), а також зберегти відкритий файл під новим ім'ям або в новому каталозі. На рис. 13 зображене завантаження файлу.





Рис. 13. Вікно завантаження картинки компоненту Image.



Після завантаження файлу натисніть на ОК, і у вашому компоненті Image відобразиться вибрана вами картинка.

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

Якщо встановити властивість AutoSize в true, то розмір компоненту Image автоматично підганятиметься під розмір компоненту. Якщо ж властивість AutoSize встановлена в false, то зображення може не поміститися в компонент або, навпаки, площа компоненту може виявитися набагато більша площі зображення. 

Властивість – Stretch дозволяє підганяти не компонент під розмір малюнка, а малюнок під розмір компоненту. Встановіть AutoSize в false, розтягніть або стисніть розмір компоненту Image і встановіть Stretch в true. Ви побачите, що малюнок займе всю площу компоненту, але оскільки навряд чи реально встановити розміри Image точно пропорційними розміру малюнка, то зображення спотвориться. Встановлювати Stretch в true може мати сенс тільки для якихось узорів, але не для картинок.

Властивість – Center, встановлене в true, центрує зображення на площі Image, якщо розмір компоненту більше розміру малюнка. Ще одна властивість – Transparent (прозорість). Якщо Transparent рівне true, то зображення Image стає прозорим. Це можна використовувати для накладення зображень одне на одне.

Багато компонентів в С++ Builder мають властивість Canvas, що є областю компоненту, на якій можна малювати або відображати готові зображення. Цю властивість мають форми, графічні компоненти Image, PaintBox, Bitmap і багато інших.


Практична частина



Опис програми



Середовищем розробки був вибраний інструментарій C++ Builder 6. Програма складається з 3 основних модулів лістинг яких буде приведений нижче. 

Програма клавіатурний тренажер зроблена для того щоб поліпшити свої навики по набору тексту на клавіатурі.

В опціях користувач може вибрати собі режим тренування, а саме: 

встановити мову (англійську, українську чи російську);

рівень складності (початківець чи професіонал);

час тренування (встановлюється у секундах).

За замовчуванням режим встановлено так: мова – англійська, рівень складності – початківець, час тренування – 30 секунд.



Лістинг програми



Лістинг 1. (Unit1.cpp)

#include <vcl.h>

#pragma hdrstop



#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

int rezhim=1,rivenj=1,chas=30,chas1=0,min=0,sec=0,NoCorect=0,Corect=0;

String slitera,skey;

TTrainForm *TrainForm;

//---------------------------------------------------------------------------

__fastcall TTrainForm::TTrainForm(TComponent* Owner)

 : TForm(Owner)

{

}



//Нижче представлена функція випадковим чином вибирає англійську літеру, яка буде падати

String EngWord(){

int rr; String ll;

randomize;

rr=random(26);

switch(rr){

case 0: return ll='q';

case 1: return ll='w';

case 2: return ll='e';

case 3: return ll='r';

case 4: return ll='t';

case 5: return ll='y';

case 6: return ll='u';

case 7: return ll='i';

case 8: return ll='o';

case 9: return ll='p';

case 10: return ll='a';

case 11: return ll='s';

case 12: return ll='d';

case 13: return ll='f';

case 14: return ll='g';

case 15: return ll='h';

case 16: return ll='j';

case 17: return ll='k';

case 18: return ll='l';

case 19: return ll='z';

case 20: return ll='x';

case 21: return ll='c';

case 22: return ll='v';

case 23: return ll='b';

case 24: return ll='n';

case 25: return ll='m';

}

};



//Нижче представлена функція випадковим чином вибирає українську літеру, яка буде падати

String UkrWord(){

int rr; String ll;

randomize;

rr=random(32);

switch(rr){

case 0: return ll='й';

case 1: return ll='ц';

case 2: return ll='у';

case 3: return ll='к';

case 4: return ll='е';

case 5: return ll='н';

case 6: return ll='г';

case 7: return ll='ш';

case 8: return ll='щ';

case 9: return ll='з';

case 10: return ll='х';

case 11: return ll='ї';

case 12: return ll='ф';

case 13: return ll='і';

case 14: return ll='в';

case 15: return ll='а';

case 16: return ll='п';

case 17: return ll='р';

case 18: return ll='о';

case 19: return ll='л';

case 20: return ll='д';

case 21: return ll='ж';

case 22: return ll='є';

case 23: return ll='я';

case 24: return ll='ч';

case 25: return ll='с';

case 26: return ll='м';

case 27: return ll='и';

case 28: return ll='т';

case 29: return ll='ь';

case 30: return ll='б';

case 31: return ll='ю';

}

};



//Нижче представлена функція випадковим чином вибирає російську літеру, яка буде падати

String RusWord(){

int rr; String ll;

randomize;

rr=random(33);

switch(rr){

case 0: return ll='й';

case 1: return ll='ц';

case 2: return ll='у';

case 3: return ll='к';

case 4: return ll='е';

case 5: return ll='н';

case 6: return ll='г';

case 7: return ll='ш';

case 8: return ll='щ';

case 9: return ll='з';

case 10: return ll='х';

case 11: return ll='ъ';

case 12: return ll='ф';

case 13: return ll='ы';

case 14: return ll='в';

case 15: return ll='а';

case 16: return ll='п';

case 17: return ll='р';

case 18: return ll='о';

case 19: return ll='л';

case 20: return ll='д';

case 21: return ll='ж';

case 22: return ll='э';

case 23: return ll='я';

case 24: return ll='ч';

case 25: return ll='с';

case 26: return ll='м';

case 27: return ll='и';

case 28: return ll='т';

case 29: return ll='ь';

case 30: return ll='б';

case 31: return ll='ю';

case 32: return ll='ё';

}

};



void __fastcall TTrainForm::N5Click(TObject *Sender)

{

TrainForm->Close();

}



//---------------------------------------------------------------------------

void __fastcall TTrainForm::N6Click(TObject *Sender)

{

Application->MessageBoxA("Програма Клавіатурний Тренажер","Про Програму...",MB_OK);

}



//Під час запуску програми будуть сховані всі компоненти--------------------

void __fastcall TTrainForm::FormCreate(TObject *Sender)

{

 Timer1->Enabled=false;

Timer2->Enabled=false;

Options->Hide();

TrainUkr->Hide();

TrainRus->Hide();

TrainEng->Hide();

PTimer->Hide();

}



//Зчитуємо дані, які задав користувач на вкладці Опції----------------------

void __fastcall TTrainForm::Button1Click(TObject *Sender)

{

if (ukrainian->Checked==true)

rezhim=2; else

if (russian->Checked==true)

rezhim=3; else rezhim=1;

if (prof->Checked==true)

rivenj=2; else rivenj=1;

chas=StrToInt(time->Text);

Options->Hide();

}



//---------------------------------------------------------------------------

void __fastcall TTrainForm::N7Click(TObject *Sender)

{

Application->MessageBoxA("Програму розробив студент ІІ курсу Факультета інформатики Шанта А. П.","Про Автора...",MB_OK);

}



//Після вибору Файл->Тренажер виконується наступне----------------------------

void __fastcall TTrainForm::N4Click(TObject *Sender)

{

TrainUkr->Hide();

TrainRus->Hide();

TrainEng->Hide();

Options->Hide();

Application->MessageBoxA("Натисніть Enter, щоб розпочати тренування"," Увага!",MB_OK);

PTimer->Show(); sec=0; min=0; Timer1->Enabled=true;

Timer2->Enabled=true;

Pravilno->Caption=0; Corect=0;

NePravilno->Caption=0; NoCorect=0;

if (rezhim==1) {

TrainUkr->Hide();

TrainRus->Hide();

Options->Hide();

LiteraEng->Top=8;

}

if (rezhim==2){

LiteraUkr->Top=8;

TrainRus->Hide();

TrainEng->Hide();

Options->Hide();

}

if (rezhim==3){ LiteraRus->Top=8;

TrainUkr->Hide();

TrainEng->Hide();

Options->Hide();

}

if (rivenj==1) Timer2->Interval=11; else Timer2->Interval=4;

sec=0; min=0; chas1=0;



//-----Нижче оформлений процес падання української літери

//-----та підсвітка падаючої літери на віртуальній клавіатурі

 if (rezhim==2){

TrainUkr->Show();

 LiteraUkr->Show();

int LeftRan;

Randomize;

LeftRan=random(623)+8;

LiteraUkr->Left=LeftRan;

slitera=UkrWord();

LiteraUkr->Caption=slitera;

if (slitera=='й') q1->Font->Color=clRed; else q1->Font->Color=clBlack;

if (slitera=='ц') w1->Font->Color=clRed; else w1->Font->Color=clBlack;

if (slitera=='у') e1->Font->Color=clRed; else e1->Font->Color=clBlack;

if (slitera=='к') r1->Font->Color=clRed; else r1->Font->Color=clBlack;

if (slitera=='е') t1->Font->Color=clRed; else t1->Font->Color=clBlack;

if (slitera=='н') y1->Font->Color=clRed; else y1->Font->Color=clBlack;

if (slitera=='г') u1->Font->Color=clRed; else u1->Font->Color=clBlack;

if (slitera=='ш') i1->Font->Color=clRed; else i1->Font->Color=clBlack;

if (slitera=='щ') o1->Font->Color=clRed; else o1->Font->Color=clBlack;

if (slitera=='з') p1->Font->Color=clRed; else p1->Font->Color=clBlack;

if (slitera=='х') p11->Font->Color=clRed; else p11->Font->Color=clBlack;

if (slitera=='ї') p111->Font->Color=clRed; else p111->Font->Color=clBlack;

if (slitera=='ф') a1->Font->Color=clRed; else a1->Font->Color=clBlack;

if (slitera=='і') s1->Font->Color=clRed; else s1->Font->Color=clBlack;

if (slitera=='в') d1->Font->Color=clRed; else d1->Font->Color=clBlack;

if (slitera=='а') f1->Font->Color=clRed; else f1->Font->Color=clBlack;

if (slitera=='п') g1->Font->Color=clRed; else g1->Font->Color=clBlack;

if (slitera=='р') h1->Font->Color=clRed; else h1->Font->Color=clBlack;

if (slitera=='о') j1->Font->Color=clRed; else j1->Font->Color=clBlack;

if (slitera=='л') k1->Font->Color=clRed; else k1->Font->Color=clBlack;

if (slitera=='д') l1->Font->Color=clRed; else l1->Font->Color=clBlack;

if (slitera=='ж') l11->Font->Color=clRed; else l11->Font->Color=clBlack;

if (slitera=='є') l111->Font->Color=clRed; else l111->Font->Color=clBlack;

if (slitera=='я') z1->Font->Color=clRed; else z1->Font->Color=clBlack;

if (slitera=='ч') x1->Font->Color=clRed; else x1->Font->Color=clBlack;

if (slitera=='с') c1->Font->Color=clRed; else c1->Font->Color=clBlack;

if (slitera=='м') v1->Font->Color=clRed; else v1->Font->Color=clBlack;

if (slitera=='и') b1->Font->Color=clRed; else b1->Font->Color=clBlack;

if (slitera=='т') n11->Font->Color=clRed; else n11->Font->Color=clBlack;

if (slitera=='ь') m1->Font->Color=clRed; else m1->Font->Color=clBlack;

if (slitera=='б') m11->Font->Color=clRed; else m11->Font->Color=clBlack;

if (slitera=='ю') m111->Font->Color=clRed; else m111->Font->Color=clBlack;

 };



//-----Нижче оформлений процес падання російської літери

//-----та підсвітка падаючої літери на віртуальній клавіатурі

if (rezhim==3){

TrainRus->Show();

 LiteraRus->Show();

int LeftRan;

Randomize;

LeftRan=random(623)+8;

LiteraRus->Left=LeftRan;

slitera=RusWord();

LiteraRus->Caption=slitera;

if (slitera=='й') q2->Font->Color=clRed; else q2->Font->Color=clBlack;

if (slitera=='ц') w2->Font->Color=clRed; else w2->Font->Color=clBlack;

if (slitera=='у') e2->Font->Color=clRed; else e2->Font->Color=clBlack;

if (slitera=='к') r2->Font->Color=clRed; else r2->Font->Color=clBlack;

if (slitera=='е') t2->Font->Color=clRed; else t2->Font->Color=clBlack;

if (slitera=='н') y2->Font->Color=clRed; else y2->Font->Color=clBlack;

if (slitera=='г') u2->Font->Color=clRed; else u2->Font->Color=clBlack;

if (slitera=='ш') i2->Font->Color=clRed; else i2->Font->Color=clBlack;

if (slitera=='щ') o2->Font->Color=clRed; else o2->Font->Color=clBlack;

if (slitera=='з') p2->Font->Color=clRed; else p2->Font->Color=clBlack;

if (slitera=='х') p22->Font->Color=clRed; else p22->Font->Color=clBlack;

if (slitera=='ъ') p222->Font->Color=clRed; else p222->Font->Color=clBlack;

if (slitera=='ф') a2->Font->Color=clRed; else a2->Font->Color=clBlack;

if (slitera=='ы') s2->Font->Color=clRed; else s2->Font->Color=clBlack;

if (slitera=='в') d2->Font->Color=clRed; else d2->Font->Color=clBlack;

if (slitera=='а') f2->Font->Color=clRed; else f2->Font->Color=clBlack;

if (slitera=='п') g2->Font->Color=clRed; else g2->Font->Color=clBlack;

if (slitera=='р') h2->Font->Color=clRed; else h2->Font->Color=clBlack;

if (slitera=='о') j2->Font->Color=clRed; else j2->Font->Color=clBlack;

if (slitera=='л') k2->Font->Color=clRed; else k2->Font->Color=clBlack;

if (slitera=='д') l2->Font->Color=clRed; else l2->Font->Color=clBlack;

if (slitera=='ж') l22->Font->Color=clRed; else l22->Font->Color=clBlack;

if (slitera=='э') l222->Font->Color=clRed; else l222->Font->Color=clBlack;

if (slitera=='я') z2->Font->Color=clRed; else z2->Font->Color=clBlack;

if (slitera=='ч') x2->Font->Color=clRed; else x2->Font->Color=clBlack;

if (slitera=='с') c2->Font->Color=clRed; else c2->Font->Color=clBlack;

if (slitera=='м') v2->Font->Color=clRed; else v2->Font->Color=clBlack;

if (slitera=='и') b2->Font->Color=clRed; else b2->Font->Color=clBlack;

if (slitera=='т') n22->Font->Color=clRed; else n22->Font->Color=clBlack;

if (slitera=='ь') m2->Font->Color=clRed; else m2->Font->Color=clBlack;

if (slitera=='б') m22->Font->Color=clRed; else m22->Font->Color=clBlack;

if (slitera=='ю') m222->Font->Color=clRed; else m222->Font->Color=clBlack;

if (slitera=='ё') ee->Font->Color=clRed; else ee->Font->Color=clBlack;

 }



//-----Нижче оформлений процес падання англійської літери

//-----та підсвітка падаючої літери на віртуальній клавіатурі

 if (rezhim==1) {

TrainEng->Show();

LiteraEng->Show();

int LeftRan;

Randomize;

LeftRan=random(623)+8;

LiteraEng->Left=LeftRan;

slitera=EngWord();

LiteraEng->Caption=slitera;

if (slitera=='q') q->Font->Color=clRed; else q->Font->Color=clBlack;

if (slitera=='w') w->Font->Color=clRed; else w->Font->Color=clBlack;

if (slitera=='e') e->Font->Color=clRed; else e->Font->Color=clBlack;

if (slitera=='r') r->Font->Color=clRed; else r->Font->Color=clBlack;

if (slitera=='t') t->Font->Color=clRed; else t->Font->Color=clBlack;

if (slitera=='y') y->Font->Color=clRed; else y->Font->Color=clBlack;

if (slitera=='u') u->Font->Color=clRed; else u->Font->Color=clBlack;

if (slitera=='i') i->Font->Color=clRed; else i->Font->Color=clBlack;

if (slitera=='o') o->Font->Color=clRed; else o->Font->Color=clBlack;

if (slitera=='p') p->Font->Color=clRed; else p->Font->Color=clBlack;

if (slitera=='a') a->Font->Color=clRed; else a->Font->Color=clBlack;

if (slitera=='s') s->Font->Color=clRed; else s->Font->Color=clBlack;

if (slitera=='d') d->Font->Color=clRed; else d->Font->Color=clBlack;

if (slitera=='f') f->Font->Color=clRed; else f->Font->Color=clBlack;

if (slitera=='g') g->Font->Color=clRed; else g->Font->Color=clBlack;

if (slitera=='h') h->Font->Color=clRed; else h->Font->Color=clBlack;

if (slitera=='j') j->Font->Color=clRed; else j->Font->Color=clBlack;

if (slitera=='k') k->Font->Color=clRed; else k->Font->Color=clBlack;

if (slitera=='l') l->Font->Color=clRed; else l->Font->Color=clBlack;

if (slitera=='z') z->Font->Color=clRed; else z->Font->Color=clBlack;

if (slitera=='x') x->Font->Color=clRed; else x->Font->Color=clBlack;

if (slitera=='c') c->Font->Color=clRed; else c->Font->Color=clBlack;

if (slitera=='v') v->Font->Color=clRed; else v->Font->Color=clBlack;

if (slitera=='b') b->Font->Color=clRed; else b->Font->Color=clBlack;

if (slitera=='n') n->Font->Color=clRed; else n->Font->Color=clBlack;

if (slitera=='m') m->Font->Color=clRed; else m->Font->Color=clBlack;

 }

}



//Відкриваються Опції клавіатурного тренажера------------------------------------------

void __fastcall TTrainForm::N3Click(TObject *Sender)

{

Timer1->Enabled=false;

Timer2->Enabled=false;

PTimer->Hide();

TrainUkr->Hide();

TrainRus->Hide();

TrainEng->Hide();

Options->Show();

}



//Організація виводу часу під час тренування--------------------------------

void __fastcall TTrainForm::Timer1Timer(TObject *Sender)

{

if (sec==59){ min++; sec=-1;

}

sec++; chas1++;

int nul=0;

if (sec<10) timersec->Caption=IntToStr(nul)+IntToStr(sec); else timersec->Caption=IntToStr(sec);

if (min<10) timermin->Caption=IntToStr(nul)+IntToStr(min); else timermin->Caption=IntToStr(min);

}



//Наступний код обробляється під час падання літери-------------------------

void __fastcall TTrainForm::Timer2Timer(TObject *Sender)

{

//-----Присвоюються випадкові по горизонталі координати падаючой літери

//-----та перевірка того, чи вчасно була натиснута відповідна літера

if (rezhim==1){

 LiteraEng->Top=(LiteraEng->Top)+1;

if (LiteraEng->Top>225) {

if (LiteraEng->Top!=255+1)

NoCorect++;

NePravilno->Caption=IntToStr(NoCorect);

if (rezhim==1) slitera=EngWord();

LiteraEng->Top=8;

Randomize;

int lran;

lran=random(623)+8;

LiteraEng->Left=lran;

LiteraEng->Caption=slitera; LiteraEng->Show(); }

}

if (rezhim==2){

 LiteraUkr->Top=(LiteraUkr->Top)+1;

if (LiteraUkr->Top>225) {

if (LiteraUkr->Top!=255+1)

NoCorect++;

NePravilno->Caption=IntToStr(NoCorect);

slitera=UkrWord();

LiteraUkr->Top=8;

Randomize;

int lran;

lran=random(623)+8;

LiteraUkr->Left=lran;

LiteraUkr->Caption=slitera; LiteraUkr->Show(); }

}

if (rezhim==3){

 LiteraRus->Top=(LiteraRus->Top)+1;

if (LiteraRus->Top>225) {

if (LiteraRus->Top!=255+1)

NoCorect++;

NePravilno->Caption=IntToStr(NoCorect);

slitera=RusWord();

LiteraRus->Top=8;

Randomize;

int lran;

lran=random(623)+8;

LiteraRus->Left=lran;

LiteraRus->Caption=slitera; LiteraRus->Show(); }

}



//-----Нижче оформлений процес підсвітки падаючої літери на віртуальній клавіатурі

if (rezhim==1) {

if (slitera=='q') q->Font->Color=clRed; else q->Font->Color=clBlack;

if (slitera=='w') w->Font->Color=clRed; else w->Font->Color=clBlack;

if (slitera=='e') e->Font->Color=clRed; else e->Font->Color=clBlack;

if (slitera=='r') r->Font->Color=clRed; else r->Font->Color=clBlack;

if (slitera=='t') t->Font->Color=clRed; else t->Font->Color=clBlack;

if (slitera=='y') y->Font->Color=clRed; else y->Font->Color=clBlack;

if (slitera=='u') u->Font->Color=clRed; else u->Font->Color=clBlack;

if (slitera=='i') i->Font->Color=clRed; else i->Font->Color=clBlack;

if (slitera=='o') o->Font->Color=clRed; else o->Font->Color=clBlack;

if (slitera=='p') p->Font->Color=clRed; else p->Font->Color=clBlack;

if (slitera=='a') a->Font->Color=clRed; else a->Font->Color=clBlack;

if (slitera=='s') s->Font->Color=clRed; else s->Font->Color=clBlack;

if (slitera=='d') d->Font->Color=clRed; else d->Font->Color=clBlack;

if (slitera=='f') f->Font->Color=clRed; else f->Font->Color=clBlack;

if (slitera=='g') g->Font->Color=clRed; else g->Font->Color=clBlack;

if (slitera=='h') h->Font->Color=clRed; else h->Font->Color=clBlack;

if (slitera=='j') j->Font->Color=clRed; else j->Font->Color=clBlack;

if (slitera=='k') k->Font->Color=clRed; else k->Font->Color=clBlack;

if (slitera=='l') l->Font->Color=clRed; else l->Font->Color=clBlack;

if (slitera=='z') z->Font->Color=clRed; else z->Font->Color=clBlack;

if (slitera=='x') x->Font->Color=clRed; else x->Font->Color=clBlack;

if (slitera=='c') c->Font->Color=clRed; else c->Font->Color=clBlack;

if (slitera=='v') v->Font->Color=clRed; else v->Font->Color=clBlack;

if (slitera=='b') b->Font->Color=clRed; else b->Font->Color=clBlack;

if (slitera=='n') n->Font->Color=clRed; else n->Font->Color=clBlack;

if (slitera=='m') m->Font->Color=clRed; else m->Font->Color=clBlack;

}

if (rezhim==2) {

if (slitera=='й') q1->Font->Color=clRed; else q1->Font->Color=clBlack;

if (slitera=='ц') w1->Font->Color=clRed; else w1->Font->Color=clBlack;

if (slitera=='у') e1->Font->Color=clRed; else e1->Font->Color=clBlack;

if (slitera=='к') r1->Font->Color=clRed; else r1->Font->Color=clBlack;

if (slitera=='е') t1->Font->Color=clRed; else t1->Font->Color=clBlack;

if (slitera=='н') y1->Font->Color=clRed; else y1->Font->Color=clBlack;

if (slitera=='г') u1->Font->Color=clRed; else u1->Font->Color=clBlack;

if (slitera=='ш') i1->Font->Color=clRed; else i1->Font->Color=clBlack;

if (slitera=='щ') o1->Font->Color=clRed; else o1->Font->Color=clBlack;

if (slitera=='з') p1->Font->Color=clRed; else p1->Font->Color=clBlack;

if (slitera=='х') p11->Font->Color=clRed; else p11->Font->Color=clBlack;

if (slitera=='ї') p111->Font->Color=clRed; else p111->Font->Color=clBlack;

if (slitera=='ф') a1->Font->Color=clRed; else a1->Font->Color=clBlack;

if (slitera=='і') s1->Font->Color=clRed; else s1->Font->Color=clBlack;

if (slitera=='в') d1->Font->Color=clRed; else d1->Font->Color=clBlack;

if (slitera=='а') f1->Font->Color=clRed; else f1->Font->Color=clBlack;

if (slitera=='п') g1->Font->Color=clRed; else g1->Font->Color=clBlack;

if (slitera=='р') h1->Font->Color=clRed; else h1->Font->Color=clBlack;

if (slitera=='о') j1->Font->Color=clRed; else j1->Font->Color=clBlack;

if (slitera=='л') k1->Font->Color=clRed; else k1->Font->Color=clBlack;

if (slitera=='д') l1->Font->Color=clRed; else l1->Font->Color=clBlack;

if (slitera=='ж') l11->Font->Color=clRed; else l11->Font->Color=clBlack;

if (slitera=='є') l111->Font->Color=clRed; else l111->Font->Color=clBlack;

if (slitera=='я') z1->Font->Color=clRed; else z1->Font->Color=clBlack;

if (slitera=='ч') x1->Font->Color=clRed; else x1->Font->Color=clBlack;

if (slitera=='с') c1->Font->Color=clRed; else c1->Font->Color=clBlack;

if (slitera=='м') v1->Font->Color=clRed; else v1->Font->Color=clBlack;

if (slitera=='и') b1->Font->Color=clRed; else b1->Font->Color=clBlack;

if (slitera=='т') n11->Font->Color=clRed; else n11->Font->Color=clBlack;

if (slitera=='ь') m1->Font->Color=clRed; else m1->Font->Color=clBlack;

if (slitera=='б') m11->Font->Color=clRed; else m11->Font->Color=clBlack;

if (slitera=='ю') m111->Font->Color=clRed; else m111->Font->Color=clBlack;

 }

if (rezhim==3) {

if (slitera=='й') q2->Font->Color=clRed; else q2->Font->Color=clBlack;

if (slitera=='ц') w2->Font->Color=clRed; else w2->Font->Color=clBlack;

if (slitera=='у') e2->Font->Color=clRed; else e2->Font->Color=clBlack;

if (slitera=='к') r2->Font->Color=clRed; else r2->Font->Color=clBlack;

if (slitera=='е') t2->Font->Color=clRed; else t2->Font->Color=clBlack;

if (slitera=='н') y2->Font->Color=clRed; else y2->Font->Color=clBlack;

if (slitera=='г') u2->Font->Color=clRed; else u2->Font->Color=clBlack;

if (slitera=='ш') i2->Font->Color=clRed; else i2->Font->Color=clBlack;

if (slitera=='щ') o2->Font->Color=clRed; else o2->Font->Color=clBlack;

if (slitera=='з') p2->Font->Color=clRed; else p2->Font->Color=clBlack;

if (slitera=='х') p22->Font->Color=clRed; else p22->Font->Color=clBlack;

if (slitera=='ъ') p222->Font->Color=clRed; else p222->Font->Color=clBlack;

if (slitera=='ф') a2->Font->Color=clRed; else a2->Font->Color=clBlack;

if (slitera=='ы') s2->Font->Color=clRed; else s2->Font->Color=clBlack;

if (slitera=='в') d2->Font->Color=clRed; else d2->Font->Color=clBlack;

if (slitera=='а') f2->Font->Color=clRed; else f2->Font->Color=clBlack;

if (slitera=='п') g2->Font->Color=clRed; else g2->Font->Color=clBlack;

if (slitera=='р') h2->Font->Color=clRed; else h2->Font->Color=clBlack;

if (slitera=='о') j2->Font->Color=clRed; else j2->Font->Color=clBlack;

if (slitera=='л') k2->Font->Color=clRed; else k2->Font->Color=clBlack;

if (slitera=='д') l2->Font->Color=clRed; else l2->Font->Color=clBlack;

if (slitera=='ж') l22->Font->Color=clRed; else l22->Font->Color=clBlack;

if (slitera=='э') l222->Font->Color=clRed; else l222->Font->Color=clBlack;

if (slitera=='я') z2->Font->Color=clRed; else z2->Font->Color=clBlack;

if (slitera=='ч') x2->Font->Color=clRed; else x2->Font->Color=clBlack;

if (slitera=='с') c2->Font->Color=clRed; else c2->Font->Color=clBlack;

if (slitera=='м') v2->Font->Color=clRed; else v2->Font->Color=clBlack;

if (slitera=='и') b2->Font->Color=clRed; else b2->Font->Color=clBlack;

if (slitera=='т') n22->Font->Color=clRed; else n22->Font->Color=clBlack;

if (slitera=='ь') m2->Font->Color=clRed; else m2->Font->Color=clBlack;

if (slitera=='б') m22->Font->Color=clRed; else m22->Font->Color=clBlack;

if (slitera=='ю') m222->Font->Color=clRed; else m222->Font->Color=clBlack;

if (slitera=='ё') ee->Font->Color=clRed; else ee->Font->Color=clBlack;

 }



//-----Перевірка часу, та припинення тренування у випадку якщо час закінчився 

if ((chas1==chas)&&(chas!=0)){

Timer2->Enabled=false; Timer1->Enabled=false;

if (rezhim==1) LiteraEng->Hide();

if (rezhim==2) LiteraUkr->Hide();

if (rezhim==3) LiteraRus->Hide();

Form2->Show();

Form2->NePravilno->Caption=IntToStr(NoCorect);

Form2->Pravilno->Caption=IntToStr(Corect);

Form2->All->Caption=IntToStr(Corect+NoCorect);

if (NoCorect!=0){

float kk;

kk=(float)Corect/(float)NoCorect;

Form2->Koef->Caption=FloatToStr(kk);

}

else

Form2->Koef->Caption=IntToStr(Corect);



}

}



//Нижче представлений код виконується тоді коли під час тренування

//натискається будь-яка клавіша. Виконується перевірка правильності натиснутої кнопки

void __fastcall TTrainForm::FormKeyPress(TObject *Sender, char &Key)

{

skey=Key;

 if (skey==slitera){

 if (rezhim==1) slitera=EngWord();

 if (rezhim==2) slitera=UkrWord();

 if (rezhim==3) slitera=RusWord();

 Corect++;

 if (rezhim==1){

 LiteraEng->Hide(); LiteraEng->Top=255;

 }

 if (rezhim==2){

 LiteraUkr->Hide(); LiteraUkr->Top=255;

 }

 if (rezhim==3){

 LiteraRus->Hide(); LiteraRus->Top=255;

 }

 Pravilno->Caption=IntToStr(Corect);

 } else {

 NoCorect++; NePravilno->Caption=IntToStr(NoCorect);

 }

}



//Відкривається нове вікно з підсказками по роботі з клавіатурою-------------

void __fastcall TTrainForm::N8Click(TObject *Sender)

{

TrainForm->Hide();

Form3->Show();

}

Лістинг 2. (Unit2.cpp)

#include <vcl.h>

#pragma hdrstop



#include "Unit1.h"

#include "Unit2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm2 *Form2;

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

 : TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm2::OKClick(TObject *Sender)

{

TrainForm->Pravilno->Caption=0;

TrainForm->NePravilno->Caption=0;

Form2->Close();

}

Лістинг 3. (Unit3.cpp)

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include "Unit3.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm3 *Form3;

fastcall TForm3::TForm3(TComponent* Owner)

 : TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm3::Button1Click(TObject *Sender)

{

Form3->Hide();

TrainForm->Show();

}

//---------------------------------------------------------------------------

void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)

{

TrainForm->Show();

}


Результат роботи програми.





1. Початковий стан



2. Після вибору Файл->Опції






3. Після вибору Файл->Тренажер







4. Після вибору Інформація->Підказки по роботі з клавіатурою









5. Після закінчення вибраного часу


Висновки



В нашій роботі були проаналізовані питання відносно теоретичної основи побудови програм з простим інтерфейсом користувача в середовищі Borland C++ Builder а також проблеми, які виникають при цьому. Результатом цього є програма яка реалізує процес тренування на клавіатурі. Дана програма має досить простий інтерфейс та алгоритмічну структуру, завдяки чому вона зрозуміла кожному користувачу.

	
Використана література

	

	А.Я.Архангельский. Программирование в С++ Builder 6. – M.: ЗАО “Издательство Бином”, 2003. – 1152 с.

	А.Я.Архангельский. Решение типовых задач в С++ Builder 6. – M.: ЗАО “Издательство Бином”, 2003. – 520 с.

	А.Я.Архангельский. Язык SQL в С++ Builder 5. – M.: ЗАО “Издательство Бином”, 2000. – 224 с.

	Ф.А.Фридман. Основы объектно-ориентированного программирования на языке С++. – М.: “Горячая линия”, 2001. – 232с.

	В.Шамис. Borland C++ Builder 6. – Санкт-Петербург: “Питер”, 2003. – 800с.

	Холингвэрт, Сворт, Кэшмэн, Густавсон. Borland C++ Builder 6. Руководство разработчика. – М.: “Вильямс”, 2003, 976 с.

	А.Хоменко. Работа с базами данных в С++ Builder 6. – M.: “BHV-СПб”, 2005. – 400 с.