Sign in Join
Wiki copytemporary

LCL Drag Drop/fr: what changed

Revision 3 to 4. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-Guide de DoDi pour glisser(drag), déplacer(drop), déposer(Dock)
1+## Guide de DoDi pour glisser(drag), déplacer(drop), déposer(Dock)
22
3-Les contrôles dans un GUI peut être attrapée avec la souris, déplacés vers d'autres endroits, et déposés par dessus d'autres contrôles ou sur le bureau. Lorsque le contrôle glissé est déplacé vers un emplacement différent, l'opération est appelée [[LCL Drag Dock|"glisser déposer"]]. Par ailleurs, le contrôle source et le contrôle cible peuvent échanger des informations ou interagir de toute autre manière, ce qu'on appelle une opération de "glisser-déposer".
3+Les contrôles dans un GUI peut être attrapée avec la souris, déplacés vers d'autres endroits, et déposés par dessus d'autres contrôles ou sur le bureau. Lorsque le contrôle glissé est déplacé vers un emplacement différent, l'opération est appelée [[LCL Drag Dock|"glisser déposer"]]. Par ailleurs, le contrôle source et le contrôle cible peuvent échanger des informations ou interagir de toute autre manière, ce qu'on appelle une opération de "glisser-déposer".
44
5-Mais tout cela ne fonctionne pas de lui-même, une application doit configurer les opérations permises de sorte que la bibliothèque LCL puisse savoir ce qu'il faut faire avec chaque contrôle simple dans un GUI. Les opérations sophistiquées exigent davantage de code pour la gestion du retour visuel à l'utilisateur de l'application, et ce qui va se passer quand le contrôle glissé sera finalement déposé.
5+Mais tout cela ne fonctionne pas de lui-même, une application doit configurer les opérations permises de sorte que la bibliothèque LCL puisse savoir ce qu'il faut faire avec chaque contrôle simple dans un GUI. Les opérations sophistiquées exigent davantage de code pour la gestion du retour visuel à l'utilisateur de l'application, et ce qui va se passer quand le contrôle glissé sera finalement déposé.
66
77## Glisser Déplacer
88
9-C'est seulement une action de glisser simple et originale. Les acteurs sont:
9+C'est seulement une action de glisser simple et originale. Les acteurs sont:
1010
11-- Un contrôle d'origine que l'on peut glisser dans le GUI
12-- Un objet qui glisse, dérivés de TDragObject
13-- des fonctions d'aide
14-- des événements
11+ * Un contrôle d'origine que l'on peut glisser dans le GUI
12+ * Un objet qui glisse, dérivés de TDragObject
13+ * des fonctions d'aide
14+ * des événements
1515
16-Maintenant, jetons un œil à la manière dont ils travaillent ensemble, basé sur l'implémentation initiale en Delphi pour plus de clarté. L'implémentation de la bibliothèque LCL est quelque peu différente dans l'utilisation des objets d'aide, les détails seront discutés plus loin.
16+Maintenant, jetons un œil à la manière dont ils travaillent ensemble, basé sur l'implémentation initiale en Delphi pour plus de clarté. L'implémentation de la bibliothèque LCL est quelque peu différente dans l'utilisation des objets d'aide, les détails seront discutés plus loin.
1717
1818### La source de glissement
1919
20-Un contrôle peut être rendu déplaçable en fixant sa propriété **DragMode** à **dmAutomatic**. Lorsque l'utilisateur appuie avec le bouton gauche de la souris sur un tel contrôle, le pointeur de la souris change en un indicateur de glissement jusqu'à ce que l'utilisateur relâche le bouton, ou annule l'opération en appuyant sur la touche Escape. L'indicateur suit désormais les mouvements de la souris et change sa forme, conformément à ce qui se passera lorsque le contrôle sera déplacé sur l'emplacement du moment.
20+Un contrôle peut être rendu déplaçable en fixant sa propriété **DragMode** à **dmAutomatic**. Lorsque l'utilisateur appuie avec le bouton gauche de la souris sur un tel contrôle, le pointeur de la souris change en un indicateur de glissement jusqu'à ce que l'utilisateur relâche le bouton, ou annule l'opération en appuyant sur la touche Escape. L'indicateur suit désormais les mouvements de la souris et change sa forme, conformément à ce qui se passera lorsque le contrôle sera déplacé sur l'emplacement du moment.
2121
22-Le glissement peut également être lancé dans le code, en appelant la source.BeginDrag. Dans les deux cas, la procédure d'aide DragInitControl est appelé pour démarrer le glissement. Le contrôle initial lève un évènement StartDrag, là où l'application peut fournir un objet de glissement usuel. En cas d'absence d'un tel objet, un objet par défaut est créé. Des structures de données internes pour la rétroaction visuelle et plus sont initialisées. Alors DragTo et appelée pour montrer que le glissement a commencé.
22+Le glissement peut également être lancé dans le code, en appelant la source.BeginDrag. Dans les deux cas, la procédure d'aide DragInitControl est appelé pour démarrer le glissement. Le contrôle initial lève un évènement StartDrag, là où l'application peut fournir un objet de glissement usuel. En cas d'absence d'un tel objet, un objet par défaut est créé. Des structures de données internes pour la rétroaction visuelle et plus sont initialisées. Alors DragTo et appelée pour montrer que le glissement a commencé.
2323
2424### L'objet qui glisse
2525
26-A drag object receives all user input while dragging. In the default implementation it reacts by calling either DragTo or finally DragDone.
26+Un objet de glissement reçoit toutes les entrées utilisateur pendant le glissement. Dans l'implémentation par défaut, il réagit en appelant soit **DragTo** soit finalement **DragDone**.
2727
28-The drag object also is responsible for the visual feedback:
28+L'objet de glissement est également responsable du retour visuel :
2929
30-- GetDragCursor returns the mouse pointer shape.
31-- GetDragImages returns a list of drag images, to be attached to the mouse pointer.
32-- ShowDragImage and HideDragImage implement the visual feedback.
30+ * **GetDragCursor** renvoie la forme du pointeur de la souris.
31+ * **GetDragImages** renvoie une liste d'images de glissement, à attacher au pointeur de la souris.
32+ * **ShowDragImage** et **HideDragImage** implémentent le retour visuel.
3333
34-The Finished method notifies the source control when dragging stops. In case of a cancel'd operation it invokes source.DragCanceled, followed by source.DoEndDrag in either case, which raises an EndDrag event.
34+La méthode Finished notifie le contrôle source lorsque le glissement s'arrête. En cas d'annulation de l'opération, il invoque source.DragCanceled, suivi par source.DoEndDrag dans les deux cas, ce qui déclenche un événement EndDrag.
3535
3636#### LCL Modifications
3737
38-The current LCL implementation has removed input processing from the drag object, so that the application can no more customize the UI. And the LCL implementation is far from being okay :-(
38+L'implémentation actuelle de LCL a supprimé le traitement des entrées de l'objet de glissement, de sorte que l'application ne peut plus personnaliser l'interface utilisateur. Et l'implémentation LCL est loin d'être satisfaisante :-(
3939
40-Also the drag object is bypassed in the presentation of the visual feedback.
40+De plus, l'objet de glissement est contourné dans la présentation du retour visuel.
4141
4242### Helper Functions
4343
44-Helper functions primarily allow for access to protected properties and methods of the controls and other classes, from outside the Controls unit. They also can perform common tasks, and can encapsulate platform specific and other implementation details.
44+Les fonctions d'aide permettent principalement d'accéder aux propriétés et méthodes protégées des contrôles et autres classes, depuis l'extérieur de l'unité Controls.
4545
46+Elles peuvent également effectuer des tâches courantes, et encapsuler des détails d'implémentation spécifiques à la plateforme.
47+
4648#### General Helpers
4749
48-**DragTo** determines the current drag target, sends notifications to the involved controls, and manages the visual feedback. It also handles the delayed start of a dragging operation, i.e. can wait for the mouse moving away far enough from the starting point.
50+ * **DragTo** détermine la cible actuelle du glissement, envoie des notifications aux contrôles impliqués, et gère le retour visuel.
51+Elle gère également le démarrage différé d'une opération de glissement, c'est-à-dire qu'elle peut attendre que la souris s'éloigne suffisamment du point de départ.
4952
50-**DragDone** terminates dragging, either with a drop or cancel of the operation.
53+ * **DragDone** termine le glissement, soit par un dépôt, soit par une annulation de l'opération.
5154
52-**CancelDrag** is protected against false calls, otherwise it defers further actions to DragDone.
55+ * **CancelDrag** est protégé contre les appels erronés, sinon il reporte d'autres actions à **DragDone**.
5356
57+
58+
5459#### Special Helpers
5560
56-Some more public helper procedures exist, which are undocumented in Delphi and are not required for customized dragging operations.
61+Il existe quelques procédures d'aide supplémentaires, qui sont non documentées dans Delphi et ne sont pas nécessaires pour les opérations de glissement personnalisées.
5762
58-**DragFindWindow** searches for a drag target window (platform specific).
63+ * **DragFindWindow** recherche une fenêtre cible de glissement (spécifique à la plateforme).
5964
60-**DragInit** initializes the internal management, like mouse capture, and the visual feedback.
65+ * **DragInit** initialise la gestion interne, comme la capture de la souris, et le retour visuel.
6166
62-**DragInitControl** creates the drag object, then calls DragInit.
67+ * **DragInitControl** crée l'objet de glissement, puis appelle DragInit.
6368
64-**SetCaptureControl** handles the mouse capture.
69+ * **SetCaptureControl** gère la capture de la souris.
6570
66-### Events
71+
6772
73+### Événements
74+
6875#### OnStartDrag/Dock
6976
70-This event occurs when the operation starts. The handler can provide a custom DockObject for the operation.
77+Cet événement se produit lorsque l'opération commence. Le gestionnaire peut fournir un **DockObject** personnalisé pour l'opération.
7178
7279#### OnDrag/DockOver
7380
74-This event notifies a possible target, when an object is dragged over it. The handler can signal to accept or reject an drop.
81+Cet événement notifie une cible potentielle lorsqu'un objet est glissé au-dessus. Le gestionnaire peut signaler pour accepter ou rejeter un dépôt.
7582
76-The event signals not only mouse moves, but also when the mouse enters or leaves a target control.
83+L'événement signale non seulement les mouvements de la souris, mais aussi lorsque la souris entre ou quitte un contrôle cible.
7784
78-An OnDockOver event occurs on the DockSite, not on the target control under the mouse. The handler can signal to deny an drop, and can adjust the visual feedback. The event occurs when the mouse enters or leaves a control, and with every single movement of the mouse.
85+Un événement OnDockOver se produit sur le DockSite, non sur le contrôle cible sous la souris. Le gestionnaire peut signaler pour refuser un dépôt, et peut ajuster le retour visuel. L'événement se produit lorsque la souris entre ou quitte un contrôle, et à chaque mouvement de la souris.
7986
8087#### OnDrag/DockDrop
8188
82-This event notifies the target control of the end of a drag operation.
89+Cet événement notifie le contrôle cible de la fin d'une opération de glissement.
8390
8491#### OnEndDrag/Dock
8592
86-This event notifies the source control of the end of a drag operation.
93+Cet événement notifie le contrôle source de la fin d'une opération de glissement.
8794
88-### Docking specific Events
95+
8996
90-(this section should be moved to docking topic)
97+### Événements spécifiques au Docking
9198
99+(cette section devrait être déplacée dans le sujet docking)
100+
92101#### OnGetSiteInfo
93102
94-This event occurs during the search for a qualifying dock site. Multiple dock sites can overlap each other, reside in overlapping windows, or can be invisible. Every candidate must supply an influence rectangle (catching area), and can signal to reject an drop. The drag manager selects the most appropriate dock site as the target for subsequent OnDockOver events.
103+Cet événement se produit pendant la recherche d'un site de docking qualifié. Plusieurs sites de docking peuvent se chevaucher, résider dans des fenêtres superposées, ou être invisibles. Chaque candidat doit fournir un rectangle d'influence (zone de capture), et peut signaler pour refuser un dépôt. Le gestionnaire de glissement sélectionne le site de docking le plus approprié comme cible pour les événements OnDockOver suivants.
95104
96105#### OnUnDock
97106
98-This event occurs when the dragged control has to be removed from its host dock site.
107+Cet événement se produit lorsque le contrôle glissé doit être retiré de son site de docking hôte.
99108
100-It's unclear what should happen when the handler denies to undock the control.
109+Il est incertain de ce qui doit se passer lorsque le gestionnaire refuse de dédocking le contrôle.
101110
102-## LCL Implementation
111+
103112
104-The Delphi implementation of dragging has many flaws, in detail with regards to docking. Until now nobody seems to understand the details of the Delphi dragging model, most code was copied from the VCL and consequently implements exactly the same misbehaviour. This section, and more important the docking specific page, shall shed some light on the dragging model in general and the severe design and implementation flaws in the Delphi implementation.
113+## Implémentation LCL
105114
106-The current LCL implementation uses a DragManager object and drag/dock performers instead of helper functions. The reason for this breaking change is unclear - who can explain?
115+L'implémentation de **Delphi** du glissement a de nombreux défauts, en détail en ce qui concerne le docking.
107116
108-While the Delphi model must be provided for compatibility reasons, the introduction of a DragManager class and object (singleton) allows for the implementation of an alternative drag manager, with improved behaviour, and allows an application to select the most appropriate manager.
117+Jusqu'à présent, personne ne semble comprendre les détails du modèle de glissement de **Delphi** , la plupart du code a été copié de la VCL et implémente donc exactement le même comportement erroné.
109118
119+Cette section, et plus important la page spécifique au docking, doivent éclairer le modèle de glissement en général et les défauts de conception et d'implémentation sévères dans l'implémentation de **Delphi**.
120+
121+L'implémentation actuelle de LCL utilise un objet **DragManager** et des **Drag Performers/docking** au lieu de fonctions d'aide. La raison de ce changement radical est incertaine - qui peut expliquer?
122+
123+Alors que le modèle de **Delphi** doit être fourni pour des raisons de compatibilité, l'introduction d'une classe et d'un objet **DragManager** (singleton) permet l'implémentation d'un gestionnaire de glissement alternatif, avec un comportement amélioré, et permet à une application de sélectionner le gestionnaire le plus approprié.
124+
110125### DragManager
111126
112-This object handles the captured input, provides helper methods, and stores dragging and docking parameters.
127+Cet objet gère les entrées capturées, fournit des méthodes d'aide, et stocke les paramètres de glissement et de docking.
113128
114-It's questionable whether the drag object shall not be allowed to handle user input. It makes the system safer, but disallows applications to extend the user interface for specific dragging operations.
129+Il est discutable que l'objet de glissement ne soit pas autorisé à gérer les entrées utilisateur. Cela rend le système plus sûr, mais empêche les applications d'étendre l'interface utilisateur pour des opérations de glissement spécifiques.
115130
116-The helper methods require different calls, but this is harmless as long as they are only called from LCL components.
131+Les méthodes d'aide nécessitent des appels différents, mais cela est inoffensif tant qu'elles ne sont appelées que par les composants LCL.
117132
118-More critical is the storage of dragging parameters in the DragManager object, which vanish when a different drag manager is installed. This is fatal in case of the list of registered dock sites :-(
133+Plus critique est le stockage des paramètres de glissement dans l'objet **DragManager** , qui disparaissent lorsqu'un autre gestionnaire de glissement est installé. Cela est fatal en cas de liste des sites de docking enregistrés :-(
119134
120135### Drag Performers
121136
122-The internal use of different classes for dragging and docking is okay in so far, as the procedures differ significantly between drag-drop and drag-dock operations. Nonetheless common actions should use common code, e.g. inherited from the common base class.
137+L'utilisation interne de différentes classes pour le glissement et le docking est acceptable dans la mesure où les procédures diffèrent de manière significative entre les opérations de glissement-déplacement et de glissement-docking. Néanmoins, les actions communes devraient utiliser du code commun, par exemple hérité de la classe de base commune.
123138
124-## Message Sequence Chart or UML Sequence Diagram
139+
125140
126-Provided by Tom Verhoeff
141+## Message Sequence Chart or UML Sequence Diagram
127142
128-Something along the lines (this is for Delphi; view with monospaced font):
143+Fourni par Tom Verhoeff
129144
130-``` pascal
131- Main Drag (Optional) Drag
132- User Event Source Drag Target
133- (Mouse) Loop Control Object Control
134- = = = =
135- | | | |
136- 1|--MouseDown--->| | |
137- | 2#--OnMouseDown->| |
138- | | 3# |
139- | 4#<-BeginDrag()--# |
140- | # # |
141- | | | |
142- | 5#--OnStartDrag->| |
143- | # 6#----Create---->= |
144- | | # | |
145- 7|--MouseMove--->| | | |
146- | 8#-----------------------------------OnDragOver->|
147- | # | | 9#
148- | # | | #
149- | | | | |
150- 10|---MouseUp---->| | | |
151- | 11#-----------------------------------OnDragDrop->|
152- | # | | 12#
153- | # | | #
154- | #---OnEndDrag-->| | |
155- | | 13#----Destroy--->= |
156- | | | |
145+Quelque chose dans ce sens (c'est pour Delphi ; à visualiser avec une police à espacement fixe) :
157146```
147+Main Drag (Optional) Drag
148+ User Event Source Drag Target
149+ (Mouse) Loop Control Object Control
150+ = = = =
151+ | | | |
152+ 1|--MouseDown--->| | |
153+ | 2#--OnMouseDown->| |
154+ | | 3# |
155+ | 4#<-BeginDrag()--# |
156+ | # # |
157+ | | | |
158+ | 5#--OnStartDrag->| |
159+ | # 6#----Create---->= |
160+ | | # | |
161+ 7|--MouseMove--->| | | |
162+ | 8#-----------------------------------OnDragOver->|
163+ | # | | 9#
164+ | # | | #
165+ | | | | |
166+ 10|---MouseUp---->| | | |
167+ | 11#-----------------------------------OnDragDrop->|
168+ | # | | 12#
169+ | # | | #
170+ | #---OnEndDrag-->| | |
171+ | | 13#----Destroy--->= |
172+ | | | |
173+```
158174
159-The DragObject is optional. There could be multiple candidate targets. The Main Event Loop determines which event to send to which object, depending on the user action, the cursor location, and the current state of the GUI.
175+
160176
161-4 somehow triggers 5 (there is a delay depending on the Boolean parameter Immediate to BeginDrag).
177+L'objet DragObject est facultatif. Il pourrait y avoir plusieurs cibles candidates. La boucle principale des événements détermine quel événement envoyer à quel objet, en fonction de l'action de l'utilisateur, de la position du curseur et de l'état actuel de la GUI.
162178
163-6 determines the location of the MouseDown and may use this to decide on what gets dragged (through GetCursorPos, ScreenToClient, MouseToCell). It can call SetDragImage to visualize a thing being dragged.
179+4 déclenche en quelque sorte 5 (il y a un délai en fonction du paramètre booléen Immediate à BeginDrag).
164180
165-The chain 7, 8, 9 can occur repeatedly; 9 indicates acceptability of a drop at this target via the Boolean var parameter Accepted.
181+6 détermine l'emplacement du MouseDown et peut utiliser cela pour décider de ce qui est glissé (via GetCursorPos, ScreenToClient, MouseToCell). Il peut appeler SetDragImage pour visualiser l'élément en cours de glissement.
166182
167-12 is called only if the immediately preceding OnDragOver of this target returned Accepted = True; i.e. Accepted is a precondition of 12.
183+La chaîne 7, 8, 9 peut se répéter ; 9 indique l'acceptabilité d'un dépôt à cette cible via le paramètre booléen var Accepted.
168184
169-13 receives the parameter Target to know where the drop was accepted; if Target = nil, then the drop was cancelled by the user (MouseUp at an unacceptable location), and OnDragDrop was not performed; if Target \<\> nil, then OnDragDrop was already performed at the Target. The work associated with an actual drop is thus divided over the OnDragDrop (for actions at the target) and OnEndDrag (for actions at the source). Since a Drag Object needs to be destroyed, independent of whether the drop was successful or canceled, it is best to call Free (or Destroy) only in the OnEndDrag handler.
185+12 est appelé uniquement si l'événement OnDragOver immédiatement précédent de cette cible a renvoyé Accepted = True ; c'est-à-dire qu'Accepted est une précondition de 12.
170186
171-Only one drag can be active at any moment; it either ends in a drop or is canceled.
187+13 reçoit le paramètre Target pour savoir où le dépôt a été accepté ; si Target = nil, alors le dépôt a été annulé par l'utilisateur (MouseUp à un emplacement inacceptable), et OnDragDrop n'a pas été exécuté ; si Target <> nil, alors OnDragDrop a déjà été exécuté sur la cible. Le travail associé à un dépôt réel est donc divisé entre OnDragDrop (pour les actions sur la cible) et OnEndDrag (pour les actions sur la source). Comme un objet de glissement doit être détruit, indépendamment du succès ou de l'annulation du dépôt, il est préférable d'appeler Free (ou Destroy) uniquement dans le gestionnaire OnEndDrag.
172188
173-There are various other things to be included, but this is the fundamental part. (Maybe also see [Delphi-Central](http://www.delphi-central.com/drag.aspx) or ["Implementing drag-and-drop in controls"](http://www.podgoretsky.com/ftp/Docs/Delphi/D5/dg/controls.html).)
189+Un seul glissement peut être actif à tout moment ; il se termine soit par un dépôt, soit par une annulation.
174190
175-I hope this is helpful. Tom
191+Il y a diverses autres choses à inclure, mais ceci est la partie fondamentale. (Peut-être voir [Delphi-Central](<http://www.delphi-central.com/drag.aspx>) ou ["Implementing drag-and-drop in controls"](<http://www.podgoretsky.com/ftp/Docs/Delphi/D5/dg/controls.html>).)
176192
193+J'espère que cela est utile. Tom
194+
195+## Autres ressources
196+
197+ * [Apprendre le glisser-déposer avec Free Pascal/Lazarus](<https://gilles-vasseur.developpez.com/tutoriels/draganddrop1-techniques-base/>)
198+
177199---
178-*From the Free Pascal wiki, page "LCL Drag Drop/fr", as it stood on 2009-07-15 after a change by Paulatreides, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
200+*From the Free Pascal wiki, page "LCL Drag Drop/fr", as the Internet Archive kept it on 2025-05-16, last changed on 2024-07-25. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history