Glisser déposer d'un texte sélectionné vers un tedit [Résolu]

cs_oluha 71 Messages postés vendredi 19 mars 2004Date d'inscription 5 février 2009 Dernière intervention - 26 nov. 2004 à 17:03 - Dernière réponse : cs_oluha 71 Messages postés vendredi 19 mars 2004Date d'inscription 5 février 2009 Dernière intervention
- 29 nov. 2004 à 09:33
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
Afficher la suite 

6 réponses

Répondre au sujet
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 27 nov. 2004 à 15:55
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de japee
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 27 nov. 2004 à 16:18
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Delphiprog
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 27 nov. 2004 à 15:57
0
Utile
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
Commenter la réponse de cs_Delphiprog
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 27 nov. 2004 à 16:08
0
Utile
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
Commenter la réponse de cs_Delphiprog
cs_oluha 71 Messages postés vendredi 19 mars 2004Date d'inscription 5 février 2009 Dernière intervention - 29 nov. 2004 à 09:16
0
Utile
Merci beaucoup, je teste ca tout de suite ! ^^
Commenter la réponse de cs_oluha
cs_oluha 71 Messages postés vendredi 19 mars 2004Date d'inscription 5 février 2009 Dernière intervention - 29 nov. 2004 à 09:33
0
Utile
Ca marche nickel, merci ! :D
Commenter la réponse de cs_oluha

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.