Смекни!
smekni.com

Разработка тестового приложения Компоненты меню Delphi (стр. 4 из 5)

Вывод вопроса и альтернативных ответов выполняет процедура voprosToScr. Сначала процедура увеличивает счетчик вопросов vopros и присвоением значения свойству формы Caption выводит номер текущего вопроса в заголовок окна. Затем процедура читает строки из файла теста до тех пор, пока первым символом очередной прочитанной строки не будет точка или "обратная наклонная черта".

После вывода текста вопроса делается проверка, какой символ используется в качестве признака конца вопроса. Если обратная наклонная черта, что свидетельствует о том, что к вопросу есть иллюстрация, то свойству Form1.image1.Tag присваивается единица и из прочитанной строки выделяется имя файла иллюстрации.

Загрузка иллюстрации осуществляется применением метода LoadFromFile к свойству image1.Picture. Однако после загрузки иллюстрация на экране не появляется, т. к. значение свойства image1.visible равно False.

После считывания иллюстрации процедура считывает вопросы. После обработки последнего вопроса, форма переходит к разделу оценок. Так же на форме имеется компонент Gauge1, который предназначен для визуального вывода информации о количестве правильных ответов. Используя процедуру Form1.gauge1.progress:=integer мы можем задать необходимое визуальное отображение числа баллов за ответы. Для этого нам надо объявить переменную, которая бы при подсчёте баллов автоматически отображалась на этой компоненте. Этой переменной будет summa. Итак, просто пропишем значения суммы (количества баллов) и действия для отображения баллов:

if summa=10 then

Form1.gauge1.progress:=100;

if summa=9 then

Form1.Gauge1.Progress:=90;

if summa=8 then

Form1.gauge1.progress:=80;

if summa=7 then

Form1.gauge1.progress:=70;

if summa=6 then

Form1.gauge1.progress:=60;

if summa=5 then

Form1.gauge1.progress:=50;

if summa=4 then

Form1.gauge1.progress:=40;

if summa=3 then

Form1.gauge1.progress:=30;

if summa=2 then

Form1.gauge1.progress:=20;

if summa=1 then

Form1.gauge1.progress:=10;

if summa=0 then

Form1.gauge1.progress:=0;

End;

Для сохранения результатов тестирования был использован компонент Memo, который был связан с компонентом savedialog1. Т.е. при выводе результатов тестирования данные из компонента Label5 помещались в Memo и, затем, их можно было сохранить, для этого используется следующие операторы:

savedialog1.Execute; // сохранение данных

memo1.Lines.SaveToFile(savedialog1.FileName);

Компонент Memo сделан не визуальным. В конце теста предлагается сохранить результат, осуществляется это посредством выбора из главного меню вкладки Файл/Сохранить. Общий вид программы можно видеть на рис.5, а полный листинг программы в приложении 1.

Рис. 5. Общий вид программы «Электронный тест»

2.6. Принцип построения комплекса технических средств

Для запуска основной части программы, это файл Project1.exe системные требования не высоки:

- процессор I486;

- 16 Мб оперативной памяти;

- 1 Мб или меньше видео памяти;

- Объём дискового пространства не более 5 Мб;

- Операционная система Windows 9x;

А для компиляции и отладки самого программного кода системные требования возрастают, т.к. необходимо будет устанавливать Delphi 6, которой для запуска требуется:

- Процессор Pentium 166 и выше;

- 32 Мб оперативной памяти и выше;

- 4 Мб видео памяти;

- Объём дискового пространства, в зависимости от установки от 300 и более;

- Windows 98

Заключение

В настоящее время компьютеры внедряются во все отрасли человеческой деятельности. Они помогают автоматизировать процессы, на выполнение которых требуется много времени. В этом курсовом проекте я представил программу для тестирования, которая может использоваться в любой сфере.

Эта программа гораздо лучше, чем другие аналогичные программы, благодаря возможности собственноручного редактирования и добавления файла вопросов, что даёт определённое преимущество по сравнению с другими программами тестирования, при использовании как новых, так и устаревших ПК, файл вопросов можно написать в текстовом редакторе, гораздо быстрее, чем установить Delphi и редактировать сам программный код.

Список литературы

1. Архангельский А.Я. Программирование в Delphi 5. - М.: Нолидж, 2000

2. Архангельский А.Я. Справочное пособие по Delphi 5. - М.: Нолидж, 2000.

3. Баас Р. и другие. Delphi 5. Для пользователя. - Киев, 2000.

