:: Меню ::

Головна
Передмова
СЕРЕДОВИЩЕ РОЗРОБКИ C++ BUILDER
Початок роботи
Перший проект
ПРАКТИКУМ ПРОГРАМУВАННЯ
Графіка
Мультимедіа
Бази даних
Компонент програміста
Консольне застосування
Довідкова система
Створення настановного диска
Приклади програм
C++ Builder — короткий довідник
Книга для гостей
Контакти
Добавити у вибране

:: Друзі ::

 

:: Лічильники ::

=

 

 

 

 

 

Текст програми



Після того, як буде створена форма програми, можна приступити до кодування (набору тексту). Спочатку треба внести доповнення в оголошення форми (лістинг 10.1) — оголосити масив компонентів Radiobutton функцію обробки події click на кнопці вибору відповіді і функції, забезпечуюче відображення і видалення питання. Слід звернути увагу на те, що оголошення масиву компонентів Radiobutton (покажчиків на компоненти) тільки встановлює факт існування компонентів, самі ж компоненти будуть створені на початку роботи програми. Робить це конструктор форми. Він же задає функції обробки події click для компонентів масиву. Інший важливий момент, на який слід звернути увагу, це оголошення функцій swowvopros і Erasevopros як методів об'єкту Form1 . Це зроблено для того, щоб забезпечити цим функціям прямий доступ до компонентів форми.

Текст модуля головної форми приведений в лістингу 10.2.

Лістінг10.1. Програма тестування (заголовний файл)

#ifndef tester_h
#define tester_h
#include <Classes.hpp> 
#include <Controls.hpp> 
#include <Stdctrls.hpp> 
#include <Forms.hpp> 
#include <Extctrls.hpp>
#include <Dialogs.hpp> 
#include <Graphics.hpp>
// питання struct Tvopros {
Ansistring Vopr;  // питання
Ansistring Img;   // ілюстрація (ім'я BMP-файла)
Ansistring Otv[4]; // варіанти відповіді
int      notv;  // к-ть варіантів відповіді
int      rotv;  // номер правильної відповіді };
// форма
class Tforml : public Tform { published: 
 // Ide-managed Components
Tlabel *Labell;  // інформаційне повідомлення, питання
Tlmage *Imagel;  // ілюстрація до питання
Tbutton *Buttonl; // кнопка OK / Далі
void__fastcall Formactivate(Tobject *Sender);
void __fastcall Buttonlclick(Tobject *Sender);
private:
Tradiobutton *RadioButton[4]; 
 // варіанти відповіді - кнопки вибору
void __fastcall Radiobuttonclick(Tobject *Sender);
 // клацання на
// кнопці вибору відповіді
void __fastcall Showvopros(Tvopros v);
  // виводить питання
void __fastcall Erasevopros(void);   
  // видаляє питання
public:
__fastcall Tforml (Tcornponent* Owner) ;
};
extern PACKAGE Tforml *Forml;
 #endif

Лістинг 10.2. Програма тестування

/* Універсальна .программа тестування.
Тест завантажується з файлу, ім'я якого 
повинно бути вказано в командному рядку.
Програма демонструє створення і налаштування 
компонентів під час роботи програми. */
# include <vcl.h>
#pragma hdrstop
#include "tester_.h"
#include <stdio.h
// для доступу до функції sscanf
#pragma package(smart_init)
#pragma resource "*.dfm"
Tform1 *Form1;  // форма
int f;
// діськріптор файлу тесту
// ім'я файлу тесту беремо з командного рядка
int level[4];// к-ть правильних відповідей, необхідне
// для досягнення рівня Ansistring mes[4];
// повідомлення про досягнення рівня
Tvopros Vopros; // питання
int otv; // номер вибраної відповіді
int right =0; // к-ть правильних відповідей
// функції, що забезпечують читання питання з файлу тесту
int Getlnt(int f);
 // читає ціле
