Как перетаскивать (Drag’n’Drop) выделенный текст между компонентами Memo.

Компилятор: Delphi

Данный способ позволяет не погружаясь глубоко в создание компонент осуществить операцию «drag and drop» выделенного текста.

Создайте новый компонент (TMyMemo), наследовав его от TMemo. И объявите его следующим образом:

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;

Добавьте обработчик WMLButtonDown:

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 Теперь установите этот компонент в package, создайте новый проект в Delphi и поместите на форму два TMyMemo. Для обоих компонент необходимо создать обработчики событий OnDragOver, которые должны выглядеть следующим образом:

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

Так же для них необходимо сделать обработчики событий OnDragDrop:

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 Запустите приложение, поместите в поля memo какой-нибудь текст, и посмотрите что произойдёт, если перетащить текст между полями.