![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
Cruger |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 1 Пол: Мужской Репутация: ![]() ![]() ![]() |
Всем привет. Помогите плиз новечку. В программе листинг которой приведен ниже, нужно подправить код, чтобы программа брала имя файла теста при выборе самого файла теста, т.е. его имени. Нужно чтобы при запуске программы создавалась форма, затем из меню ОТКРЫТЬ можно было задать имя файла теста. Файл теста существует на диске. Сам тест- файл *.*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. |
![]() ![]() |
Dimich1978 |
![]()
Сообщение
#2
|
Группа: Пользователи Сообщений: 2 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
а не проще ли будет попрбовать использовать БД для реализации теста, связать таблицы в одной будут названия тестов, во второй названия вопросов(связана с 1-ой таблицей),а в третьей(связанной по ключу со второй таблицей) будут варианты ответов. Мне кажеться это проще, чем юзать текстовые файлы. У меня есть тестовая программа работающая. Но там только один тип вопросов-пометить галками правильные ответы и все. Как то делал курсач, там надо было использовать различные типы вопросов. Я тип вопроса ставил в базе вопросов, т.е. вопрос и смотрел тип потом выводил нужную панель (PageControl).
|
Gothic_Snake |
![]()
Сообщение
#3
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 45 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
это лучше делать через типизированные файлы...
|
Fang |
![]()
Сообщение
#4
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 48 Пол: Мужской Реальное имя: Fang Репутация: ![]() ![]() ![]() |
Цитата это лучше делать через типизированные файлы... А чем лучше? |
GoodWind |
![]()
Сообщение
#5
|
![]() Автооответчик ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Gothic_Snake ну так сделай
![]() -------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
Gothic_Snake |
![]()
Сообщение
#6
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 45 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
А чем лучше? Можно сразу проверить количество записей (количество вопросов) Быстрый переход от одного вопроса к другому (назад, вперед) Да и просто удобно... Не требуется следить за правильностью расположения строк в файле (1-вопрос, 2-5 варианты ответов, 6- правильный...) А что если нада будет текст с разбиением строки сделать? вот здесь то и застрянешь... |
Gothic_Snake |
![]()
Сообщение
#7
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 45 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Gothic_Snake ну так сделай ![]() Уже давно сделал. Одну на паскале, другую-на дельфях. Дельфовская до сих пор у нас в колледже используется... http://gdsn.hut1.ru/download.php?program=test здесь выложена дельфовская версия. Построена на типизированных файлах.. |
![]() ![]() |
![]() |
Текстовая версия | 19.06.2025 17:04 |