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 ====== | ||