Implementar la función de arrastrar y soltar archivos de la aplicación
Hay muchos controles en Delphi que admiten operaciones de arrastrar y soltar, pero solo dentro de la aplicación, y no pueden arrastrar y soltar archivos desde el entorno de Windows a la aplicación. Este artículo presentará cómo escribir soporte. archivos en Delphi La aplicación de arrastrar y soltar utiliza principalmente funciones API de Windows, por lo que también puede usarse como referencia para usuarios de otros idiomas.
Lo primero que debemos explicar son las siguientes tres funciones API. En aras de la generalidad, la descripción de la función utiliza el formato de lenguaje C,
1.VOIDDragAcceptFiles(HWNDhWnd,
BOOLfAccept);
La función DragAcceptFiles se utiliza para inicializar arrastrar y soltar archivos, su primer parámetro hWnd especifica el identificador del formulario de destino. El segundo parámetro fAccept es una variable booleana. Cuando es Verdadero, el formulario señalado por hWnd puede aceptar archivos de arrastrar y soltar.
2.UINTDragQueryFile(HDROPhDrop,
UINTiFile,
LPTSTRlpszFile,
UINTcch)
La función DragQueryFile se utiliza para consultar el El nombre de archivo del archivo de arrastrar y soltar y su propio valor de retorno es un entero sin signo, y el parámetro hDrop es un identificador de una estructura de datos que almacena el nombre del archivo arrastrado y soltado, es decir, el identificador del archivo. búfer de nombre, que debe obtenerse del mensaje de Windows WM_DROPFILES. iFile indica el número de serie del archivo a consultar, que tiene dos. Hay dos formas de obtener el valor: 1. Cuando el valor es un número hexadecimal FFFFFFFF, el el valor de retorno de DragQueryFile es el número de archivos arrastrados y soltados 2. Cuando el valor está entre 0 y el número total de archivos arrastrados y soltados, la función DragQueryFile devuelve los archivos con el número de serie correspondiente. señalado por el parámetro lpszFile Si el valor de lpszFile es NULL en este momento, DragQueryFile devolverá la longitud del nombre del archivo correspondiente. El parámetro cch determina la longitud del búfer. Dado que Windows95 admite nombres de archivos largos, su valor no se puede establecer. demasiado pequeño.
3.VOIDDragFinish(HDROPhDrop);
Utilice la función DragFinish para indicarle a Windows que la operación de arrastrar y soltar ha finalizado y dejar que libere el búfer de nombre de archivo. Sus parámetros hDrop y DragQueryFiles Lo mismo en la función también se obtiene mediante el parámetro hDrop del mensaje de Windows WM_DROPFILES.
A continuación se ilustrarán los pasos de programación específicos con un ejemplo que escribí. Memo control memo1 se coloca en el formulario. En Windows, seleccione varios archivos y arrástrelos a la ventana del programa. El número total de archivos seleccionados y los nombres respectivos de cada archivo se mostrarán en memo1. /p>
unitUnit1;
interfaz
usa
Windows,Mensajes,SysUtils,Clases,
Gráficos,Controles, Formularios, Diálogos,
StdCtrls ;
tipo
TForm1=clase(TForm)
Memo1:TMemo;
procedureFormCreate(Remitente:TObject);
procedureLabel3Click(Remitente:TObject);
procedureLabel4Click(Remitente:TObject);
privado
PROCEDUREFinishDropped(VARMsg:TMessage);
MessageWM_DropFiles;
{Privatedeclar
aciones}
públicas
{Declaraciones públicas}
end;
var
Form1:TForm1; p> p>
implementación
usashellapi;
{$R*.DFM}
pro ureTForm1.FormCreate(Sender:TObject); p>
comenzar
//initializethedragprocess;
DragAcceptFiles(Handle,True);
end;
ProcedureTForm1.FinishDropped (VARMsg :TMessage);
Var
hDrop:THandle;
iFile:Uint;
lpszFile:pchar;
CountOfFiles:integer;
FileIndex:integer;
ReSults:string;
comenzar
hDrop:=Msg. WParam;
getmem(pchar,255);
iFile:=$FFFFFFFF;
CountOfFiles:=DragQueryFile(hDrop,iFile,lpszFile,254);
p>
Resultados:=;
forFileIndex:=0CountOfFiles-1do
comenzar
iFile:=FileIndex;
ArrastrarArchivoQuery (hDrop,iFile,lpszFile,254);
//Obtener los nombres de archivo por orden;
Resultados:=Resultados+#13#1lpszFile;
end;
end p>
Dispose(lpszFile);
memo1.Clear;
memo1.lines.add(drag+IntToStr
(CountOfFiles)+ archivos:+Resultados);
DragFinish(hDrop);
end;
end.
Como se puede ver en el código anterior, en primer lugar, DragAccepteFiles debe usarse en el evento OnCreate del formulario para indicar que el formulario del programa admite la función de arrastrar y soltar archivos.
En Además, además de llamar a las tres funciones API anteriores, los mensajes para WM_DROPFILES también deben escribirse en Delphi. En el proceso FinishDropped, se intercepta WM_DROPFILES y el identificador del búfer de nombre de archivo se puede obtener de su wParam.
En el proceso FinishDropped, hay dos funciones DragQueryFile. El parámetro iFile de la primera es $FFFFFFFF, y obtenemos el número total de archivos de arrastrar y soltar. El segundo parámetro iFile es el número de serie de cada archivo. y el nombre del archivo correspondiente se puede obtener en lpszFile. Por supuesto, para comparar claramente el impacto del valor iFile en la función DragQueryFile, el código aquí no es lo suficientemente conciso. Una cosa a tener en cuenta es que lpszFile es una variable de tipo Pchar. Para ejecutar el programa de forma segura, debe usar el proceso getmem para asignarle memoria antes de usarlo y luego usar el proceso de eliminación para liberarlo después de su uso. Al final del proceso FinishDropped, use la función DragFinish para liberarlo. búfer de nombre de archivo.