скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Разработка тестового приложения Компоненты меню Delphi

После очистки формы проверяется, указан ли при запуске программы параметр - имя текстового файла с вопросами теста.

Если параметр не указан (значение ParamСount в этом случае равно нулю), то присвоением значения свойству Caption метки Label5 выводится сообщение: «Не задан файл вопросов теста» и свойству Tag кнопки Buttonl присваивается значение 2 (Buttonl.Tag:=2;). Если параметр задан, то открывается файл теста.

Программа тестирования получает имя файла теста как результат функции ParamStr (1). Реализация программы предполагает, что если имя файла теста задано без указания пути доступа к нему, то файл теста и файлы с иллюстрациями находятся в том же каталоге, что и программа тестирования. Если путь доступа указан, то файлы с иллюстрациями должны находиться в том же каталоге, что и файл теста. Такой подход позволяет сгруппировать все файлы одного теста в одном каталоге.

Открывается файл теста обычным образом. Сначала обращением к процедуре AssignFile имя файла связывается с файловой переменной, а затем вызывается инструкция открытия файла для чтения.

После успешного открытия файла вызывается процедура infо которая считывает из файла информацию о тесте и выводит ее в форму присваиванием прочитанного текста свойству Caption поля метки Label5.

Затем вызывается процедура Get Level, которая считывает из файла теста информацию об уровнях оценки. Эта процедура заполняет массивы level и mes.

После вывода информационного сообщения программа ждет, когда пользователь нажмет кнопку "Начать" (Button1).

Командная кнопка Button1 используется для:

·     аварийного завершения работы приложения (в случае, если не задано имя файла теста);

·     начала тестирования (после прочтения информационного сообщения);

·     перехода к следующему вопросу (после выбора одного из ответов);

·     завершения работы программы (после прочтения результатов тестирования).

Свойство Tag кнопки Button1, используется для идентификации текущего состояния формы и выбора действия при нажатии кнопки Button1.

После вывода информации о тесте значение свойства Tag кнопки Button1 равно нулю. Поэтому в результате первого нажатия кнопки Button1 выполняется та часть программы, которая обеспечивает:

·     вывод первого вопроса;

·     замену текста, находящегося на командной кнопке (свойство caption с Начать на Дальше;

·     установку невидимого служебного переключателя RadioButton5   в выбранное состояние.

Кроме того, присваиванием значения False свойству Enabled кнопка Button1 делается недоступной, тем самым блокируется переход к следующему вопросу до тех пор, пока не будет выбран один из ответов. Значению свойства

Button1.Tag присваивается единица, тем самым выполняется подготовка к обработке следующего нажатия кнопки Button1.

После выбора ответа и нажатия кнопки Дальше (Button1) (в этом случае значение свойства Button1.Tag равно единице) к набранной сумме баллов добавляется количество баллов за выбранный ответ. Затем, если конец файла не достигнут, вызывается процедура вывода очередного вопроса. Если конец файла достигнут, то сначала закрывается файл теста, текст на кнопке Button1 изменяется на Выход, а значение Button1.Tag устанавливается на 2. Затем посредством процедуры itog выводятся результаты тестирования.

Если значение Button1.Tag равно двум, то применением метода close к форме Form1 закрывается окно программы, в результате чего программа завершает работу.

Вывод вопроса и альтернативных ответов выполняет процедура 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] <> '\')

            then buf:=buf+s+' ';

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

   frm.Label5.caption:=buf;

   if s[1] ='\'

     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] <> ',')

                    then buf:=buf+s+' ';

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

         // прочитан альтеративный ответ

         val(s[2],score[i],code);

         answer[i].caption:=buf;

         i:=i+1;

   until s[1]='.';

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

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

   if Form1.Image1.Tag =1 // есть иллюстрация ?

     then begin

       ScalePicture;

       Form1.Image1.Visible:=True;

       end;

   // вывод альтернативных ответов

   i:=1;

   while (answer[i].Caption <> '') and (i <= N_ANSWERS) do

   begin

      if i = 1

      then

         if frm.Image1.Tag =1

              then answer[1].Top:=frm.Image1.Top+frm.Image1.Height+5

              else answer[i].top:=frm.Label5.Top+frm.Label5.Height+5

         else

            answer[i].top:=answer[i-1].top+answer[i-1].Height+5;

         selector[i].top:=answer[i].top;

         selector[i].Visible:=true;

         answer[i].Visible:=true;

         i:=i+1;

       end;

      end;

{$R *.DFM}

procedure TForm1.FormActivate(Sender: TObject);

begin

   ResetForm(Form1);

   if ParamCount = 0

      then

        begin

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

          Label5.font.color:=clRed;

          Label5.Font.Size:=12;

          Label5.caption:='Не обнаружено файла вопросов теста.';

          Button1.Caption:='Выход';

          Button1.Tag:=2;

          Button1.Enabled:=true;

        end

      else begin

            fn:=ParamStr(1);

            assignfile(f,fn);

            {$I-}

            reset(f);

            {I+}

            if IOResult=0 then

               begin

                   Info(f,Label5);

                   GetLevel(f);

               end;

             summa:=0;

      end;

 end;

procedure TForm1.Button1Click(Sender: TObject);

begin

   case Button1.tag of

   0: begin

           Button1.caption:='Далее';

           Button1.tag:=1;

           Selector[N_ANSWERS+1].Checked:=true;

           // вывод первого вопроса

           Button1.Enabled:=false;

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

            ResetForm(Form1);

           VoprosToScr(f,Form1,vopros)

      end;

   1: begin // вывод остальных вопросов

            summa:=summa+score[otv];

            Selector[N_ANSWERS+1].Checked:=true;

            Button1.Enabled:=false;

            ResetForm(Form1);

            if not eof(f)

               then VoprosToScr(f,Form1,vopros)

               else

                   begin

                      closefile(f);

                      Button1.tag:=2;

                      Button1.caption:='Выход';

                      Button1.Enabled:=true;

                      Itog(summa,Form1);

                   end;

end;

2: begin // завершение работы

        Form1.Close;

        end;

     end;

end;

// щёлчок на кнопке выбора ответа

Procedure TForm1.SelectorClick(Sender: TObject);

 var

   i:integer;

 begin

i:=1;

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

while Selector[i].Checked = false do

  i:=i+1;

  otv:=i;

  Button1.enabled:=true;

 end;

procedure TForm1.About1Click(Sender: TObject);

begin

AboutBox.ShowModal;

end;

procedure TForm1.Save1Click(Sender: TObject);

begin

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

memo1.Lines.SaveToFile(savedialog1.FileName);

end;

procedure TForm1.Contents1Click(Sender: TObject); //Вывод справки

const

  HELP_TAB = 15;                

  INDEX_ACTIVE = 10;

  CONTENTS_ACTIVE = 5;

  Help_CONTENS = 10;

begin

   Application.HelpCommand(HELP_TAB, INDEX_ACTIVE);

  Application.HelpCommand(HELP_TAB, CONTENTS_ACTIVE);

end;

procedure TForm1.N1Click(Sender: TObject);

begin

Form1.Close;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

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

x:=x+0.1;  

   Label2.Left:=60+trunc(60*cos(x));

   Label2.Top:=65-trunc(15*sin(x));

end;

end.


Страницы: 1, 2, 3


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.