4. Бобровский В.А. Delphi 5. Начальный курс. - СПб., 1998.

5. Бобровский В.А. Delphi 5. Учебный курс. - СПб., 2000.

6. Пачек Ксавье. Программирование в Delphi 5. Руководство разработчика. - М.: Нолидж, 2000.

7. Рейсдорф Кент. Delphi 4. Освой самостоятельно. - М.:Бином, 1999.

8. Свиридов С. и другие. Создание мультимедийных приложений. - М.: Нолидж, 2000.

9. Фаранов В.В. Учебное пособие по Delphi 4. - СПб., 1999.

10. Эбнер Михаэль. Delphi 5. Руководство разработчика. - Киев, 2000.

Приложение 1. Листинг программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Gauges, Menus, jpeg;

type

TForm1 = class(TForm)

Panel1: TPanel;

Button1: TButton;

Image1: TImage;

Label5: TLabel;

Label1: TLabel;

Gauge1: TGauge;

MainMenu1: TMainMenu;

File1: TMenuItem;

Save1: TMenuItem;

exit1: TMenuItem;

Help2: TMenuItem;

About1: TMenuItem;

Contents1: TMenuItem;

SaveDialog1: TSaveDialog;

Memo1: TMemo;

N1: TMenuItem;

Timer1: TTimer;

Label2: TLabel;

