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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2015, 13:21   #11
Scorpuha
Форумчанин
 
Регистрация: 10.10.2013
Сообщений: 177
По умолчанию

Опишу подробнее задачу. Проект представляет собой тест на проверку знаний. Построен на ADO+Acsess. На скрине отображается билет теста с 10-ю вопросами. Один вопрос= одной закладке (TabSheet). Ответы на вопросы построены с помощью NMemo. При нажатии пользователем на вариант ответа тот в свою очередь изменит на цвет на серый. Моя задача состоит в том, чтобы при нажатии какой нибудь горячей клавиши пользователь мог увидеть правильный ответ на вопрос. Т.е. чтобы правильный ответ подсветился цветом к примеру зеленым и затем пользователем смог его выбрать. Так называемая подсказка.
Изображения
Тип файла: jpg ответ выбранный клавшей подсказкой.JPG (75.9 Кб, 152 просмотров)
Тип файла: jpg ответ выбранный пользователем.JPG (79.8 Кб, 125 просмотров)
Scorpuha вне форума Ответить с цитированием
Старый 27.11.2015, 14:35   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот что бы я тебе предложил:
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses  db,
  Classes, SysUtils, memds, FileUtil, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Grids;

type

  { TForm1 }

  TForm1 = class(TForm)
    MemDataset1: TMemDataset;
    Memo1: TMemo;
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

    procedure StringGrid1Click(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
      aRect: TRect; aState: TGridDrawState);
  private
    { private declarations }
  public
    procedure ShowQuest;
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin

  with Memo1 do begin
    Align:=alTop;
  end;
  with StringGrid1 do begin
    Align:=alClient;
    FixedCols:=0; FixedRows:=0;
  end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
const VK_F12=0;
  var i:integer;
begin
  //Если нажата F12
  if key=VK_F12 then begin
   with TStringGrid(Sender) do begin
     //В цикле пройдемся по гриду
     for i:=0 to RowCount-1 do
      //И подсветим кремовым колором правильные ответы
      if Boolean(Objects[0,Row]) then   Objects[1,Row]:=TObject(clCream);
     Repaint;
   end;
  end;
end;



procedure TForm1.StringGrid1Click(Sender: TObject);
begin
  //Если кликнули:
  with TStringGrid(Sender) do begin
    //Подсветим кликнутое красным или зеленым в зависимости от правильности ответа
    if Boolean(Objects[0,Row]) then   Objects[1,Row]:=TObject(clGreen)
    else    Objects[1,Row]:=TObject(clRed);
  end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
  //Провернем отрисовку грида колорами
  with TStringGrid(Sender),TStringGrid(Sender).Canvas do begin
    if aCol=0 then begin
     DefaultDrawing:=True;
     Exit;
    end;
    DefaultDrawing:=False;
    //Возьмем цвет из свойства объекта ячейки второй колонки
    Brush.Color:=TColor(Objects[1,Row]);
    //И им отрисуем ячейку
    FillRect(aRect);
    TextOut(aRect.Left,aRect.Top,Cells[aCol,aRow]);
  end;
end;

procedure TForm1.ShowQuest;
begin
  //Заполним из базы вопрос и ответы
  with StringGrid1,MemDataset1 do begin
    Memo1.Lines.Text:=MemDataset1.FieldByName('Quest').AsString;
    First;
    RowCount:=0; ColCount:=2;DefaultColWidth:=Width;  FixedCols:=1;
    while not eof do begin
      //Подобавляем в Грид строки с ответами
      RowCount:=RowCount+1;
      //Если этот ответ верный - True попадет в ячейку объекта первой колонки
      Objects[0,RowCount-1]:=TObject(MemDataset1.FieldByName('IsRight').AsBoolean);
      //А вторая колонка будет отвечать за колор
      Objects[1,RowCount-1]:=TObject(clWhite);

      //Так же наполним ячейки текстом ответа и номером
      Cells[0,RowCount-1]:=MemDataset1.FieldByName('Answer').AsString;
      Cells[1,RowCount-1]:=IntToStr(RecNo);
      Next;
    end;
  end;
end;

end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.11.2015, 16:51   #13
Scorpuha
Форумчанин
 
Регистрация: 10.10.2013
Сообщений: 177
По умолчанию

не сомневаюсь что это работает. Но как то не очень хочется переделывать. И если можно скиньте скриншот как это выглядит.
Scorpuha вне форума Ответить с цитированием
Старый 30.11.2015, 18:02   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я это писал с коленки. Видимо более ничем помочь не могу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
какой ответ правильный? contor Windows 1 04.01.2014 16:13
Скажите каким образом в этой программе тестирования определяется правильный ответ и как к нему создавать список вопросов? Ольга1234 Windows Forms 1 07.06.2013 06:53
Как отметить совпадения hloppel Microsoft Office Excel 6 28.10.2010 09:45
C++. в зависимости от проверки элемента на равенство должен выводится правильный ответ phantom4eg Помощь студентам 9 24.05.2010 22:41
Файл, выводит не правильный ответ. Telec Общие вопросы C/C++ 7 11.05.2010 19:30