unit Unit1; {Source : http://community.borland.com/article/0%2C1410%2C19540%2C00.html} interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; 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; TMemo = Class(TMyMemo); TMyEdit = class(TEdit) 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; TEdit = class(TMyEdit); TForm1 = class(TForm) Memo1: TMemo; Memo2: TMemo; Edit1: TEdit; Edit2: TEdit; procedure MemosDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure MemosDragDrop(Sender, Source: TObject; X, Y: Integer); procedure EditsDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure EditsDragDrop(Sender, Source: TObject; X, Y: Integer); private { Déclarations privées } public { Déclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} { TMyMemo } 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; procedure TForm1.MemosDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := Source is TMyMemo; end; procedure TForm1.MemosDragDrop(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; { TMyEdit } procedure TMyEdit.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; procedure TForm1.EditsDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := Source is TEdit; end; procedure TForm1.EditsDragDrop(Sender, Source: TObject; X, Y: Integer); var Dst, Src: TMyEdit; Ch: Integer; Temp: string; begin Dst := Sender as TMyEdit; Src := Source as TMyEdit; 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; end.
unit Unit1; {Source : http://community.borland.com/article/0%2C1410%2C19540%2C00.html} interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; 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; TMemo = Class(TMyMemo); TForm1 = class(TForm) Memo1: TMemo; Memo2: TMemo; procedure MemosDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure MemosDragDrop(Sender, Source: TObject; X, Y: Integer); private { Déclarations privées } public { Déclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} { TMyMemo } 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; procedure TForm1.MemosDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := Source is TMyMemo; end; procedure TForm1.MemosDragDrop(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; end.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question