Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Вниз

Программа тестирования   Найти похожие ветки 

 
Cruger ©   (2005-12-16 18:38) [0]

Всем привет. Помогите плиз новечку. В программе листинг которой приведен ниже, нужно подправить код, чтобы программа брала имя файла теста при выборе самого файла теста, т.е. его имени. Нужно чтобы при запуске программы создавалась форма, затем из меню ОТКРЫТЬ можно было задать имя файла теста. Файл теста существует на диске. Сам тест- файл *.*TXT


{
  Программа берет имя файла теста из командной строки.
  Если программа запускается из Delphi,
  то имя файла теста надо ввести в
  поле Parameters диалогового окна
  Run Parameters, которое становится
  доступным в результате выбора в меню
  Run команды Parameters.
}
unit test01;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ActnList, StdActns, XPStyleActnCtrls, ActnMan,
 ToolWin, ActnCtrls, ActnMenus;
type
 TForm1 = class(TForm)
   Label1: TLabel;
   RadioButton1: TRadioButton;
   RadioButton2: TRadioButton;
   RadioButton3: TRadioButton;
   Label2: TLabel;
   Label3: TLabel;
   Label4: TLabel;
   Button1: TButton;
   ActionMainMenuBar1: TActionMainMenuBar;
   ActionManager1: TActionManager;
   FileOpen1: TFileOpen;
   FileExit1: TFileExit;
   HelpTopicSearch1: THelpTopicSearch;
   Label5: TLabel;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure RadioButton1Click(Sender: TObject);
   procedure RadioButton2Click(Sender: TObject);
   procedure RadioButton3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

var
 f: TextFile;      // файл теста (вопросы и варианты ответов)
 nq: integer;      // количество вопросов в тесте
 right: integer;   // количество правильных ответов
 level: array[1..4] of integer;      // критерии оценок
 mes: array[1..4] of string;    // комментарии
 buf: string;

// читает вопрос из файла и выводит его
// на в поля формы
function NextQw : boolean;
begin
 if not EOF(f) then
 begin
   // прочитать и вывести вопрос
   Readln(f,buf);
   Form1.Label1.Caption := buf;

   // прочитать и вывести варианты ответов
   // 1-й вариант
   Readln(f,buf);  // прочитать 1-й вариант ответа
   Form1.Label2.Caption := buf;
   Readln(f,buf);  // оценка за выбор этого ответа (1 - правильно, 0 - нет)
   Form1.RadioButton1.Tag := StrToInt(buf);

   // 2-й вариант
   Readln(f,buf);
   Form1.Label3.Caption := buf;
   Readln(f,buf);
   Form1.RadioButton2.Tag := StrToInt(buf);

   // 3-й вариант
   Readln(f,buf);
   Form1.Label4.Caption := buf;
   Readln(f,buf);
   Form1.RadioButton3.Tag := StrToInt(buf);

   // счетчик общего количества вопросов
   nq:= nq + 1;

   // кнопка "Дальше" не доступна,
   // пока не выбран один из вариантов ответа
   Form1.Button1.Enabled := False;

   // ни одна из радиокнопок не выбрана
   Form1.RadioButton1.Checked := False;
   Form1.RadioButton2.Checked := False;
   Form1.RadioButton3.Checked := False;
   NextQw := TRUE;
 end
 else NextQw := FALSE;
end;

// событие FormCreate возникает в момент
// создания формы
procedure TForm1.FormCreate(Sender: TObject);

var
 i: integer;
 fname : string;
begin
 { Если программа запускается из Delphi,
   то имя файла теста надо ввести в
   поле Parameters диалогового окна
   Run Parameters, которое становится
   доступным в результате выбора в меню
   Run команды Parameters.}
 fname := ParamStr(1); // взять имя файла теста
                       // из командной строки
 if fname = "" then
 begin
   ShowMessage("В командной строке запуска программы" +#13+
               "надо указать имя файла теста.");
   Application.Terminate; // завершить программу
 end;
 AssignFile(f,fname);

 // в процессе открытия файла возможны
 // ошибки, поэтому ...
 try
   Reset(f); // эта инструкция может вызвать ошибку
 except
   on EInOutError do
       begin
           ShowMessage("Ошибка обращения к файлу теста: " + fname);
           Application.Terminate; // завершить программу
       end;
 end;

 // здесь файл теста успешно открыт
 // прочитать название теста - первая строка файла
 Readln(f,buf);
 Form1.Caption := buf;

 // прочитать оценки и комментарии
 for i:=1 to 4 do
   begin
     Readln(f,buf);
     mes[i] := buf;
     Readln(f,buf);
     level[i] := StrToInt(buf);
   end;

  right := 0; // правильных ответов
  nq := 0;    // всего вопросов
  NextQW;     // прочитать и вывести первый вопрос
end;

// щелчок на кнопке "Дальше"
procedure TForm1.Button1Click(Sender: TObject);
var
   buf: string;
   i: integer;
begin
   if Button1.Caption = "Завершить" then Close;

   // добавим оценку за выбранный вариант ответа
   // оценка находится в свойстве Button.Tag
   // Button.Tag = 1 - ответ правильный, 0 - нет

   if RadioButton1.Checked  then
       right := right + RadioButton1.Tag;
   if RadioButton2.Checked  then
      right := right + RadioButton2.Tag;
   if RadioButton3.Checked  then
      right := right + RadioButton3.Tag;

 // вывести следующий вопрос
 // NextQW читает и выводит вопрос
 // NextQw = FALSE если в файле теста
 // вопросов больше нет
 if not NextQW then
 begin
     // здесь значение NextQw = FALSE
     Button1.Caption := "Завершить";

     // скрыть переключатели и поля меток
     RadioButton1.Visible := False;
     RadioButton2.Visible := False;
     RadioButton3.Visible := False;
     Label2.Visible := False;
     Label3.Visible := False;
     Label4.Visible := False;

     buf := "Тестирование завершено." + #13 +
            "Правильных ответов: " + IntToStr(right) +
            " из " + IntToStr(nq) + "." + #13;

     // выставить оценку
     // right - кол-во правильных ответов
     i:=1; // номер уровня
     while (right < level[i]) and (i < 4) do
           inc(i);
     buf := buf + mes[i];

     Label1.AutoSize := TRUE;
     Label1.Caption := buf;

   end;
