Форум: "Начинающим";
Текущий архив: 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