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

RichEdit

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  5.   Dialogs, ExtCtrls, RVStyle, RVScroll, RichView, RVEdit, CRVFData, RVTable;
  6. const WM_SETCARETPOS = WM_USER+10;
  7. type
  8.   TForm1 = class(TForm)
  9.     RichViewEdit1: TRichViewEdit;
  10.     RVStyle1: TRVStyle;
  11.     Image1: TImage;
  12.     Image2: TImage;
  13.     Image3: TImage;
  14.     procedure RichViewEdit1DragOver(Sender, Source: TObject; X, Y: Integer;
  15.       State: TDragState; var Accept: Boolean);
  16.     procedure RichViewEdit1DragDrop(Sender, Source: TObject; X,
  17.       Y: Integer);
  18.     procedure FormCreate(Sender: TObject);
  19.   private
  20.     { Private declarations }
  21.     Dragging: Boolean;
  22.     procedure WMSetCaretPos(var Msg: TMessage); message WM_SETCARETPOS;
  23.   public
  24.     { Public declarations }
  25.     procedure MoveCaretTo(X,Y: Integer);
  26.   end;
  27. var
  28.   Form1: TForm1;
  29. implementation
  30. {$R *.dfm}
  31. procedure TForm1.RichViewEdit1DragOver(Sender, Source: TObject; X,
  32.   Y: Integer; State: TDragState; var Accept: Boolean);
  33. begin
  34.   Accept := Source is TImage;
  35.   // We cannot create/destroy inplace editors for cells just
  36.   // in OnDragOver, so we position caret in OnWMSetCaretPos
  37.   // We same technique should be used for OnMouseMove
  38.   if Accept then
  39.     PostMessage(Handle, WM_SETCARETPOS, X,Y);
  40. end;
  41. procedure TForm1.WMSetCaretPos(var Msg: TMessage);
  42. begin
  43.   MoveCaretTo(Msg.WParam, Msg.LParam);
  44. end;
  45. procedure TForm1.MoveCaretTo(X, Y: Integer);
  46. var RVData: TCustomRVFormattedData;
  47.     ItemNo, Offs: Integer;
  48. begin
  49.   inc(X, RichViewEdit1.HScrollPos);
  50.   inc(Y, RichViewEdit1.VScrollPos*RichViewEdit1.VSmallStep);
  51.   RichViewEdit1.GetItemAt(X,Y,RVData,ItemNo,Offs, False);
  52.   RVData := RVData.Edit as TCustomRVFormattedData;
  53.   if ItemNo<0 then
  54.     exit;
  55.   RVData.SetSelectionBounds(ItemNo, Offs, ItemNo, Offs);
  56.   RVData.Invalidate;
  57. end;
  58. procedure TForm1.RichViewEdit1DragDrop(Sender, Source: TObject; X,
  59.   Y: Integer);
  60. var bmp: TBitmap;
  61. begin
  62.   // Dragging is finished. Inserting picture.
  63.   MoveCaretTo(X, Y);
  64.   bmp := TBitmap.Create;
  65.   bmp.Assign(TImage(Source).Picture.Bitmap);
  66.   RichViewEdit1.InsertPicture('', bmp, rvvaBaseLine);
  67. end;
  68. procedure TForm1.FormCreate(Sender: TObject);
  69. var i: Integer;
  70.     table: TRVTableItemInfo;
  71. begin
  72.   RichViewEdit1.Clear;
  73.   RichViewEdit1.AddNL('This demo shows dragging TImage to TRichViewEdit using VCL drag&drop procedures.',2,0);
  74.   RichViewEdit1.AddNL('TRichViewEdit has its own drag&drop implementation: '+
  75.     'you can drag inside TRichViewEdit, '+
  76.     'from TRichViewEdit to another window/application, '+
  77.     'from another window/application to TRichViewEdit.',2,0);
  78.   for i := 0 to 5 do
  79.     RichViewEdit1.AddNL('Drag images from the right and drop them here',0,0);
  80.   table := TRVTableItemInfo.CreateEx(1,2, RichViewEdit1.RVData);
  81.   table.CellBorderWidth := 1;
  82.   table.BorderWidth := 1;
  83.   table.Cells[0,0].Clear;
  84.   table.Cells[0,0].AddNL('Drag images from the right and drop them here',0,0);
  85.   table.Cells[0,1].Clear;
  86.   table.Cells[0,1].AddNL('Drag images from the right and drop them here',0,0);
  87.   RichViewEdit1.AddItem('', table);
  88.   for i := 0 to 50 do
  89.     RichViewEdit1.AddNL('Drag images from the right and drop them here',0,0);
  90.   RichViewEdit1.Format;
  91. end;
  92. end.