end;

// щелчок на переключателе выбора первого варианта ответа
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
 Button1.Enabled := True; // кнопка Далее теперь доступна
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
 Button1.Enabled := True;
end;

procedure TForm1.RadioButton3Click(Sender: TObject);
begin
 Button1.Enabled := True;
end;

end.


 
kami ©   (2005-12-16 19:10) [1]

А в чем сложность?
1.брала имя файла теста при выборе самого файла теста - в программе все готово, осталось внести поправку в реестр.
2.при запуске программы создавалась форма - а она что, не создается?
3.из меню ОТКРЫТЬ можно было задать имя файла теста - элементарно, только вынести в отдельную процедуру загрузку самого файла теста, да добавить OpenDialog на форму и 2 строчки кода.
Непонятными для меня остаются компоненты FileOpen1 и FileExit1 - они нигде не задействуются, и что это я не знаю (может, потому, что у меня D5 )

В чем вопрос-то? Не знаешь, как добавить OpenDialog на форму?


 
Cruger ©   (2005-12-16 19:51) [2]

Программа рабочая, но она запускается только при помощи ярлыка данной программы с параметром имени файла теста (в ОБЪЕКТЕ например "C:\Documents and Settings\Тестирование\TEST.EXE" "Билет №10.txt") При запуске этого ярлыка сразу появляется вопрос и три варианта ответа (так и должно происходить), а задумка чтобы при запуске программы при помощи меню(аля Windows XP это в 7 версии):

ActionMainMenuBar1: TActionMainMenuBar;
   ActionManager1: TActionManager;
   FileOpen1: TFileOpen;
   FileExit1: TFileExit;
   HelpTopicSearch1: THelpTopicSearch;

можно было выбрать файл теста и тем самым тест выполняется (Выводит попрос и три варианта ответа ) Я уже запутался. Какую надо написать процедуру чтобы все выполнялось как задуманно. Если не затруднит, прошу написать код. Или по возможности через ICQ. 308361067


 
kami ©   (2005-12-16 20:15) [3]

Да затруднить-то, конечно, не затруднит... только будет ли тебе толк от этого кода?
В общем, так: кидаешь на форму OpenDialog; на пункт меню (или кнопку, что там тебе надо) на событие OnClick вешаешь такой код:

procedure TForm1.N1Click(Sender:TObject);
var
 TestFileName:string;
begin
 if OpenDialog1.Execute then
   begin
     TestFileName:=OpenDialog1.FileName;
     LoadAndStartTest(TestFileName);
   end;
end;
из FormCreate начиная со строки AssignFile(f,fname) до конца процедуры переносишь код сюда:
procedure TForm1.LoadAndStartTest(const TestFileName:string);
begin
 // вот сюда, и не забудь нажать Ctrl-Shift-C после вставки :)
end;
и вместо перенесенных строк пишешь LoadAndStartTest(fname);

Все, как бы...

На счет запуска кликаньем по файлу... посмотри в интернете любой FAQ по регистрации собственного типа файлов.


 
XCoder ©   (2005-12-17 17:10) [4]

У тебя проблема с меню? Кидаеш MainMenuна форму. При запуске проги, сканиш папку на файлы *.txt. Если файл найден вызываеш такую процу:

procedure AddItem(Name: String);
var
I: TMenuItem;
begin
I := TMenuItem.Create(MainMenu1);
I.Caption := IntToStr(Name);
MainMenu1.Items[0].Add(I);
end;

Name - это имя файла, например "Билет №1.txt", можно удалить расширение.
MainMenu1.Items[0].Add(I) - добавляет пунк, в меню с номером 0, допустим он называется "Билеты", хотя можно уидать и в корень основного меню.


 
Cruger ©   (2005-12-17 23:58) [5]

Спасибо за ответы.  Тут наметился еще один вопрос.
На TForm1 создан Lable6,  в его Caption нужно вывести номер текущего вопроса(по порядку). Количество выводимых номеров ответа не зависит от кол-ва самих вопросов в тесте. Нужна помощь в написании кода.


 
kami ©   (2005-12-18 00:08) [6]

Cruger ©   (17.12.05 23:58) [5]
Интересно стало - какой добрый дядя написал для тебя этот код, снабдив его наиподробнейшими комментариями?
Последний раз лезу в эту ветку...
после nq:=nq+1; (хотя, правильнее было бы inc(nq), но не суть важно)
Label6.Caption:=IntToStr(nq);



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
2-1134829539
ZeFiR
2005-12-17 17:25
2006.01.08
Новое окно


14-1134507398
(CHALING 32)S K i N E R
2005-12-13 23:56
2006.01.08
Delphi 6 и Delphi 7


1-1133930103
Frozzen
2005-12-07 07:35
2006.01.08
Подскажите как программоно устанавливать шрифт в винду?


4-1130759002
Reset
2005-10-31 14:43
2006.01.08
В OLE32.dll есть курсор с именем 2 ...


4-1130664226
злобная танька
2005-10-30 12:23
2006.01.08
Открыть с помощью...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский