Bonjour,

je cherche à réaliser un DnD entre 2 TEdits plus exactement entre la partie sélectionnée du premier vers le second.

J'ai un code à peu près fonctionnel mais je ne suis pas du tout sûr d'utiliser le concept DnD proprement.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Edit1 : TEdit;
    Edit2 : TEdit;
  [...]
  private
    { private declarations }
  public
    { public declarations }
    aStmp : String;
    aSelStart, aSelLength : integer;
  end;           
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  aStmp := '';
  with edit1, edit2 do
       DragMode := dmManual;
end;    
 
procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Sender is TCustomEdit) and (aStmp <> '') then begin
    TCustomEdit(Sender).BeginDrag(False);
    //Recréer la zone sélectionnée qui s'efface au moment du DnD
    TCustomEdit(Sender).SelStart  := aSelStart;
    TCustomEdit(Sender).SelLength := aSelLength;
  end;
 
end;
 
procedure TForm1.Edit1MouseEnter(Sender: TObject);
begin
    aStmp := ''; // "Débrancher" le mode DnD... Il y a probablement une autre méthode
end;
 
procedure TForm1.Edit1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 with TCustomEdit(Sender) do begin
   //Que faut-il copier ?
   asTmp      := Seltext;
   aSelStart  := SelStart;
   aSelLength := SelLength;
 end;
end;
 
procedure TForm1.Edit2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  //On copie
  TCustomEdit(Sender).Text := aStmp;
end;
 
procedure TForm1.Edit2DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if Source is TCustomEdit then
    Accept := True
  else
    Accept := False
end;
Comme d'habitude, le soucis d'ergonomie est important, notamment le non effacement visuel de la zone sélectionnée lors du move.

Cela me semble "bricolé". Avant de m'attaquer aux TMemos, j'aimerais savoir s'il y a une méthode plus adaptée.

Cordialement. Gilles