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

RichEdit

开发平台:

Delphi

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