int Getstring(int f, Ansistring *st); // читає рядок


 __fastcall Tforml::tforml(Tcomponent* Owner): Tformfowner)
{
int i;
int left =10;
// створимо радіокнопки для вибору
// правильної відповіді, але зробимо їх невидимими
for (i =0; i < 4; i++)
{
// створимо радіокнопку
Radiobutton[i] = new Tradiobutton(Forml);
// встановимо значення властивостей
Radiobutton[i]->Parent = Forml;
Radiobutton[i]->Left = left;
Radiobutton[i]->Width = Forml->clientwidth - left - 20;
Radiobutton[i]->Visible = false;
Radiobutton[i]->Checked = false;
// задамо функцію обробки події
Click Radiobutton[i]->OnClick = Radiobuttonclick; } }
void __fastcall Tforml::formactivate(Tobject *Sender)
{
Ansistring st;
// ім'я файлу тесту має бути вказане в командному рядку
int n = Paramcount();
 if (  n < 1) {
Labell->font->style = Tfontstyles()« fsbold;
Labell->caption =
"У командному рядку запуску треба задати ім'я файлу тесту";
Buttonl->tag = 2;
return; }
// відкрити файл тесту
f = Fileopen(Paramstr(1), fmopenread);
if ( f == -1)
{
Labell->font->style = Tfontstyles()« fsbold;
Labell->caption =
"Помилка доступу до файлу тесту " + Paramstr(l);
Buttonl-xtag = 2; return;
}
// вивести інформацію про тест
Getstring(f, Sst); // прочитати назву тесту
Forml->caption = st;
Getstring(f, sst); // прочитати ввідну інформацію 
Labell->width = Forml->clientwidth - Labell->left -20;
Labell->caption = st; Labell->autosize = true;
// прочитати інформацію про рівні оцінки
for (int i=0; i<4; i++)
{
level[i] = Getlnt(f);
Getstring(f &mes[i]); } }
// читає з файлу чергове питання
bool Getvopros(Tvopros *v)
{
Ansistring st;
int p;  // якщо р=1, то до питання є ілюстрація
if ( Getstringtf &(v->vopr)) != 0) {
// прочитати к-ть варіантів відповіді,  номер правильної відповіді
// і ознака наявності ілюстрації
v->notv = Getlnt(f);
v->rotv = Getlnt(f);
p = Getlnt(f);
if   (p)   
// до питання є ілюстрація
Getstring(f,&(v->img)); else v->img = "";
// читаємо варіанти відповіді
for(int i = 0;i < v->notv; i++)
{
Getstring(f,&(v->0tv[i])); }
return true; }
else return false;
}
// виводить питання
void __fastcall Tforml::showvopros(Tvopros v)
{
int top; int i;
// питання
Labell->width = Clientwidth - Labell->left -20;
Labell->caption = v.Vopr;
Labell->autosize = true;
if   (v.Img !=  //к питанню є ілюстрація {
/* визначимо висоту області 
яку можна використовувати для виведення ілюстрації */
int Regheight = Buttonl->top
- (Labell-хгор + Labell->height +10) // область виведення питання
- (Radiobutton[l]->Height + 10) * v.nOtv;
Image1->top = Labell->top + Labell->height + 10;
// завантажимо картинку і визначимо її розмір
Image1->visible = false;
Image1->autosize = true;
Image1->picture->loadfromfile(v.Img);
if (Imagel->height > Regheight)
 // картинка не поміщається
(
Image1->autosize = false;
Imagel->height = Regheight;
Imagel->proportional = true; )
Image1->visible = true; 
// положення полів відлічуємо від ілюстрації
top = Imagel-хгор + Imagel->height + 10; )
else // положення полів відлічуємо від питання
top = Labell-хгор + Labell->height + 10;
// варіанти відповіді
for (i =0; i < v.nOtv; i++)
{
Radiobutton[i]->Top = top;
Radiobutton[i]->Caption = v.0tv[i];
Radiobutton[i]->Visible = true;
Radiobutton[i]->Checked = false;
top += 20; }
}
// клацання на радіокнопці вибору відповіді
void__fastcall Tforml::radiobuttonclick(Tobject *Sender)
{
int 1=0;
while (  ! Radiobutton[i]->Checked) 1++;
otv = 1+1;
// відповідь вибрана, зробимо доступною кнопку Далі 
Buttonl->enabled = true; }
// видаляє питання з екрану

