Unit1.cpp
上传用户:daoqigc
上传日期:2021-04-20
资源大小:2795k
文件大小:9k
源码类别:

RichEdit

开发平台:

Delphi

  1. /*==============================================================================
  2.   This demo shows how to work with tables, mouse events, GetItemAt method
  3. ==============================================================================*/
  4. #include <vclvcl.h>
  5. #include <stdlib.h>
  6. #include <mmsystem.h>
  7. #pragma hdrstop
  8. #include "Unit1.h"
  9. //---------------------------------------------------------------------------
  10. #pragma link "RichView"
  11. #pragma link "RVScroll"
  12. #pragma link "RVStyle"
  13. #pragma resource "*.dfm"
  14. TForm1 *Form1;
  15. #define QUESTIONCOUNT 4
  16. #define ANSWERCOUNT 9
  17. // Sorted array of answers.
  18. const AnsiString Answers[QUESTIONCOUNT][ANSWERCOUNT] =
  19.  {
  20.   {"Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"},
  21.   {"Pluto", "Neptune", "Uranus", "Saturn", "Jupiter", "Mars", "Earth", "Venus", "Mercury"},
  22.   {"Pluto", "Mercury", "Mars", "Venus", "Earth", "Neptune", "Uranus", "Saturn", "Jupiter"},
  23.   {"Jupiter", "Saturn", "Uranus", "Neptune", "Earth", "Venus", "Mars", "Mercury", "Pluto"}
  24.  };
  25. // Array of questions
  26. const AnsiString Questions[QUESTIONCOUNT] =
  27.   {
  28.     "Which of these planets is closest to the Sun?",
  29.     "Which of these planets is the most distant from the Sun?",
  30.     "Which of these planets is the smallest?",
  31.     "Which of these planets is the largest?"
  32.    };
  33. #define TABLECOLOR (TColor)0xCCFFFF
  34. #define HEADCOLOR  (TColor)0x990033
  35. #define HLTCOLOR   (TColor)0x66CCFF
  36. #define SELCOLOR   (TColor)0x3399CC
  37. #define PASSCOLOR  (TColor)0x00FF33
  38. #define FAILCOLOR  (TColor)0x0033FF
  39. //---------------------------------------------------------------------------
  40. __fastcall TForm1::TForm1(TComponent* Owner)
  41. : TForm(Owner)
  42. {
  43. }
  44. //---------------------------------------------------------------------------
  45. // Filling RichView. Preparing the quiz
  46. void TForm1::BuildQuiz()
  47. {
  48.   int CorrectAnswer;
  49.   RichView1->Clear();
  50.   AnsweredCount = 0;
  51.   TStringList* sl = new TStringList;
  52.   for (int i = 0; i<QUESTIONCOUNT; i++)
  53.   {
  54.     // adding questions. one question is one table
  55.     FillQuestion(sl, Answers[i], CorrectAnswer);
  56.     AddTable(Questions[i], sl, CorrectAnswer);
  57.     RichView1->AddNL("",0,0);
  58.   }
  59.   delete sl;
  60.   // adding hypertext "button"
  61.   RichView1->AddNL("Ready!", 2, 1);
  62.   RichView1->Format();
  63.   Ready = false;
  64.   RVStyle1->TextStyles->Items[2]->HoverBackColor = FAILCOLOR;
  65. }
  66. //------------------------------------------------------------------------------
  67. // This function chooses 3 answers from ARR and add them in SL.
  68. // Index of the correct answer is returned in CORRECTANSWER
  69. #define OPTIONCOUNT 3
  70. void TForm1::FillQuestion(TStringList* sl, const AnsiString arr[], int& CorrectAnswer)
  71. {
  72.   int Options[OPTIONCOUNT], i, j, v;
  73.   sl->Clear();
  74.   // Choosing 3 different random answers
  75.   for (i = 0; i<OPTIONCOUNT; i++)
  76.     do
  77.     {
  78.       v = random(ANSWERCOUNT);
  79.       for (j = 0; j<i; j++)
  80.         if (Options[j]==v)
  81.         {
  82.           v = -1;
  83.           break;
  84.         }
  85.       if (v>=0)
  86.       {
  87.         Options[i] = v;
  88.         sl->Add(arr[v]);
  89.       }
  90.     }
  91.     while (v<0);
  92.   // Finding the correct answer. arr is sorted so that the correct answer
  93.   // is an answer with smaller index
  94.   CorrectAnswer = -1;
  95.   j = QUESTIONCOUNT+1;
  96.   for (i = 0; i<OPTIONCOUNT; i++)
  97.     if (Options[i]<j)
  98.     {
  99.       j = Options[i];
  100.       CorrectAnswer = i;
  101.     }
  102. }
  103. //------------------------------------------------------------------------------
  104. // Adding one question
  105. // The 0-th table row will contain the question. Other rows - answers.
  106. // Index of the correct answer is stored in invisible table caption
  107. void TForm1::AddTable(const AnsiString Question, TStringList* Answers,
  108.   int CorrectAnswer)
  109. {
  110.   TRVTableItemInfo* table = new TRVTableItemInfo(Answers->Count+1, 1, RichView1->RVData);
  111.   table->BestWidth = -80;
  112.   table->ParaNo = 1;
  113.   table->Color = TABLECOLOR;
  114.   table->Cells[0][0]->Clear();
  115.   table->Cells[0][0]->AddNL(Question,1,0);
  116.   table->Cells[0][0]->Color = HEADCOLOR;
  117.   for (int i=0; i<Answers->Count; i++)
  118.   {
  119.     table->Cells[i+1][0]->Clear();
  120.     table->Cells[i+1][0]->AddNL(Answers->Strings[i],0,0);
  121.   }
  122.   table->BorderVSpacing = 5;
  123.   table->BorderHSpacing = 10;
  124.   table->CellPadding     = 4;
  125.   table->BorderWidth     = 2;
  126.   table->CellBorderWidth = 0;
  127.   table->BorderStyle     = rvtbColor;
  128.   table->CellBorderStyle = rvtbColor;
  129.   RichView1->AddItem(IntToStr(CorrectAnswer), table);
  130. }
  131. //------------------------------------------------------------------------------
  132. // If RVData is a table cell, this function highlights this cell.
  133. // Removes highlighting from the previously highlighted cell (stored in HighlightedRVData)
  134. // Updates HighlightedRVData
  135. // Highlighted cell has color = HLTCOLOR, others - clNone.
  136. void TForm1::HighlightCell(TCustomRVFormattedData* RVData)
  137. {
  138.   if (HighlightedRVData==RVData)
  139.     return;
  140.   if (HighlightedRVData)
  141.   {
  142.     ((TRVTableCellData*)HighlightedRVData)->Color = clNone;
  143.     HighlightedRVData->Invalidate();
  144.     HighlightedRVData = NULL;
  145.   }
  146.   if (!RVData->InheritsFrom(__classid(TRVTableCellData)) ||
  147.       ((TRVTableCellData*)RVData)->Color==SELCOLOR)
  148.     return;
  149.   int r,c;
  150.   ((TRVTableCellData*)RVData)->GetTable()->GetCellPosition((TRVTableCellData*)RVData,r,c);
  151.   if (r==0)
  152.     return;
  153.   ((TRVTableCellData*)RVData)->Color = HLTCOLOR;
  154.   RVData->Invalidate();
  155.   HighlightedRVData = RVData;
  156. }
  157. //------------------------------------------------------------------------------
  158. // If RVData is a table cell, this function selects this cell.
  159. // Selected cell has color = SELCOLOR.
  160. // Updates number of answered questions (AnsweredCount).
  161. // If all questions are answered, changes highlight of hypertext jump from
  162. // red to green.
  163. void TForm1::SelectCell(TCustomRVFormattedData* RVData)
  164. {
  165.   if (!RVData->InheritsFrom(__classid(TRVTableCellData)))
  166.     return;
  167.   TRVTableItemInfo* table = ((TRVTableCellData*)RVData)->GetTable();
  168.   int r,c;
  169.   table->GetCellPosition((TRVTableCellData*)RVData,r,c);
  170.   if (r==0)
  171.     return;
  172.   for (r=1; r<table->Rows->Count; r++)
  173.   {
  174.     if (table->Cells[r][0]->Color==SELCOLOR)
  175.       AnsweredCount--;
  176.     table->Cells[r][0]->Color = clNone;
  177.   }
  178.   ((TRVTableCellData*)RVData)->Color = SELCOLOR;
  179.   AnsweredCount++;
  180.   RVData->Invalidate();
  181.   if (HighlightedRVData==RVData)
  182.     HighlightedRVData = NULL;
  183.   if (AnsweredCount==QUESTIONCOUNT)
  184.     RVStyle1->TextStyles->Items[2]->HoverBackColor = PASSCOLOR;
  185. }
  186. //---------------------------------------------------------------------------
  187. void __fastcall TForm1::FormCreate(TObject *Sender)
  188. {
  189.   randomize();
  190.   BuildQuiz();
  191. }
  192. //---------------------------------------------------------------------------
  193. // OnMouseMove event - highlighting cell
  194. void __fastcall TForm1::RichView1MouseMove(TObject *Sender, TShiftState Shift,
  195. int X, int Y)
  196. {
  197.   TCustomRVFormattedData* RVData;
  198.   int a,b;
  199.   if (Ready)
  200.     return;
  201.   X += RichView1->HScrollPos;
  202.   Y += RichView1->VScrollPos*RichView1->VSmallStep;
  203.   RichView1->GetItemAt(X, Y, RVData, a, b, false);
  204.   HighlightCell(RVData);
  205. }
  206. //---------------------------------------------------------------------------
  207. // OnRVMouseUp event - selecting cell
  208. void __fastcall TForm1::RichView1RVMouseUp(TCustomRichView *Sender,
  209. TMouseButton Button, TShiftState Shift, int ItemNo, int X, int Y)
  210. {
  211.   TCustomRVFormattedData* RVData;
  212.   int a,b;
  213.   if (Ready)
  214.     return;
  215.   X += RichView1->HScrollPos;
  216.   Y += RichView1->VScrollPos*RichView1->VSmallStep;
  217.   RichView1->GetItemAt(X, Y, RVData, a, b, false);
  218.   SelectCell(RVData);
  219. }
  220. //---------------------------------------------------------------------------
  221. // On hyperlink click.
  222. void __fastcall TForm1::RichView1Jump(TObject *Sender, int id)
  223. {
  224.   if (!Ready)
  225.   { // clicking on "Ready!"
  226.     if (AnsweredCount<QUESTIONCOUNT)
  227.     {
  228.       MessageBeep(0);
  229.       return;
  230.     }
  231.     Ready = true;
  232.     HighlightCell(RichView1->RVData);
  233.     int Score = 0;
  234.     for (int i = 0; i< RichView1->ItemCount; i++)
  235.       if (RichView1->GetItemStyle(i)==rvsTable)
  236.       {
  237.         TRVTableItemInfo* table = (TRVTableItemInfo*)(RichView1->GetItem(i));
  238.          for (int r=1; r<table->Rows->Count; r++)
  239.            if (table->Cells[r][0]->Color==SELCOLOR)
  240.            {
  241.              if (IntToStr(r-1)==RichView1->GetItemTextA(i))
  242.              {
  243.                table->Cells[0][0]->AddNL(" (passed)", 1,-1);
  244.                table->Cells[r][0]->Color = PASSCOLOR;
  245.                Score++;
  246.              }
  247.              else
  248.              {
  249.                table->Cells[0][0]->AddNL(" (failed)", 1,-1);
  250.                table->Cells[r][0]->Color = FAILCOLOR;
  251.              }
  252.              break;
  253.            }
  254.       }
  255.     RichView1->SetItemTextA(RichView1->ItemCount-1, "Try again");
  256.     Caption = Format("PlanetQuiz : %d of %d", ARRAYOFCONST((Score, QUESTIONCOUNT)));
  257.     RichView1->Format();
  258.     RichView1->Update();
  259.     if (Score!=QUESTIONCOUNT)
  260.       PlaySound("CHORD.WAV", 0, SND_SYNC | SND_NODEFAULT);
  261.     else
  262.       PlaySound("TADA.WAV", 0, SND_SYNC | SND_NODEFAULT);
  263.   }
  264.   else
  265.   {  // clicking on "Try Again"
  266.     BuildQuiz();
  267.     RichView1->ScrollTo(0);
  268.     Caption = "PlanetQuiz";
  269.   }
  270. }