Différences
Ci-dessous, les différences entre deux révisions de la page.
| 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 Lazarus, situé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 ====== | ||