void __fastcall Tforml::erasevopros(void)
{
Imagel->visible = false; 
// приховати поле виведення ілюстрації
// приховати поля вибору відповіді for (int i=0; i <4; i++) (
Radiobutton[i]->Visible = false;
Radiobutton[i]->Checked = false; }
Button1->enabled = false;
 // зробити недоступною кнопку Далі }
// клацання на кнопці Ок/дальше/ок
void __fastcall Tforml::buttonlclick(Tobject *Sender)
{
bool ok; // результат читання з файлу чергового питання
switch (Buttonl-xtag) {
case 0: // клацання на кнопці ОК на початку роботи програми
// прочитати і вивести перше питання Getvopros(Svopros);
Showvopros(Vopros);
Buttonl->caption = "Далі";
 Buttonl->enabled = false;
Button1->tag = 1; break;
case 1: // клацання на кнопці Далі
if (otv == Vopros.rOtv) // вибраний правильна відповідь
right++; Erasevopros(}; ok = Getvopros(Svopros); if ( ok)
 Showvopros(Vopros); else
// питань більше немає {
Fileclose(f);
// вивести результат
Ansistring st; // повідомлення
int i; // номер досягнутого рівня
Form1->caption = "Результат тестування";
st.printf("Правильних відповідей: %i\n",right);
// визначимо оцінку
i = 0; // припустимо, що випробовуваний
// відповів на всі опити while 
(( right < level[i]) && (i < 3)) i++;
st = st + mes[i]; Labell->caption = st;
Button1->caption = "OK";
Buttonl->enabled = true;
Buttonl->tag =2; } break;
case 2: // клацання на кнопці OK в кінці роботи програми
Form1->close(}; // завершити роботу програми } }
// Функція Getstring читає рядок з файлу
// значення функції — кількість прочитаних символів
int Getstring(int f, Ansistring *st)
{
unsigned char buff300]; // рядок (буфер)
unsigned char *p = buf;  
// покажчик на рядок
int n;
 // к-ть прочитаних байт   (значення функції Fileread)
int len =0;   // довжина рядка
n = Fileread(f, p, 1);
while ( n != 0)
{
if ( *p == '\r')
{
n = Fileread(f, p, 1); // прочитати '\n' break;
}
len++;
P++;
n = Fileread(f, p, 1); }
*p = '\0'; if ( len !=0)
st->printf("%s", buf); return len;
}
// читає з файлу ціле число
int Getlnt(int f)
{
char buf[20];  // рядок (буфер)
char *p = buf;  // покажчик на рядок
int n;// к-ть прочитаних байт (значення функції Fileread)
int а; // число, прочитане з файлу
n = Fileread(f, p, 1);
while ( (*p >= '0') (*p <= '9') && (n > 0))
{
P++;
n =  Fileread(f, p, 1); }
if ( *p == '\r')
n = Fileread(f,   p,   1)
 // прочитати   '\n'
*p =  '\0';
// зображення числа в буфері, перетворюваний 
рядок в ціле sscanf(buf,"%i" &a);
return а;
}

Як було сказано раніше, оголошення масиву компонентів не створює компоненти, а тільки встановлює факт їх існування. Створює і настроює компоненти Radiobutton конструктор форми (функція Tform1: : Tform1) . Безпосереднє створення компоненту (елементу масиву) виконує оператор Radiobutton[i] = new Tradiobutton(Forml)

Наступні за цим оператором інструкції забезпечують налаштування компоненту. Зокрема, вони шляхом надання значення властивості Onclick задають функцію обробки події click . У даній програмі для обробки події click на всіх компонентах Radiobutton використовується одна і та ж функція, яка шляхом опиту значення властивості checked фіксує номер вибраної відповіді і робить доступною кнопку Далі (Button1) .

Після запуску програми і виводу на екран стартової форми відбувається подія onactivate . Функція обробки цієї події перевіряє, чи вказаний в командному рядку параметр — ім'я файлу тесту. Реалізація програми припускає, що якщо ім'я файлу тесту задане без вказівки шляху доступу до нього, т файл тесту і файли з ілюстраціями знаходяться в тому ж каталозі, що і програма тестування. Якщо ж шлях доступу вказаний, то файли з ілюстраціями повинні знаходитися в тому ж каталозі, що і файл тесту. Такий підхід дозволяє згрупувати всі файли одного тесту в одному каталозі.

