community.borland.com

Article #19540: Drag and Drop Selected Text in between Memo Components

 Technical Information Database

TI4540D.txt - Drag and Drop Selected Text in between Memo Components

Category   :VCL
Platform   :All-32Bit
Product    :All32Bit,   

Description:
Without getting too deep into component creation, here's a very
simple way of accomplishing drag and drop of selected text.

Create a new component (TMyMemo) descending off of TMemo.

Make the type declaration look something like this:

type
  TMyMemo = class(TMemo)
  private
    FLastSelStart  : Integer;
    FLastSelLength : Integer;
    procedure WMLButtonDown(var Message: TWMLButtonDown);
      message WM_LBUTTONDOWN;
  published
    property LastSelStart : Integer read FLastSelStart
      write FLastSelStart;
    property LastSelLength : Integer read FLastSelLength
      write FLastSelLength;
  end;

Make the implementation of WMLButtonDown look like this:

procedure TMyMemo.WMLButtonDown(var Message: TWMLButtonDown);
var
  Ch : Integer;
begin
  if SelLength > 0 then begin
    Ch := LoWord(Perform(EM_CHARFROMPOS,0,
                         MakeLParam(Message.XPos,Message.YPos)));
    LastSelStart := SelStart;
    LastSelLength := SelLength;
    if (Ch >= SelStart) and (Ch <= SelStart+SelLength-1) then
      BeginDrag(True)
    else
      inherited;
  end
  else
    inherited;
end;

Now, install this component into a package, start a brand new project
in Delphi 3 and drop two TMyMemos down.

Make them both have an OnDragOver event handler looking like this:

procedure TForm1.MyMemo1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := Source is TMyMemo;
end;

Make them both have an OnDragDrop event handler looking like this:

procedure TForm1.MyMemo1DragDrop(Sender, Source: TObject;
                                 X, Y: Integer);
var
  Dst, Src : TMyMemo;
  Ch       : Integer;
  Temp     : String;
begin
  Dst := Sender as TMyMemo;
  Src := Source as TMyMemo;
  Ch := LoWord(Dst.Perform(EM_CHARFROMPOS,0,MakeLParam(X,Y)));

  if (Src = Dst) and (Ch >= Src.LastSelStart) and
     (Ch <= Src.LastSelStart+Src.LastSelLength-1) then
    Exit;

  Dst.Text := Copy(Dst.Text,1,Ch)+Src.SelText+
              Copy(Dst.Text,Ch+1,Length(Dst.Text)-Ch);
  Temp := Src.Text;
  Delete(Temp,Src.LastSelStart+1,Src.LastSelLength);
  Src.Text := Temp;
end;

Launch the app and put some text into the memos, and watch what
happens as you drag and drop inbetween the two memos, or even drag
and drop text from one location in one memo component to another
location in the same memo component.



Reference:
 

4/1/99 11:38:22 AM
 

Last Modified: 01-SEP-99