WM_DROPFILES
似乎很容易处理文件拖放。但它总是在悬停开始时将光标更改为 crDrag
。 WM_DROPFILES
处理程序仅由 drop 事件激活。如果用户想在表单上拖动扩展名不受支持的文件,这是有问题的。
如何在拖动过程中根据文件扩展名更改光标?
如果没有文件具有可接受的扩展名,则应设置为 crNoDrop
。
我写了这个过滤函数,效果很好:
function isAcceptableFileName(fileName_ : string; fileExts_ : array of string ) : boolean
我使用 Delphi 10.3。
答案 0 :(得分:0)
您可以执行一个返回放置事件的过程
procedure DragDropFile2Form(var Msg: TMessage); message WM_DROPFILES;
它的实现可能是这样的。
procedure DragDropFile2Form(var Msg: TMessage);
var
extension: string;
number: Integer;
path: array [0 .. MAX_COMPUTERNAME_LENGTH + MAX_PATH] of Char;
begin
DragQueryFile(Msg.WParam, number, path, 275);
{
if the index value is between zero and the total number of dropped files,
the return value is the required size, in characters.
}
if (FileExists(path)) then
begin
extension := ExtractFileExt(path);
// Extracts the extension part of path like [.jpg, .png, .txt]
if (extension = '.jpg') or (extension = '.png') or (extension = '.txt') then
begin
// ACCEPTED CODE TO DO WHAT YOU WANT WITH THE FILES
end
else
begin
// BLOCKS THE FILE AND SHOWS A MESSAGE
MessageBox(Form1.Handle, PChar('The file is not a image or text'),
PChar('Drag & Drop'), MB_ICONWARNING);
end;
end;
end;
DragFinish(Msg.WParam);
// This frees the resources used to store information about the drop.
end;
您还需要传递用于接收 WM_DROPFILES 消息的表单句柄
procedure FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, True);
end;
不要忘记将 Winapi.ShellAPI 添加到您的用途中
您可以在此处找到更多详细信息:http://swepc.se/blog/2018/08/29/how-to-drag-drop-files-delphi-10/