Problème avec IDropTarget lors de l'utilisation avec un formulaire VCL
-
05-07-2019 - |
Question
J'ai une interface graphique VCL développée dans Codegear. J'ai créé un DropTarget pour le mainform et l'objet DropTarget implémente l'interface IDropTarget qui me permet de glisser-déposer des fichiers depuis l'explorateur. Maintenant, parce que je veux seulement que certains composants enfants soient des cibles de dépôt (pas la forme entière), je n’ai que la méthode DragEnter qui retourne S_OK lorsque les coordonnées POINTL sont dans les limites du composant.
Toutefois, si je déplace lentement l'élément dans les limites de la fiche mais pas dans le composant, DragEnter renvoie E_NOINTERFACE et n'autorise donc pas de suppression. Si je continue à glisser dans la zone de dépôt, DragEnter ne se déclenche pas, je comprends pourquoi il ne se déclenche pas. Ma question est donc comment puis-je déclencher manuellement l'événement DragEnter ?
La solution
On dirait que vous ignorez qu'IDropTarget a une méthode DragOver () que vous devez utiliser en plus de DragEnter (). Si DragEnter () ne commence pas par les coordonnées que vous autorisez, vous devez renvoyer S_OK
avec le paramètre pdwEffect défini sur DROPEFFECT_NONE
, puis laisser DragOver () poursuivre son exécution. vérification des coordonnées par la suite.
De plus, comme vous souhaitez uniquement faire glisser un contrôle sur un contrôle spécifique, vous devez appeler RegisterDragDrop () pour chacun de ces contrôles (en supposant qu'il s'agisse de descendants de TWinControl), et non pour TForm lui-même.