![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() В общем я пишу программу тесты. Данная программа берет вопросы и ответы а также информацию по вопросу из файла с определенной структурой.
Код:
test=record nomer:integer; // номер записи vopros:string; // сам вопрос ot1:string; // первый ответ ot2:string; // второй ответ ot3:string; // третий ответ ot4:string; // четвертый ответ pot:string; // правильный ответ teor:string; // информация по вопросу end; файл уже сфомирован вот его пример 1 Сколько человек у нас в группе??? 12 23 13 20 13 13 человек 2 Если да то ... да неи не знаю подумаю еще да да 3 Просто мне так захотелось 1 2 3 6 1 Многгоооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо смысл моей же программы в том что при открытии очередного такого теста она должна брать рандомно все эти вопросы и ответы но в правильной последовательности. Чтобы брал не фиг пойми как а вопросы совпадали с ответами. Пример Если да то ... да неи не знаю подумаю еще да да но возникает проблема что seek не используется в текстовых файлах. При использовании функции windows Api SetFilePointer(TTextRec(f).Handle, Pos, nil, File_Begin); в дальнейшем на readln(f,vizov.nomer) и т.д. выдает ошибку EinOutError с сообщением invalid input error. Такое сообщение он выдает если рандомное значение равно 1. И значение 2 он не показывал ни разу хотя записи 3. Вот сам код программы: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, ExtCtrls, jpeg; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Button1: TButton; Button2: TButton; OpenDialog1: TOpenDialog; MainMenu1: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem; N5: TMenuItem; N6: TMenuItem; RadioGroup1: TRadioGroup; Image1: TImage; procedure Button2Click(Sender: TObject); procedure N5Click(Sender: TObject); procedure N2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; test=record nomer:integer; vopros:string; ot1:string; ot2:string; ot3:string; ot4:string; pot:string; teor:string; end; var Form1: TForm1; f:textfile; vizov:test; pravotvet:integer; implementation {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin closefile (f); form1.Close; end; procedure TForm1.N5Click(Sender: TObject); begin label1.Visible:=false; label2.Visible:=false; radiogroup1.visible:=false; button1.Visible:=false; image1.Visible:=true; closefile (f); end; procedure TForm1.N2Click(Sender: TObject); var f:textfile; slu4:integer; pos:longint; begin opendialog1.Execute; opendialog1.FileName; n5.Visible:=true; n3.Visible:=true; radiogroup1.Visible:=true; radiogroup1.Items.Clear; image1.Visible:=false; button1.Visible:=true; label1.visible:=true; label2.visible:=true; pravotvet:=0; randomize; assignfile (f,opendialog1.FileName); FileMode := fmOpenRead; reset (f); pos:=random(filesize (f)); SetFilePointer(TTextRec(f).Handle, Pos, nil, File_Begin); readln (f,vizov.nomer); // ошибка если pos=1 и pos никогда не бывает 2 либо 0 (либо 1 проверял) readln (f,vizov.vopros); readln (f,vizov.ot1); readln (f,vizov.ot2); readln (f,vizov.ot3); readln (f,vizov.ot4); readln (f,vizov.pot); readln (f,vizov.teor); label2.Caption:=vizov.vopros; randomize; slu4:=random(3)+1; case slu4 of 1: begin radiogroup1.Items.add (vizov.ot1); radiogroup1.Items.add (vizov.ot2); radiogroup1.Items.add (vizov.ot3); radiogroup1.Items.add (vizov.ot4); end; 2: begin radiogroup1.Items.add (vizov.ot2); radiogroup1.Items.add (vizov.ot4); radiogroup1.Items.add (vizov.ot3); radiogroup1.Items.add (vizov.ot1); end; 3: begin radiogroup1.Items.add (vizov.ot3); radiogroup1.Items.add (vizov.ot1); radiogroup1.Items.add (vizov.ot2); radiogroup1.Items.add (vizov.ot4); end; 4: begin radiogroup1.Items.add (vizov.ot4); radiogroup1.Items.add (vizov.ot2); radiogroup1.Items.add (vizov.ot1); radiogroup1.Items.add (vizov.ot3); end; end; end; end. А в дальнейшем надо будет чтобы при выборе следующего вопроса бегал по файлу и читал эти записи. Народ подскажите в чём ошибка. И как мне реализовать всё это. Срочняк надо. Могу выложить ещё редактор теста для создания этих тестов чтобы эксперементировать. И учтите я дельфи только начал учить. Последний раз редактировалось Admin, 05.07.2010 в 23:02. |
#2
|
|||
|
|||
![]() Ошибка в прокладке.
Вообще, обычно считывается в память весь файл и уже в памяти происходит работа. Правда, если файл большой (действительно большой), то приходится читать его по мере необходимости. Но не думаю, что при такой структуре у тебя будет большой файл. Варианты что и как делать. 1. Если ты можешь ограичиться длинной вопроса/ответа/информации в 255 символов каждый, то просто поставь длинну строк в записи и делай через File Of. В этом случае у тебя будет возможность а) пользоваться seek, б) читать за одну операцию сразу всю запись. 2. Читай весь файл, например, в TStringList. Далее можно сделать через формулу расчета смещения в списке строк. Пусть N - номер вопроса. Тогда номер вопроса будет на строке N*8, текст вопроса будет на строке (N*8)+1 и т.д. 3. Переходить на TFileStream со всеми вытекающими... |
#3
|
|||
|
|||
![]() Спасибо за совет. а эту ошибку в прокладке исправить никак??? И что такое прокладка вообще??? Проблема в том что как вы заметили там уже есть структура с радиогруппой куда выводятся наши ответы. TFileStream можно поподробнее.
Или вы предлагаете добвить скрытый элемент Tstringlist и оттуда читать все данные?? Просто про него я слышу впервые. |