Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.07.2010, 22:54
Artempokrowski Artempokrowski вне форума
Прохожий
 
Регистрация: 05.07.2010
Сообщения: 12
Репутация: 10
По умолчанию Работа с текстовым файлом. Срочно.

В общем я пишу программу тесты. Данная программа берет вопросы и ответы а также информацию по вопросу из файла с определенной структурой.
Код:
  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: Пользуемся тегами!

А в дальнейшем надо будет чтобы при выборе следующего вопроса бегал по файлу и читал эти записи. Народ подскажите в чём ошибка. И как мне реализовать всё это. Срочняк надо. Могу выложить ещё редактор теста для создания этих тестов чтобы эксперементировать. И учтите я дельфи только начал учить.

Последний раз редактировалось Admin, 05.07.2010 в 23:02.
Ответить с цитированием
  #2  
Старый 05.07.2010, 23:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ошибка в прокладке.
Вообще, обычно считывается в память весь файл и уже в памяти происходит работа. Правда, если файл большой (действительно большой), то приходится читать его по мере необходимости. Но не думаю, что при такой структуре у тебя будет большой файл.

Варианты что и как делать.
1. Если ты можешь ограичиться длинной вопроса/ответа/информации в 255 символов каждый, то просто поставь длинну строк в записи и делай через File Of. В этом случае у тебя будет возможность а) пользоваться seek, б) читать за одну операцию сразу всю запись.
2. Читай весь файл, например, в TStringList. Далее можно сделать через формулу расчета смещения в списке строк. Пусть N - номер вопроса. Тогда номер вопроса будет на строке N*8, текст вопроса будет на строке (N*8)+1 и т.д.
3. Переходить на TFileStream со всеми вытекающими...
Ответить с цитированием
  #3  
Старый 05.07.2010, 23:43
Artempokrowski Artempokrowski вне форума
Прохожий
 
Регистрация: 05.07.2010
Сообщения: 12
Репутация: 10
По умолчанию

Спасибо за совет. а эту ошибку в прокладке исправить никак??? И что такое прокладка вообще??? Проблема в том что как вы заметили там уже есть структура с радиогруппой куда выводятся наши ответы. TFileStream можно поподробнее.

Или вы предлагаете добвить скрытый элемент Tstringlist и оттуда читать все данные?? Просто про него я слышу впервые.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:48.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025