Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
prog:lazarus:cas:draganddrop [28/07/2024 16:06]
thierry créée
prog:lazarus:cas:draganddrop [19/08/2024 15:35] (Version actuelle)
thierry [Résumé]
Ligne 1: Ligne 1:
 ====== Drag & Drop ====== ====== Drag & Drop ======
 ===== Afficher une image lors d'un Drag & Drop ===== ===== Afficher une image lors d'un Drag & Drop =====
-Pour afficher une image lorsque l'on fait un drag and drop on peut utiliser cette méthode. 
  
-Cette astuce proviens directement ​des exemples ​dans LAZARUS, dans ''​exemples/​dragimagelist''​+Pour afficher une image lors d'un drag and drop dans Lazarus, vous pouvez utiliser la méthode décrite ci-dessous. ​Cette méthode est inspirée ​des exemples ​fournis avec Lazarussitués ​dans le répertoire ​''​`exemples/​dragimagelist`''
 + 
 +==== 1. Définir une classe dérivée de `TDragControlObjectEx` ==== 
 + 
 +La première étape consiste à créer une classe dérivée de `TDragControlObjectEx` qui encapsulera la logique pour afficher l'image lors du drag and drop. 
 + 
 +**Déclaration de la classe :**
  
 <code delphi> <code delphi>
-  ​{ TTileDragObject }+{ TTileDragObject } 
 interface interface
-...+ 
 +uses 
 +  Classes, Controls, DragDrop, Graphics, ImgList, Windows; 
 + 
 +type
   TTileDragObject = class(TDragControlObjectEx)   TTileDragObject = class(TDragControlObjectEx)
   private   private
Ligne 18: Ligne 28:
     destructor Destroy; override;     destructor Destroy; override;
   end;   end;
-  ... +</​code>​ 
- ​implementation+**Proposition d'​implémentation de la classe :** 
 + 
 +<code delphi> 
 +implementation 
 { TTileDragObject } { TTileDragObject }
  
Ligne 31: Ligne 45:
   vBitmap: Graphics.TBitmap;​   vBitmap: Graphics.TBitmap;​
 begin begin
- 
   inherited Create(AControl);​   inherited Create(AControl);​
   FDragImages := TDragImageList.Create(AControl);​   FDragImages := TDragImageList.Create(AControl);​
-  AlwaysShowDragImages := C_SHOW_DRAG_IMAGE+  AlwaysShowDragImages := True // Remplacez par C_SHOW_DRAG_IMAGE si nécessaire 
-  vBitmap ​    ​:= Graphics.TBitMap.Create;+  vBitmap := Graphics.TBitmap.Create;
   try   try
-    vBitmap.Width ​ := AControl.Width;​+    vBitmap.Width := AControl.Width;​
     vBitmap.Height := AControl.Height;​     vBitmap.Height := AControl.Height;​
-    if AControl is TWinControl then TWinControl(AControl).PaintTo(vBitmap.Canvas,​ 0, 0); +    if (AControl is TWinControl) and (csReplicatable in AControl.ControlStyle) ​then //​csReplicatable signifie que la methode PaintTo est implementée 
-    FDragImages.Width ​ := vBitmap.Width;​+      ​TWinControl(AControl).PaintTo(vBitmap.Canvas,​ 0, 0); 
 +    FDragImages.Width := vBitmap.Width;​
     FDragImages.Height := vBitmap.Height;​     FDragImages.Height := vBitmap.Height;​
-    FDragImages.add(vBitmap, nil); +    FDragImages.Add(vBitmap, nil); 
-    FDragImages.DragHotspot := Classes.Point(vBitmap.Width div 2, vBitmap.Height div 2);+    FDragImages.DragHotspot := Mouse.CursorPos - AControl.ClientOrigin// Positionne le DragHotSpot a l'​endroit ou a été saisie le Control ​
   finally   finally
     vBitmap.Free;​     vBitmap.Free;​
Ligne 54: Ligne 68:
   inherited Destroy;   inherited Destroy;
 end; end;
 +</​code>​
 +==== 2. Implémenter la méthode `PaintTo` dans le contrôle ====
 +Le contrôle à partir duquel l'​image sera dessinée doit implémenter la méthode ''​PaintTo''​.
  
 +Si la méthode ''​PaintTo''​ fonctionne pour un Control, le Control doit avoir le membre ''​[csReplicatable]''​ dans son ''​ControleStyle'',​ voir [[prog:​lazarus:​classes:​tcontrols:​tcontrolstyletype#​csreplicatable]]
  
-</​code>​ 
- 
-Le Control qui doit être dessiné doit implémenter la méthode PaintTo : 
 <code delphi> <code delphi>
 procedure TTICTileControl.Paint;​ procedure TTICTileControl.Paint;​
Ligne 66: Ligne 81:
   ARect := GetClientRect;​   ARect := GetClientRect;​
   Canvas.FillRect(ARect);​   Canvas.FillRect(ARect);​
 +  // Dessinez ici le contenu de votre contrôle
 end; end;
  
-procedure TTICTileControl.PaintTo(DC:​ HDC; X, Y: integer);+{ Si la methode PaintTo est implementée,​ il est bon de definir ControleStyle+[csReplicatable] } 
 +procedure TTICTileControl.PaintTo(DC:​ HDC; X, Y: Integer);
 var var
-  DCChanged: ​boolean;+  DCChanged: ​Boolean;
 begin begin
   DCChanged := (not Canvas.HandleAllocated) or (Canvas.Handle <> DC);   DCChanged := (not Canvas.HandleAllocated) or (Canvas.Handle <> DC);
Ligne 78: Ligne 95:
     Paint;     Paint;
   finally   finally
-    if DCChanged then Canvas.Handle := 0;+    if DCChanged then 
 +      ​Canvas.Handle := 0;
   end;   end;
-end;               ​+end;
 </​code>​ </​code>​
 +==== 3. Créer et initialiser le `TDragObject` dans l'​événement `OnStartDrag` ====
  
-Dans le OnStartDrag on doit créer et remplir le ''​TDragObject''​+Lorsque ​le drag and drop commence, vous devez créer et initialiser votre ''​TDragObject''​.
  
 <code delphi> <code delphi>
Ligne 90: Ligne 109:
   vDO: TTileDragObject;​   vDO: TTileDragObject;​
 begin begin
-  vDO         ​:= TTileDragObject.Create(Self);​ +  vDO := TTileDragObject.Create(Self);​ 
-  vDO.Control := self+  vDO.Control := Self
-  DragObject ​ := vDO; +  DragObject := vDO; 
-  ​... +  ​// Ajoutez ici tout autre initialisation nécessaire 
-end;       ​+end;
 </​code>​ </​code>​
 +==== Résumé ====
  
 +En utilisant cette approche, vous créez un objet de type ''​TDragObject''​ qui contient un ''​TDragImageList''​ pour gérer l'​affichage de l'​image lors du drag and drop. L'​image est dessinée à partir du contrôle source grâce à la méthode ''​PaintTo''​. Cette méthode permet de dessiner le contrôle dans un bitmap, qui est ensuite utilisé pour afficher l'​image lors du drag.
 +====== Source & Ressources ======