Glisser déposer d'un texte sélectionné vers un tedit

[Résolu]
Signaler
Messages postés
71
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
5 février 2009
-
Messages postés
71
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
5 février 2009
-
Bonjour

J'ai deux composants tedit. L'un contient une chaine qui est automatiquement insérée. J'aimerai pouvoir glisser déposer la partie de la chaine que l'utilisateur a sélectionné dans le 2eme composant tedit.
Mon problème est que je n'arrive à faire un glisser déposer que quand la chaine entiere est automatiquement sélectionnée.
Quelqu'un peut m'aider ?

Merci

6 réponses

Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Bonjour, oluha.

Ouais, pas évident de sélectionner un texte à la souris et d'enchaîner sur le drag and drop.
J'y arrive en plaçant la procedure BeginDrag() dans l'évènement OnMouseUp de l'Edit où est situé le texte sélectionné à copier.
Ca peut paraître suprenant à l'utilisation, mais ça fonctionne.
En attendant une meilleure idée...

Bonne prog' :-p

N'oubliez pas de valider "Réponse acceptée" si ça vous convient, de toute manière vous ne pouvez pas valider autre chose ! :big)
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Arf, je viens de m'apercevoir que tu recherchais le code pour des TEdit et non des TMemo. :blush)
Comme ils ont un ancêtre commun, cela ne pose aucun problème. Alors, pour me faire pardonner, voici le code pour les deux : TMemo et TEdit :

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.


Vois-tu la différence entre les deux types de composants ?
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
La réponse est sur le site de Borland : Drag and Drop Selected Text in between Memo Components.

Le code qui va bien n'était pas évident à trouver.
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Allez, même que pour te simplifier le boulot et éviter l'installation d'un énième composant dans ta palette, voici le code qui va bien.

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.


Ben oui, ici on redéfinit un type TMemo comme descendant de la classe TMyMemo. C'est tout ! Et, du coup, pas de composant à installer. Cette technique porte un nom mais je l'ai oublié. Sorry !

NB : les deux composants TMemo ont leurs gestionnaires d'évènements OnDragOver et OnDragDrop connectés sur le même code. Ce qui fait qu'on peut réaliser un drag'n drop d'un TMemo à l'autre et réciproquement.
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
Messages postés
71
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
5 février 2009

Merci beaucoup, je teste ca tout de suite ! ^^
Messages postés
71
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
5 février 2009

Ca marche nickel, merci ! :D