我是德尔福程序员,我有一个问题。我使用TStyleManager创建一个表单,并在我的应用程序上使用外观。但我也想在我的应用程序中使用Drag-n-Drop文件。我怎么能意识到这一点?我尝试了很多方法,但是......我无法做到。希望你的帮助
答案 0 :(得分:5)
当您更改vcl样式时,将重新创建窗体的句柄,因此,如果在设置样式之前调用DragAcceptFiles
函数,则在应用样式时使用的句柄将不同。修复它以这种方式执行DragAcceptFiles函数。
TStyleManager.SetStyle(StyleName);
Application.ProcessMessages;//process the message queue;
DragAcceptFiles( Handle, True );
答案 1 :(得分:0)
使用shellApi单元的方法DragAcceptFiles
来实现您的需求。它需要2个参数,第一个是Application的句柄,第二个是布尔值,用于指定是否切换开 - 关拖动功能。开启使用像DragAcceptFiles(Self.Handle,True);
要响应拖放文件,请使用
Procedure TForm1.RespondToMessage(var Msg : TMsg;var handled : Boolean) ;
const
FileIndex : Cardinal = Cardinal(-1); { return a count of dropped files }
BuffLen = 255;
Var
FileNum : Word;
FName : String;
BuffArr : Array[0..MAX_PATH-1] of Char;
Begin
If Msg.message = WM_DROPFILES Then
Begin
For FileNum := 0 To DragQueryFile(Msg.wParam,FileIndex,Nil,BuffLen)-1 Do // first time , FileIndex is 0xFFFFFFFF , so
// the return is the number of files to be dragged
// Here the return in fileIndex is the no of files;
Begin
DragQueryFile(Msg.wParam, FileNum , BuffArr , BuffLen);
FName := StrPas(BuffArr);
//AddButton(FName); -- do whatever operation you want with the fileName
End;
Try
DragFinish(Msg.wParam); // Free the memory given to drag operation
Except
End;
Handled := True;
//AddScrollIfRequired;
End;
End;
现在加入Application.OnMessage := RespondToMessage
以阻止阻力&放弃操作。
希望有所帮助