9.2 Pasos generales para desarrollar funciones de arrastrar y soltar
Drag y Drop es una función que facilita el funcionamiento de los objetos proporcionados por Windows, y se puede desarrollar fácilmente en Delphi.
salga. Según el proceso de operación de arrastrar y soltar, los pasos de desarrollo se pueden dividir en cuatro etapas, a saber:
● Comenzar la operación de arrastre
● Recibir artículos de arrastre
● Deja caer el artículo de arrastre
● Deje de arrastrar la operación
Durante el proceso de introducción, combinaremos un ejemplo de operación de arrastre y caída de Tabset (etiquetado). El diseño de la interfaz se muestra en la figura.
Cuando el usuario arrastra una etiqueta a la posición de otra etiqueta en tiempo de ejecución, la etiqueta se moverá a esa ubicación y causará
Reorganización del conjunto de etiquetas.
9.2.1 Empiece a arrastrar
Cuando DragMode se establece en dmautomatic, arrastre automáticamente cuando el usuario presione el mouse en el control de origen
Comenzar; Si quieres comenzar a arrastrar
Use el método de begindrag.
En Tabset, arrastre y cae, usamos el procesamiento del evento Mousedown a continuación para comenzar a arrastrar una etiqueta.
Primero, determine si el botón izquierdo presionado es el botón izquierdo y luego determine si el elemento es legal.
Procedimiento tForm1.tabset1MousEdown (remitente: tobject; botón: tmouseButton;
Cambio: tshiftstate;
varilla
Dragitem: Integer;
Comenzar
if botón = mbleft entonces
Comenzar
Dragitem: = tabset1.itematpos (punto (x, y));
if (dragitem> -1) y (dragItem <tabset1.tabs.count) entonces
Tabset1.begindrag (falso);
fin;
fin;
9.2.2 Recibe artículos arrastrados
Si un control puede recibir elementos de arrastre está determinado por el evento Ondragover del control. En el arrastre de Tabset, lo principal es usar la posición del mouse para juzgar.
procedimiento tForm1.tabset1dragover (remitente, fuente: tobject; x, y: entero;
Estado: tdragState;
varilla
Droppos: entero;
Comenzar
Si fuente = tabset1 entonces
Comenzar
Droppos: = tabset1.itematpos (punto (x, y));
Aceptar: = (droppos> -1) y (droppos <> tabset1.tabindex) y
(Droppos <tabset1.tabs.count);
fin;
demás
Aceptar: = falso;
fin;
9.2.3 Permitir el artículo de arrastre
Cuando el procesamiento del evento Ondragover devuelve aceptar verdadero y el elemento se elimina, el evento OndragDrop
El proceso de arrastrar y soltar la respuesta. En la instancia de arrastre y soltar de TabSet, es para cambiar la posición de la etiqueta.
procedimiento tform1.tabset1dragDrop (remitente, fuente: tobject; x, y: entero);
varilla
OldPos: entero;
Newpos: entero;
Comenzar
Si fuente = tabset1 entonces
Comenzar
OldPos: = tabset1.tabindex;
Newpos: = tabset1.itematpos (punto (x, y));
if (newpos> -1) y (newpos <> OldPos) entonces
Tabset1.tabs.move (OldPos, Newpos);
fin;
fin;
9.2.4 Operación de arrastre final
Hay dos formas de finalizar la operación de arrastre: el usuario libera la tecla del mouse o el programa utiliza el método EndDrag.
Drag de abortes forzados. Hay dos consecuencias para finalizar la operación de arrastre: se acepta la caída o se ignora la caída.
Una vez completada la operación de arrastre, el control de origen recibirá un mensaje para responder al evento Drag End OnEdDrag.
9.3 Ejemplo de la aplicación de arrastre y soltar: arrastre y suelte el soporte para el administrador de archivos
Aunque el ejemplo de la aplicación del administrador de archivos desarrollado en el Capítulo 6 ha comenzado a tomar forma en la función, está operativo
En comparación con el Administrador de archivos de Windows, todavía hay muchas deficiencias. El mayor inconveniente es que no es compatible con el movimiento de arrastre y suelto de los archivos
y arrastrar y soltar copia. Al final de este capítulo, podemos compensar este defecto.
El movimiento de arrastrar y soltar el archivo se refiere al archivo cuando el usuario arrastra un archivo a un directorio en el árbol de directorio y lo deja caer.
Se moverá automáticamente a este directorio;
Cuando lo ponga y lo suelte, el archivo se copiará automáticamente al directorio actual de la unidad. Cuadro de lista de archivos como control de origen y
El árbol de directorio y la etiqueta de accionamiento del control objetivo se pueden ubicar en diferentes subventucas. El directorio actual de la unidad es cualquier sub.
El último resultado de la operación de la ventana, independientemente de si esta subventoria tiene una relación con la fuente de arrastre y el objetivo de arrastre.
Para implementar las funciones anteriores, hay dos problemas que deben resolverse primero:
1. ¿Cómo registrar el directorio actual de cada unidad?
Para esto definimos una variable global:
var CurrentDirlist: Array [0 ... 25] de String [70];
En el evento Onchange de DirectoryOutline:
procedimiento tfmform.DirectoryOutLinEchange (remitente: tobject);
Comenzar
CreateCaption;
Filelist.clear;
FileList.Directory: = DirectoryOutLine.Directory;
Filelist.update;
CurrentDirlist [DriveTabSet.Tabindex]: = DirectoryOutLine.Directory;
Filemanager.directorypanel.caption: = directorioutline.directory;
fin;
Porque Drivetabset responde al evento OnClick antes de responder al evento OndragDrop, y se activa por el evento
Envíe el evento Onchange de DirectoryOutline, por lo que se puede garantizar que se utilice en el evento OndragDrop en cualquier momento
El elemento de matriz CurrentDirlist no será una cadena vacía.
2. ¿Cómo garantizar la irrelevancia del movimiento y la copia con subvestidos?
Una cuestión clave aquí es que cuando juzgamos el control de origen, usamos el operador IS para realizar la verificación de tipo:
Si la fuente es tfileList, entonces ...
Si usamos la siguiente declaración:
Si fuente = filelista entonces
…
Luego, las operaciones de movimiento y copia se limitarán al alcance de esta subventoria.
Cuando resolvimos la pregunta anterior, nuestro trabajo solo siguió los pasos generales de desarrollo de arrastrar y soltar, y la completamos paso a paso.
1.Mefilelist comienza a arrastrar la operación
Procedimiento tfmform.FileListMousEdown (remitente: tobject; botón: tmouseButton;
Cambio: tshiftstate;
Comenzar
if botón = mbleft entonces
con el remitente como tfilelistbox
Comenzar
if itematpos (punto (x, y), true)> = 0 entonces entonces
BegindRag (falso);
fin;
fin;
ItemATPOS se usa para verificar si actualmente hay un archivo. El método de BeginDrag pasa el parámetro falso, lo que permite a Filelist manejar los eventos del mouse por separado sin comenzar a arrastrar. De hecho, esta situación existe en grandes cantidades.
2. DirectoryOutline y Drivetabset deciden si aceptar arrastrando y ponerlo en el acto.
procedimiento tfmform.DirectoryOutLinedRagover (remitente, fuente: tobject; x,
Y: entero;
Comenzar
Si la fuente es tfilelistbox, entonces
Aceptar: = verdadero;
fin;
procedimiento tfmform.DrivetabSetDragover (remitente, fuente: tobject; x,
Y: entero;
varilla
Proppos: entero;
Comenzar
Si la fuente es tfilelistbox, entonces
con drivetabset do
Comenzar
Proppos: = itemAtPos (punto (x, y));
Aceptar: = (Proppos> -1) y (Proppos <Tabs.count);
fin;
fin;
DirectoryOutline es una aceptación incondicional, mientras que Drivetabset necesita verificar si es una etiqueta legal.
3. Arrastre y suelte la respuesta
DirectoryOutline Drag y Drop se usan para implementar la función de movimiento de archivos. Llamar al evento Confirmchange en el programa
Durante el proceso de procesamiento, la ruta objetivo se obtiene mediante DirectoryOutline.Items [getItem (x, y)]. Papath.
procedimiento tfmform.DirectoryOutLinedRagDrop (remitente, fuente: tobject; x,
Y: entero);
Comenzar
Si la fuente es tfilelistbox, entonces
con directorioutline do
Comenzar
Confirmarchange ('mover', filelist.fileName, elementos [getItem (x, y)]. Fullpath);
fin;
fin;
DrivetabSet Drag and Drop se usa para implementar la función de copia de archivos. Convierta la posición actual en el controlador correspondiente en el programa
La carta del actuador, la ruta objetivo es obtenida por CurrentDirlist [Drivetabset.tabindex].
procedimiento tfmform.drivetabsetDragDrop (remitente, fuente: tobject; x, y: entero);
varilla
Apoint: TPoint;
Comenzar
Apoint.x: = x;
Drivetabset.tabindex: = driveTabset.ItemAtPos (apoint);
Si la fuente es tfilelistbox, entonces
con drivetabset do
Comenzar
Si CurrentDirlist [tabindex] <> '' entonces
Confirmarchange ('copy', theFileName, currentDirlist [tabindex]);
fin;
fin;
4. Respuesta de la lista de la línea de la línea de la lista para arrastrar los extremos y actualizar la lista de archivos
procedimiento tfmform.fileListEndDrag (remitente, objetivo: tobject; x, y: entero);
Comenzar
if objetivo <> nil entonces filelist.update;
fin;