procedure FormActivate(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure SelectorClick(Sender: TObject);

Продолжение приложения 1

procedure About1Click(Sender: TObject);

procedure Save1Click(Sender: TObject);

procedure Contents1Click(Sender: TObject);

procedure N1Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

x:Real;

implementation

uses Unit2, Unit3;

const

N_ANSWERS=4;

N_LEVEL=4;

var

answer: array[1..N_ANSWERS] of Tlabel; //альтернативные ответы

selector: array[1..N_ANSWERS+1] of TRadioButton;// кнопки выбора ответа

f:TextFile;

fn:string; // имя файла вопросов

level:array[1..N_LEVEL] of integer;// сумма, соотв. уровню

mes:array[1..N_LEVEL] of string; // сообщение, соотв. уровню

score:array[1..N_ANSWERS] of integer; // очки за выбор ответа

summa:integer; // набрано очков

vopros:integer; // номер текущего вопроса

otv:integer; // номер выбранного ответа

// установка формы в исходное состояние

Продолжение приложения 1

Procedure ResetForm(frm:Tform1);

var

i:integer;

begin

form1.label2.visible:=false;

form1.Save1.Visible:=false;

form1.Gauge1.Visible:=false;

Form1.Memo1.Visible:=false;

for i:=1 to N_ANSWERS do

begin

answer[i].width:=frm.ClientWidth-answer[i].left-5;

answer[i].Visible:=false;

selector[i].Visible:=false;

end;

frm.Label5.width:=frm.ClientWidth-frm.Label5.left-5;

frm.Image1.Visible:=false;

end;

// Определение достигнутого уровня

procedure Itog(summa:integer;frm:TForm1);

var

i:integer;

buf:string;

begin

Form1.label2.visible:=true;

form1.Save1.Visible:=true;

Form1.Gauge1.Visible:=true;

Form1.Label5.font.size:=11;

buf:='';

str(summa:5,buf);

Продолжение приложения 1

buf:='Результаты вашего тестирования'+chr(13)+'Вы ответили правильно на:'+buf+' из 10 вопросов';

i:=1;

while (summa < level[i]) and (i<N_LEVEL) do

i:=i+1;

buf:=buf+chr(13)+mes[i];

frm.Label5.Caption:=buf;

if buf=',' then

buf:='Результаты вашего тестирования'+chr(13)+'Вы набрали:'+buf+'баллов';

Form1.memo1.Lines.Add(buf);

if summa=10 then // условие отображения диаграммы

Form1.gauge1.progress:=100;

if summa=9 then

Form1.Gauge1.Progress:=90;

if summa=8 then

Form1.gauge1.progress:=80;

if summa=7 then

Form1.gauge1.progress:=70;

if summa=6 then

Form1.gauge1.progress:=60;

if summa=5 then

Form1.gauge1.progress:=50;

if summa=4 then

Form1.gauge1.progress:=40;

if summa=3 then

Form1.gauge1.progress:=30;

if summa=2 then

Form1.gauge1.progress:=20;

if summa=1 then

Form1.gauge1.progress:=10;

Продолжение приложения 1

if summa=0 then

Form1.gauge1.progress:=0;

end;

procedure TForm1.FormCreate(Sender: TObject);

var

i:integer;

begin

// создадим пять меток для вывода вопросов и альтернативных ответов

for i:=1 to N_ANSWERS do

begin

answer[i]:=TLabel.Create(self);

Form1.Label5.font.size:=12;

Form1.Label5.Font.name:='System';

answer[i].Parent:=Form1;

answer[i].Left:=36;

answer[i].WordWrap:=false;

end;

// создадим переключатели для выбора ответа

for i:=1 to N_ANSWERS+1 do

begin

selector[i]:=TRadioButton.Create(self);

selector[i].Parent:=self;

selector[i].Caption:='';

selector[i].Width:=17;

selector[i].Left:=16;

selector[i].Visible:=false;

selector[i].Enabled:=True;

selector[i].OnClick:=SelectorClick;

end;

Продолжение приложения 1

ResetForm(Form1);

end;

// вывод начальной инфы о тесте

procedure info(var f:TextFile;l:TLabel);

var

s,buf:string;

begin

buf:='';

repeat

readln(f,s);

if s[1] <> '.'

then buf:=buf+s+' ';

until s[1] ='.';

Form1.Label5.Caption:=buf;

end;

// прочитать информацию об оценках за тест

Procedure GetLevel(var f:TextFile);

var

i:integer;

buf:string;

begin // заполняем значения глобальных массивов

i:=1;

repeat

readln(f,buf);

if buf[1] <> '.' then begin

mes[i]:=buf;

readln(f,level[i]);

i:=i+1;

end;

until buf[1]='.';

Продолжение приложения 1

end;

// масштабирование иллюстрации

Procedure ScalePicture;

var

w,h:integer;

scaleX:real;

scaleY:real;

scale:real;

i:integer;

begin

// вычислит макс. допустимые размеры картинки

w:=Form1.ClientWidth-Form1.Label5.Left;

h:=Form1.ClientHeight

- Form1.Panel1.Height -5

- Form1.Label5.Top

- Form1.Label5.Height - 5;

for i:=1 to N_ANSWERS do

if answer[i].Caption <> ''

then h:=h-answer[i].Height-5;

// здесь определена максимально допустимая величина иллюстрации

// определить масштаб

if w>Form1.Image1.Picture.Width

then scaleX:=1

else scaleX:=w/Form1.Image1.Picture.Width;

if h>Form1.Image1.Picture.Height

then scaleY:=1

else scaleY:=h/Form1.Image1.Picture.Height;

if scaleY<ScaleX

then scale:=scaleY

else scale:=scaleX;

Продолжение приложения 1

// здесь масштаб определен

Form1.Image1.Top:=Form1.Label5.Top+Form1.Label5.Height+5;

Form1.Image1.Left:=Form1.Label5.Left;

Form1.Image1.Width:=Round(Form1.Image1.Picture.Width*scale);

Form1.Image1.Height:=Round(Form1.Image1.Picture.Height*scale);

Form1.Label5.Visible:=True;

end;

// вывод вопроса на экран

Procedure VoprosToScr(var f:TextFile;frm:TForm1;var vopros:integer);

var

i:integer;

code:integer;

s,buf:string;

ifn:string; // файл иллюстрации

begin

vopros:=vopros+1;

str(vopros:3,s);

frm.caption:='Вопрос'+s;

// Выведем текст вопроса

buf:='';

repeat

readln(f,s);

if (s[1] <> '.') and (s[1] <> '&bsol;')

then buf:=buf+s+' ';

until (s[1] ='.') or (s[1] ='&bsol;');

frm.Label5.caption:=buf;

if s[1] ='&bsol;'

then // к вопросу есть иллюстрация

Продолжение приложения 1

begin

frm.Image1.Tag:=1;

ifn:=copy(s,2,length(s));

try

frm.Image1.Picture.LoadFromFile(ifn);

except

on E:EFOpenError do

frm.Tag:=0;

end // try

end

else frm.Image1.Tag:=0;

// Читаем варианты ответов

for i:=1 to N_ANSWERS do

begin

answer[i].caption:='';

answer[i].Width:=frm.ClientWidth-Form1.Label5.Left-5;

end;

i:=1;

repeat

buf:='';

repeat // читаем текст варианта ответа

readln(f,s);

if (s[1]<>'.') and (s[1] <> ',')