9.2 Étapes générales pour développer des fonctions de glisser-déposer
Le glisser-déposer est une fonction qui facilite le fonctionnement des objets fournis par Windows, et peut être facilement développé à Delphi.
sortir. Selon le processus d'opération de glisser-déposer, les étapes de développement peuvent être divisées en quatre étapes, à savoir:
● Démarrer l'opération de traînée
● Recevez des articles de glissement
● Déposez l'élément de glisser
● Arrêtez de faire glisser le fonctionnement
Au cours du processus d'introduction, nous combinerons un exemple de l'opération de glisser-déposer de tabset (tagged set). La conception de l'interface est représentée sur la figure.
Lorsque l'utilisateur fait glisser une balise à la position d'une autre balise lors de l'exécution, la balise se déplacera vers cet emplacement et provoquera
Réarrangement de l'ensemble d'étiquettes.
9.2.1 Commencez à faire glisser
Lorsque DragMode est réglé sur Dmautomatic, faites glisser automatiquement lorsque l'utilisateur appuie sur la souris sur le contrôle source
START; Lorsque vous êtes réglé sur DMMANUAL, décidez de commencer à glisser en manipulant les événements de la souris. Si vous voulez commencer à faire glisser
Utilisez la méthode Begindrag.
Dans Tabset Drag and Drop, nous utilisons le traitement des événements MousDown ci-dessous pour commencer à glisser une balise.
Tout d'abord, déterminez si le bouton gauche appuyé est le bouton gauche, puis déterminez si l'élément est légal.
Procédure tform1.tabset1mousedown (expéditeur: tobject; bouton: tmouseButton;
Shift: tshiftstate; x, y: entier);
var
Dragitem: entier;
Commencer
Si bouton = mbleft alors
Commencer
DragItem: = TabSet1.ItematPos (point (x, y));
if (dragitem> -1) et (dragitem <tabset1.tabs.Count) puis
TabSet1.begIndrag (false);
fin;
fin;
9.2.2 Recevoir des articles traînés
La question de savoir si un contrôle peut recevoir des éléments de glisser est déterminé par l'événement Ondragover du contrôle. Dans Tabset qui traîne, l'essentiel est d'utiliser la position de la souris pour juger.
Procédure tform1.tabset1dragover (expéditeur, source: tobject; x, y: entier;
État: tdragstate; var accepte: booléen);
var
Droppos: entier;
Commencer
Si source = tabset1 alors
Commencer
DropS: = tabset1.itematPos (point (x, y));
Accepter: = (droppos> -1) et (droppos <> tabset1.tabindex) et
(Droppos <tabset1.tabs.Count);
fin;
autre
Accepter: = false;
fin;
9.2.3 Mettez l'élément de traînée
Lorsque le traitement de l'événement Ondragover renvoie, acceptez True et que l'élément est supprimé, l'événement Ondragdrop
Le processus de traînée et de supprimer la réponse. Dans l'instance de glisser-déposer de Tabset, il s'agit de modifier la position de la balise.
Procédure tform1.tabset1dragdrop (expéditeur, source: tobject; x, y: entier);
var
Oldpos: entier;
Newpos: entier;
Commencer
Si source = tabset1 alors
Commencer
Oldpos: = tabset1.tabindex;
Newpos: = tabset1.itematPos (point (x, y));
if (newpos> -1) et (newpos <> oldpos) alors
Tabset1.tabs.move (OldPos, newPos);
fin;
fin;
9.2.4 Fonction de traînée de fin
Il existe deux façons de mettre fin à l'opération de glisser: soit l'utilisateur libère la clé de la souris, soit le programme utilise la méthode Enddrag.
Traînée d'abandon forcée. Il y a deux conséquences de la fin de l'opération de traînée: la goutte est acceptée ou la chute est ignorée.
Une fois l'opération de traînée terminée, le contrôle de la source recevra un message pour répondre à l'événement Drag End OneNDRAG.
9.3 Exemple de l'application glisser et déposer: glisser-déposer la prise en charge du gestionnaire de fichiers
Bien que l'exemple d'application de gestionnaire de fichiers développé dans le chapitre 6 ait commencé à prendre forme en fonction, il est opérationnel
Par rapport au gestionnaire de fichiers de Windows, il y a encore de nombreuses lacunes. Le plus gros inconvénient est qu'il ne prend pas en charge le mouvement de glisser-déposer des fichiers
et glisser et déposer une copie. À la fin de ce chapitre, nous pouvons compenser ce défaut.
Le mouvement de glisser-déposer du fichier fait référence au fichier lorsque l'utilisateur fait glisser un fichier vers un répertoire sous l'arborescence du répertoire et le laisse tomber.
Il se déplace automatiquement vers ce répertoire;
Lorsque vous le mettez et le déposez, le fichier sera automatiquement copié dans le répertoire actuel du lecteur. Boîte de liste de fichiers comme contrôle source et
L'arbre de répertoire et l'étiquette d'entraînement du contrôle cible peuvent être situés dans différents sous-fenêtres. Le répertoire actuel du lecteur est tout sous-marin
La dernière opération en résultat de la fenêtre, que cette sous-fenêtre ait une relation avec la source de glisser et la cible de drag.
Afin d'implémenter les fonctions ci-dessus, il y a deux problèmes qui doivent être résolus en premier:
1.Comment enregistrer le répertoire actuel de chaque lecteur?
Pour cela, nous définissons une variable globale:
var currentDirlist: array [0 ... 25] de String [70];
Dans l'événement Onchange de Directoryoutline:
procédure tfmform.directoryoutlineChange (expéditeur: tobject);
Commencer
CreateCaption;
FileList.Clear;
FileList.Directory: = DirectoryOutLine.Directory;
FileList.update;
CurrentDirlist [DRIVETABSET.TABINDEX]: = DirectoryOutLine.Directory;
FileManager.DirectoryPanel.Caption: = DirectoryOutLine.Directory;
fin;
Parce que DriveTabset répond à l'événement ONClick avant de répondre à l'événement Ondragdrop et est activé par l'événement
Envoyez l'événement OnChange de DirectoryOutline, afin qu'il puisse être garanti d'être utilisé dans l'événement Ondragdrop à tout moment
L'élément de tableau CurrentDirlist n'est pas une chaîne vide.
2. Comment assurer la non-pertinence du mouvement et de la copie avec des sous-fenêtres?
Un problème clé ici est que lorsque nous jugeons le contrôle source, nous utilisons l'opérateur IS pour effectuer la vérification de type:
Si la source est tfilelist, alors…
Si nous utilisons l'énoncé suivant:
Si source = fileList alors
…
Ensuite, les opérations de mouvement et de copie seront limitées à l'étendue de cette sous-fenêtre.
Lorsque nous avons résolu la question ci-dessus, notre travail ne faisait que suivre les étapes de développement générales de la traînée et de la chute, et nous l'avons terminée étape par étape.
1.Filelist commence à traîner l'opération
Procédure tfmform.FileListMousedown (Sender: TObject; Bouton: TMouseButton;
Shift: tshiftstate; x, y: entier);
Commencer
Si bouton = mbleft alors
avec l'expéditeur comme tfilelistbox
Commencer
Si itemAtpos (point (x, y), vrai)> = 0 alors
Begindrag (faux);
fin;
fin;
ItemAtPos est utilisé pour vérifier s'il y a actuellement un fichier. La méthode Begindrag passe le paramètre faux, permettant à FileList de gérer les événements de la souris séparément sans commencer à glisser. En fait, cette situation existe en grande quantité.
2. DirectoryoutLine et DrivetAbset décident d'accepter la traînée et de le mettre sur place.
procédure tfmform.directoryoutLinedRagover (expéditeur, source: tobject; x,
Y: INTEGER; État: TDragstate;
Commencer
Si la source est tfilelistbox alors
Accepter: = true;
fin;
Procédure tfmform.DrivetAbsetDragover (expéditeur, source: tobject; x,
Y: INTEGER; État: TDragstate;
var
Propost: entier;
Commencer
Si la source est tfilelistbox alors
avec DrivetAbset do
Commencer
ProPOS: = itemAtPos (point (x, y));
Accepter: = (propos> -1) et (propost <tabs.Count);
fin;
fin;
DirectoryOutline est une acceptation inconditionnelle, tandis que DriveTabset doit vérifier s'il s'agit d'une étiquette légale.
3. Réponse de glisser-déposer
DirectoryOutline glisser and Drop est utilisé pour implémenter la fonction de mouvement de fichier. Appeler l'événement confirmchange dans le programme
Pendant le processus de traitement, le chemin cible est obtenu par DirectoryOutLine.items [getItem (x, y)]. FullPath.
Procédure tfmform.directoryoutLinedRagdrop (expéditeur, source: tobject; x,
Y: entier);
Commencer
Si la source est tfilelistbox alors
avec Directoryoutline faire
Commencer
ConfirmChange ('Move', FileList.FileName, Items [getItem (x, y)]. FullPath);
fin;
fin;
DrivetAbset glisser and Drop est utilisé pour implémenter la fonction de copie de fichiers. Convertir la position actuelle en pilote correspondant dans le programme
La lettre de l'actionneur, le chemin cible est obtenu par CurrentDirlist [DIVETABSET.TABINDEX].
Procédure tfmform.DrivetAbsetDragDrop (Sender, Source: Tobject; X, Y: entier);
var
APOINT: TPoint;
Commencer
ApOrt.x: = x; apoint.y: = y;
DRIVETABSET.TABINDEX: = DRIVETABSET.ITEMATPOS (APOINT);
Si la source est tfilelistbox alors
avec DrivetAbset do
Commencer
Si CurrentDirlist [Tabindex] <> '' alors
ConfirmChange ('copy', theFileName, currentDirlist [tabindex]);
fin;
fin;
4. Réponse de fileliste pour faire glisser les extrémités et mettre à jour la liste des fichiers
Procédure tfmform.fileListetendDrag (expéditeur, cible: tobject; x, y: entier);
Commencer
Si Target <> nil alors fileList.update;
fin;