Другие языки программирования и технологии

Создаю тест в DELPHI 7. Программа не считает правильные ответы.

procedure TForm3.btn1Click(Sender: TObject);
begin

btn1.Visible:=false;
mmo1.Visible:=True;
btn2.Visible:=True;
rb8.Visible:=True;
rb9.Visible:=True;
rb10.Visible:=True;
K:=1;
rb8.Caption:='Windows 7';
rb9.Caption:='Windows XP';
rb10.Caption:='В комплекте не поставляется';
Fnamet:='вопрос1.txt';
Mmo1.Lines.LoadFromFile(Fnamet);
begin
if rb8.checked then

begin p:=p+1;

end;

end;

end;

procedure TForm3.btn2Click(Sender: TObject);
begin

rb8.checked:=false;
rb9.checked:=false ;
rb10.checked:=false ;

btn2.Visible:=False;
btn3.Visible:=True;
K:=2;
rb8.Caption:='Не имеют особого названия';
rb9.Caption:='Командлеты';
rb10.Caption:='Конвейеры ';
Fnamet:='вопрос2.txt';
Mmo1.Lines.LoadFromFile(Fnamet);
begin
if rb9.checked then
begin p:=p+1;
end;

end;

end;

-
-
- тут идут аналогичные вопросы... .
-
procedure TForm3.btn21Click(Sender: TObject);
begin
rb8.checked:=false;
rb9.checked:=false ;
rb10.checked:=false ;
btn21.Visible:=False;
btn22.Visible:=True;
K:=20;
Fnamet:='вопрос20.txt';
Mmo1.Lines.LoadFromFile(Fnamet);
rb8.Caption:='Add-Computer';
rb9.Caption:='Get-Domain';
rb10.Caption:='Workgroup-Add';

begin
if rb8.checked then
begin p:=p+1;
end;
end;
end;

procedure TForm3.btn22Click(Sender: TObject);
begin

btn22.Visible:=False;
lbl1.Caption:=IntToStr(p)+' правильных ответов из 20';
end;

end.
Да-а.. . Мягко говоря.. .

Как я понимаю, переменная К это номер вопроса или что? Если номер, то вам совершенно не надо что-то суммировать в процессе ответа на вопросы. Достаточно завести массив из 20 логических элементов и при правильном ответе на вопрос устанавливать соответствующий элемент в ИСТИНУ. Это позволит после ответа на все вопросы не только подсчитать число правильных ответов, но и сказать какие были правильными.

Далее. Смысла в тесте в именно такой реализации не вижу, т. к. вопросы грузятся из файла, а ответы и правильные в том числе "зашиты" в программу. В этом случае можно с таким же успехом "вшить" и вопросы - меньше будет мороки.

А теперь посмотрим на ваши процедуры. Что делает, например, TForm3.btn1Click? Выводит первый вопрос? Но тогда она не будет работать в приципе! Смотрите.

btn1.Visible:=false;
mmo1.Visible:=True;
btn2.Visible:=True;
rb8.Visible:=True;
rb9.Visible:=True;
rb10.Visible:=True;

Вы что-то скрыли /показали

K:=1;
rb8.Caption:='Windows 7';
rb9.Caption:='Windows XP';
rb10.Caption:='В комплекте не поставляется';

Назначили, как я понял, ответы на вопрос радиокнопкам или чекбоксам

Fnamet:='вопрос1.txt';
Mmo1.Lines.LoadFromFile(Fnamet);

Загрузили текст вопроса в мемо и.. .

begin
if rb8.checked then

проверяете чекнут rb8 или нет

begin p:=p+1;

И если чекнут, то наращиваете счетчик правильных ответов, НО.. .

end;

ОН ЖЕ НЕ ЧЕКНУТ!! ! У юзера не было такой возможности до окончания работы обработчика!

end;

end;

А дальше вы все очищаете выводите следующий вопрос и так до конца. В итоге ноль правильных ответов.. .

Возможная таблетка на данный случай: перед выводом очередного вопроса считывайте ответ и соотносите его с предыдущим вопросом. Т. е. оценивайте правильность ответа с вытекающими последствиями, а затем сбрасывайте установленные флажки и выводите очередной вопрос.

Ну и последнее, у вас есть около 30 минут, пока будут разрешено редактирование ответа, для моих пояснений. Либо можете стукнуться 158 419 452 или агент.
ТА
Тожиддин Абдуллоев
59 614
Лучший ответ
р - у вас глобальная переменная?
после каждого вопроса очищайте все.. . можно все это в отдельную функцию записать...
Саша Weringo
Саша Weringo
34 293
С ответом повыше согласен. Функции просто нужно будет тогда передавать Имя вопроса и несколько ответов. А она проверяет на наличии правильного ответа. И возвращает 1 или 0.
Алексей
Алексей
842