Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2008, 15:56   #1
Deathwatcher
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 11
По умолчанию конфликт файла записей и компонентов формы

Проблемка в следующем. Есть file of record. Записи имеют вид:

TQuestion = Record
index:integer;
tekst:string[255];
right:string[100];
wrong1:string[100];
wrong2:string[100];
wrong3:string[100];

quest: array [1..50] of TQuestion;

Файл содержит базу данных с вопросами. Вопросы в произвольном порядке считываются и вместе с вариантами ответа передаются на форму. Вопрос отображается в Мемо, а ответы в RadioGroup. Засада в том, что все вопросы программкой обрабатываются нормально, но как только случайно выпадает вопрос №1, программа вылетает на строке

indexxx:=Form2.radiogroup1.iteminde x;

Ругаясь, на EAccessViolation! Помогите, пожалуйста...
Deathwatcher вне форума Ответить с цитированием
Старый 12.11.2008, 16:12   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А то, что первый индекс в радиогруппе равен нулю, а не единице, вы учли?
mihali4 вне форума Ответить с цитированием
Старый 12.11.2008, 18:18   #3
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

indexxx:=Form2.radiogroup1.iteminde x;

Для чего используется данная строка?
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Старый 12.11.2008, 18:18   #4
Deathwatcher
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 11
По умолчанию

учел... со всеми записями нормально работает, а с нулевой (т.е. начальной в файле) не хочет... мож кусок кода поможет...

Код:
Кусок события OnClick:

   reset(myfile);
   num:=nomera[count-1]-1;   // массив nomera содержит сгенерированный случайный порядок появления вопросов
   indexxx:=Form2.radiogroup1.itemindex; // вот тут падает
   if num<>0 then
     begin
     rec;
     seek(myfile,num);
     read(myfile,quest[num]); // далее чтение и отображение...


procedure Rec;
var a1,a2:string;
begin
   reset(myfile);
   with quest[maxcount+count-1] do
    begin
    index:=maxcount+count-1;
    tekst:=gettekst();
    a1:=gettekst(num);
    right:=select(num, indexxx);
    a2:=select(num, indexxx);
    end;
   Seek(myfile, FileSize(myfile));
   write(myfile, quest[count+maxcount-1]);
   reset(myfile);
end;


function gettekst(a:integer):string;
begin
reset(myfile);
Seek(myfile, a);
read(myfile,quest[a]);
Result:=trim(quest[a].tekst);
reset(myfile);
end;


function select(a, b:integer):string;
var rrr, www:string;
begin
  reset(myfile);
  Seek(myfile, a);
  read(myfile,quest[a]);
  rrr:=trim(quest[a].right);
  www:=trim(quest[a].wrong1);

// далее схема отбора правильного ответа

reset(myfile);
end;

Так вот. Для всех событий проходит, а для нулевого в файле(когда num=1) при событии OnClick, т.е. когда пытаюсь сохранить, он падает на жирной строчке... и почему-то count он сам обнуляет...

Последний раз редактировалось Deathwatcher; 12.11.2008 в 18:34.
Deathwatcher вне форума Ответить с цитированием
Старый 12.11.2008, 19:20   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

"Падает" не на "жирной" строке, а на предыдущей:
num:=nomera[count-1]-1;
Вот и ищите, почему у вас в индекс приходит count=0 (а в результате индекс получается равным -1).
Приведенный кусок ни к чему - у вас раньше где-то ошибка.
mihali4 вне форума Ответить с цитированием
Старый 12.11.2008, 20:06   #6
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Цитата:
Проблемка в следующем. Есть file of record. Записи имеют вид:

TQuestion = Record
index:integer;
tekst:string[255];
right:string[100];
wrong1:string[100];
wrong2:string[100];
wrong3:string[100];

quest: array [1..50] of TQuestion;
Если делаете тестер то я не советую вам создавать типизированный файл для хранения данных, так как длинна вопросов и ответов <255 символов и это плохо.

Цитата:
EAccessViolation!
Исключение генерируется при ошибочном доступе к памяти.

Исключение класса EAccessViolation генерируется во время выполнения при возникновении следующих ситуаций:

Попытка разыменования нулевого указателя nil.
Попытка записи в кодовую страницу.
Попытка доступа к адресу вне памяти, распределенной приложению.

В нашем случае косяк с radiogroup, наверно обращение идет к несуществующему обьекту (один из группы).

Разбираться в чужом листинге это зло.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 13.11.2008, 10:27   #7
Deathwatcher
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 11
По умолчанию

Цитата:
Сообщение от SunKnight Посмотреть сообщение
не советую вам создавать типизированный файл для хранения данных
Я уже подумывал об этом... но пока в голову ничего более интересное не пришло ((( С удовольствием выслушаю подсказки.
Deathwatcher вне форума Ответить с цитированием
Старый 14.11.2008, 12:41   #8
Deathwatcher
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 11
По умолчанию

Глюк победил... как не понимаю... вернулся на предыдущую версию программы и все кропотливо переписал... работаит!.. только одно не понятно... пытаюсь вынуть текст из RadioGroup, элемента, который выбирает пользователь... делаю это строкой
Код:
str:=RadioGroup.Items.Names[radiogroup.itemeindex];
и все время заносится пустое поле... если проверять step-by-step, то список items у компонента пуст!! но ведь они же отображаются!!! мистика какая-то!
Deathwatcher вне форума Ответить с цитированием
Старый 14.11.2008, 12:41   #9
Deathwatcher
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 11
По умолчанию

Глюк победил... как не понимаю... вернулся на предыдущую версию программы и все кропотливо переписал... работаит!.. только одно не понятно... пытаюсь вынуть текст из RadioGroup, элемента, который выбирает пользователь... делаю это строкой
Код:
str:=RadioGroup.Items.Names[radiogroup.itemeindex];
и все время заносится пустое поле... если проверять step-by-step, то список items у компонента пуст!! но ведь они же отображаются!!! мистика какая-то!
Deathwatcher вне форума Ответить с цитированием
Старый 14.11.2008, 13:03   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

У вас что-то не в порядке. При чем тут Names?
Такая конструкция отрабатывает на раз:
Label1.Caption:=RadioGroup1.Items[RadioGroup1.ItemIndex];
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить заданое кол-во записей из указанного файла. Ketu Паскаль, Turbo Pascal, PascalABC.NET 4 12.06.2008 18:48
Настройка формы и компонентов В_И_К_Т_О_Р Помощь студентам 2 05.02.2008 20:52
Типизированные файлы.Создание, удаление, редактирование, сортировка записей типизированного файла.Паскаль Студент Шиза Помощь студентам 6 08.12.2007 13:41
Печать компонентов формы monushka Помощь студентам 6 07.11.2007 19:30
обновление компонентов формы fuv Общие вопросы Delphi 2 19.05.2007 16:51