Показать сообщение отдельно
  #2  
Старый 01.01.2018, 07:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ну на тебе набросок кода.
1. Сами вопросы. Я сделал запись для описания вопроса и пример для 2х вопросов. Имя картинки задается без пути, только имя файла, сами картинки должны "лежать" рядом с исполняемым модулем:
Код:
unit Unit2;

interface

type
  TTest = record
    Question : String;
    Image : String;
    Answers : Array [0..2] Of String;
    CorrectAnswer : Integer;
  end;

const
  Tests : Array [1..2] Of TTest =
    (
      (Question : 'Вопрос 1';
       Image : 'image1.jpg';
       Answers : ('Ответ 1-1','Ответ 1-2','Ответ 1-3');
       CorrectAnswer : 0),
      (Question : 'Вопрос 2';
       Image : 'image2.jpg';
       Answers : ('Ответ 2-1','Ответ 2-2','Ответ 2-3');
       CorrectAnswer : 2)
    );

implementation

end.
Надеюсь, как добавить вопросы сообразишь сам.

2. Теперь собственно обработчик. На форме лежат: метка (для текста вопроса), картинка (для, соотв, картинки) и радиогруппа (для ответов). Весь код:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
    Button1: TButton;
    Label1: TLabel;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    n : Integer;
    c : Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
var
  I : Integer;
  ImgName : String;
begin
  // Сначала сбираем ответ
  If n >= Low(Tests) Then
    Begin
      If RadioGroup1.ItemIndex < 0 Then
        Begin
          ShowMessage('Выберите правильный вариант.');
          Exit;
        End;
      If RadioGroup1.ItemIndex = Tests[n].CorrectAnswer Then Inc(c);
    End;

  // Перехож к сл. вопросу
  Inc(n);
  Label1.Caption := '';
  Image1.Picture.Graphic := Nil;
  RadioGroup1.Items.Clear;
  If n > High(Tests)
    Then
      Begin
        // Текущий вопрос больше чем всего вопросов
        ShowMessage(Format('Тест окончен. Кол-во правильных ответов: %d из %d',[c,Length(Tests)]));
        c := 0;
        n := Low(Tests)-1;
      End
    Else
      Begin
        // Новый аопрос
        Label1.Caption := Tests[n].Question;
        ImgName := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + Tests[n].Image;
        If FileExists(ImgName) Then Image1.Picture.LoadFromFile(ImgName);
        For I := Low(Tests[n].Answers) To High(Tests[n].Answers) Do
          RadioGroup1.Items.Add(Tests[n].Answers[i]);
      End;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  c := 0;
  n := Low(Tests)-1;
  Button1Click(Sender); // Show 1st question
end;

end.
Всего 2 обработчика - при создании формы первичная инициализация переменных и показ первого вопроса. Если картинки к вопросу нет, то просто укажи любой текст для ее имени, только что бы такого файла небыло.
При добавлении вопросов КОД МЕНЯТЬ НЕ НАДО, он корректно обработает любое кол-во вопросов.

ЗЫ. Загрузку картинок не проверял, но должно все работать.
Ответить с цитированием