Якщо файл тесту заданий, функція відкриває його, читає назву тесту і ввідну інформацію і потім виводить їх в діалогове вікно, причому назва виводиться в заголовок, а ввідна інформація — в полі Label1 .

Безпосереднє читання рядків з файлу виконує функція Getstring . Значенням функції є довжина рядка. Слід звернути увагу на те, що функція Getstring Повертає рядок Ans istring.

Після того, як прочитана загальна інформація про тест, програма прочитує з файлу тесту інформацію про рівні оцінки і фіксує її в масивах level і mes . Критерій досягнення рівня (кількість правильних відповідей) прочитує функція Getint .

Після виведення інформаційного повідомлення програма чекає, поки користувач не натисне кнопку Ok (Button№ ).

Командна кнопка Button№ використовується:

  •  для завершення роботи програми, якщо в командному рядку не вказаний файл тесту;
  •  для активізації процесу тестування (після виведення інформаційного повідомлення);
  •  для переходу до наступного питання (після вибору варіанту відповіді);
  •  для завершення роботи програми (після виведення результату тестування).


Таким чином, реакція програми на натиснення кнопки Buttonl залежить від стану програми. Стан програми фіксує властивість Tag кнопки Button 1 .

Після виведення інформації про тест значення властивості Tag кнопки Button1 дорівнює нулю. Тому в результаті клацання на кнопці Button 1 виконується та частина програми, яка забезпечує виведення першого питання і заміну тексту, що знаходиться на кнопці ОК на текст Далі, і замінює значення властивості Tag на одиницю.

В процесі тестування значення властивості Tag кнопки Button 1 дорівнює одиниці. Тому функція обробки події click порівнює номер вибраної відповіді (збільшений на одиницю номер компоненту Radiobutton ) з номером правильної відповіді, збільшує на одиницю лічильник правильних відповідей (в тому випадку, якщо вибрана правильна відповідь) і активізує процес читання наступного питання. Якщо спроба читання чергового питання завершилася невдало (це означає, що питання вичерпані), функція виводить результати тестування, замінює текст на командній кнопці на ОК і готує операцію завершення роботи програми (властивості Tag привласнює значення 2).

Читання питання (питання, інформація про кількість альтернативних відповідей, номер правильної відповіді і ознака наявності ілюстрації, а також ім'я файлу ілюстрації і альтернативні відповіді) з файлу тесту виконує функція Getvopros .

Виведення питання, ілюстрації і альтернативних відповідей виконує функція showvopros . Спочатку функція виводить питання — привласнює значення властивості caption компоненту Labe l1 . Потім, якщо до питання є ілюстрація, функція обчислює розмір області, яку можна виділити для відображення ілюстрації, і завантажує ілюстрацію. Якщо розмір ілюстрації більше розміру області, функція встановлює максимально можливий розмір компоненту imagei і привласнює значення false властивості Autosize і true — властивості Proportional забезпечуючи тим самим масштабування ілюстрації. Після цього функція виводить альтернативні відповіді. Положення компонентів, що забезпечують виведення альтернативних відповідей, відлічується від нижньої межі компоненту image 1 якщо до питання є ілюстрація, або компоненту Label1 якщо ілюстрації немає.

Відразу після виведення питання кнопка Далі (Button1) недоступна. Зроблено це для того, щоб блокувати можливість переходу до наступного питання, якщо не дана відповідь на поточний. Доступною кнопку Далі робить функція обробки події Click на одному з компонентів Radiobutton .

Крім того, функція шляхом сканування (перевірки значення властивості checked компонентів масиву Radiobutton ) визначає, на якому з компонентів масиву випробовуваний зробив клацання і, отже, який з варіантів відповіді вибраний. Остаточна фіксація номера вибраної відповіді і порівняння його з номером правильної відповіді відбувається в результаті натиснення кнопки Далі.

 


узнать провайдера по ip . дренажный насос керхер для грязной воды rapid.by . Audi a3 2010 tfsi 160 2010.
x

:: Наша кнопка ::

Отримати код:

Підтримайте наш сайт і розмістіть нашу кнопку на своєму ресурсі.


:: Реклама ::


:: Посилання ::

-


 

 

 


Copyright by Zvircom © 2009