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

RichEdit

开发平台:

Delphi

  1. /*------------------------------------------------------------------------------
  2.   Notes:
  3.   1. Making sure that all cells contain one item (and only one)
  4.     - adding rvpaoDoNotWantReturns in Options of all paragraph styles
  5.     - allowing to paste only one line of plain text (see OnPaste)
  6.   2. Protecting autocalculated text
  7.     - the 1st paragraph style ("Read-Only") has rvpaoReadOnly
  8.     - RichView allows to delete read-only paragraphs when they are parts
  9.       of lager selection (for example, multicell selection)
  10.       An event, allowing to avoid this problem, was added in version 1.6.11
  11.       (OnCellEditing)
  12.   3. Table cannot be deleted because it is added in read-only paragraph.
  13.   4. EConvertError exception occurs if Income column contains non numeric data.
  14.     If running in C++Builder IDE, Builder stops on exception. Just click OK and
  15.     press F9 to continue.
  16.   5. AcceptDragDropFormats is set to []
  17. ------------------------------------------------------------------------------*/
  18. #include <vclvcl.h>
  19. #pragma hdrstop
  20. #include "Unit1.h"
  21. //---------------------------------------------------------------------------
  22. #pragma link "RVEdit"
  23. #pragma link "RichView"
  24. #pragma link "RVScroll"
  25. #pragma link "RVStyle"
  26. #pragma resource "*.dfm"
  27. TForm1 *Form1;
  28. //---------------------------------------------------------------------------
  29. __fastcall TForm1::TForm1(TComponent* Owner)
  30. : TForm(Owner)
  31. {
  32. }
  33. //---------------------------------------------------------------------------
  34. void __fastcall TForm1::FormCreate(TObject *Sender)
  35. {
  36.   int r,c;
  37.   table = new TRVTableItemInfo(5,4, rve->RVData);
  38.   table->BorderWidth     = 1;
  39.   table->CellBorderWidth = 1;
  40.   table->CellBorderStyle = rvtbColor;
  41.   table->CellBorderColor = clBtnFace;
  42.   table->BorderStyle     = rvtbColor;
  43.   table->OnCellEditing   = OnCellEditing;
  44.   // Each cell initially contains one empty text item. Deleting it
  45.   for (r=0; r<table->Rows->Count; r++)
  46.     for (c=0; c<table->Rows->Items[r]->Count; c++)
  47.       table->Cells[r][c]->Clear();
  48.   // First Row
  49.   table->Cells[0][0]->AddNL("Name",1,1);
  50.   table->Cells[0][1]->AddNL("Income",1,1);
  51.   table->Cells[0][2]->AddNL("Tax Rate",1,1);
  52.   table->Cells[0][3]->AddNL("Tax",1,1);
  53.   // Last Row
  54.   r = table->Rows->Count-1;
  55.   table->Cells[r][0]->AddNL("TOTAL:",1,1);
  56.   table->Cells[r][1]->AddNL("",1,1);
  57.   table->Cells[r][2]->AddNL("",1,1);
  58.   table->Cells[r][3]->AddNL("",1,1);
  59.   // First Column
  60.   table->Cells[1][0]->AddNL("John Smith", 0, 0);
  61.   table->Cells[2][0]->AddNL("John Brown", 0, 0);
  62.   table->Cells[3][0]->AddNL("Phil Forest", 0, 0);
  63.   // Second Column
  64.   table->Cells[1][1]->AddNL("2000", 0, 0);
  65.   table->Cells[2][1]->AddNL("2500", 0, 0);
  66.   table->Cells[3][1]->AddNL("1000", 0, 0);
  67.   for (r=1; r<table->Rows->Count-1; r++)
  68.   {
  69.     table->Cells[r][2]->Color = clSilver;
  70.     table->Cells[r][3]->Color = clSilver;
  71.     table->Cells[r][2]->AddNL("0.20",0,1);
  72.     table->Cells[r][3]->AddNL("",0,1);
  73.   }
  74.   for (c=0; c<table->Rows->Items[0]->Count; c++)
  75.   {
  76.     table->Cells[0][c]->Color = clSilver;
  77.     table->Cells[table->Rows->Count-1][c]->Color = clSilver;
  78.   }
  79.   DecimalSeparator = '.';
  80.   Calculate();
  81.   rve->InsertItem("Spreadsheet", table);
  82.   rve->ApplyParaStyle(1); // read-only style;
  83. }
  84. //---------------------------------------------------------------------------
  85. void TForm1::Calculate()
  86. {
  87.   // Last Column
  88.   AnsiString s;
  89.   bool totalOK = true;
  90.   double total   = 0.0;
  91.   double totaltax = 0.0;
  92.   double val, valtax;
  93.   for (int r=1; r<table->Rows->Count-1; r++)
  94.   {
  95.     try
  96.     {
  97.       // val <- income
  98.       val = StrToFloat(table->Cells[r][1]->GetRVData()->GetItemText(0));
  99.       // valtax <- income * tax rate
  100.       valtax = val*StrToFloat(table->Cells[r][2]->GetRVData()->GetItemText(0));
  101.       s = FloatToStr(valtax);
  102.       total    += val;
  103.       totaltax += valtax;
  104.     }
  105.     catch(...)
  106.     {
  107.       s = "?";
  108.       totalOK = false;
  109.     }
  110.     table->Cells[r][3]->GetRVData()->SetItemText(0,s);
  111.   }
  112.   if (totalOK)
  113.   {
  114.     table->Cells[table->Rows->Count-1][3]->GetRVData()->SetItemText(0, FloatToStr(totaltax));
  115.     table->Cells[table->Rows->Count-1][1]->GetRVData()->SetItemText(0, FloatToStr(total));
  116.   }
  117.   else
  118.   {
  119.     table->Cells[table->Rows->Count-1][3]->GetRVData()->SetItemText(0, "?");
  120.     table->Cells[table->Rows->Count-1][1]->GetRVData()->SetItemText(0, "?");
  121.   }
  122.   table->Changed();
  123. }
  124. //---------------------------------------------------------------------------
  125. // OnChange: recalculating
  126. void __fastcall TForm1::rveChange(TObject *Sender)
  127. {
  128.   Calculate();
  129.   rve->Reformat();
  130.   if (rve->InplaceEditor)
  131.     rve->InplaceEditor->Invalidate();
  132.   // Some ideas:
  133.   // - you can use table->GetEditedCell() to get a cell which was changed
  134. }
  135. //---------------------------------------------------------------------------
  136. // Adding a new row
  137. void __fastcall TForm1::Button1Click(TObject *Sender)
  138. {
  139.   int Data;
  140.   int ItemNo = rve->GetItemNo(table);
  141.   rve->BeginItemModify(ItemNo, Data);
  142.   int r = table->Rows->Count-1;
  143.   table->InsertRows(r, 1, -1
  144.   #if __BORLANDC__ > 0x530
  145.   , false
  146.   #endif
  147.   );
  148.   for (int c=1; c<table->Rows->Items[r]->Count; c++)
  149.     table->Cells[r][c]->Clear();
  150.   table->Cells[r][1]->AddNL("0", 0,0);
  151.   table->Cells[r][2]->AddNL("0.20", 0,1);
  152.   table->Cells[r][3]->AddNL("", 0,1);
  153.   table->Cells[r][2]->Color = clSilver;
  154.   table->Cells[r][3]->Color = clSilver;
  155.   rve->EndItemModify(ItemNo, Data);
  156.   rve->Change();
  157. }
  158. //---------------------------------------------------------------------------
  159. // Deleting a row with caret
  160. void __fastcall TForm1::Button2Click(TObject *Sender)
  161. {
  162.   int r,c;
  163.   if (table->GetEditedCell(r,c) && r!=0 && r!=table->Rows->Count-1)
  164.   {
  165.     int Data;
  166.     int ItemNo = rve->GetItemNo(table);
  167.     rve->BeginItemModify(ItemNo, Data);
  168.     table->DeleteRows(r,1,false);
  169.     rve->EndItemModify(ItemNo, Data);
  170.     rve->Change();
  171.   }
  172.   else
  173.     MessageBeep(0);
  174. }
  175. //---------------------------------------------------------------------------
  176. void __fastcall TForm1::rvePaste(TCustomRichViewEdit *Sender, bool &DoDefault)
  177. {
  178.   if (Clipboard()->HasFormat(CF_TEXT))
  179.   {
  180.     AnsiString s = Clipboard()->AsText;
  181.     if (!strchr(s.c_str(), 'r') && !strchr(s.c_str(), 'n'))
  182.       rve->InsertText(s, false);
  183.   }
  184.   DoDefault = false;
  185. }
  186. //---------------------------------------------------------------------------
  187. void __fastcall TForm1::OnCellEditing(TRVTableItemInfo* Sender, int Row, int Col,
  188.   bool Automatic, bool &AllowEdit)
  189. {
  190.   if (Automatic)
  191.     AllowEdit = (Row!=0) && (Row!=table->Rows->Count-1) && (Col<2);
  192. }