Delphi 德尔菲:Vcl风格和;拖放

Delphi 德尔菲:Vcl风格和;拖放,delphi,drag-and-drop,delphi-xe2,vcl-styles,Delphi,Drag And Drop,Delphi Xe2,Vcl Styles,我是一个Delphi程序员,我有一个问题。我用TStyleManager创建一个表单,并在应用程序上使用皮肤。但我也想在我的应用程序中使用拖放文件。我怎么能意识到这一点?我试过很多方法,但是。。。我做不到。希望得到您的帮助使用shellApi单元的方法DragAcceptFiles来实现您所需要的。它需要2个参数,第一个是应用程序的句柄,第二个是布尔值,用于指定是否打开/关闭拖动功能。要启用,请使用类似于DragAcceptFiles(Self.Handle,True)的内容 要响应文件的拖放,

我是一个Delphi程序员,我有一个问题。我用TStyleManager创建一个表单,并在应用程序上使用皮肤。但我也想在我的应用程序中使用拖放文件。我怎么能意识到这一点?我试过很多方法,但是。。。我做不到。希望得到您的帮助

使用shellApi单元的方法
DragAcceptFiles
来实现您所需要的。它需要2个参数,第一个是应用程序的句柄,第二个是布尔值,用于指定是否打开/关闭拖动功能。要启用,请使用类似于
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
以捕获拖放操作。
希望这有助于

使用shellApi单元的方法
DragAcceptFiles
实现您所需要的。它需要2个参数,第一个是应用程序的句柄,第二个是布尔值,用于指定是否打开/关闭拖动功能。要启用,请使用类似于
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
以捕获拖放操作。
希望这有助于

当您更改vcl样式时,表单的句柄将被重新创建,因此,如果您在设置样式之前调用
DragAcceptFiles
函数,则应用样式时使用的句柄将不同。要修复此问题,请以这种方式执行DragAcceptFiles函数

 TStyleManager.SetStyle(StyleName);
 Application.ProcessMessages;//process the message queue;
 DragAcceptFiles( Handle, True );

更改vcl样式时,将重新创建表单句柄,因此如果在设置样式之前调用
DragAcceptFiles
函数,则应用样式时使用的句柄将不同。要修复此问题,请以这种方式执行DragAcceptFiles函数

 TStyleManager.SetStyle(StyleName);
 Application.ProcessMessages;//process the message queue;
 DragAcceptFiles( Handle, True );

你是怎么尝试的?症状是什么?是否已将主窗体的DockSite属性设置为true?OnDockOver和OnDockDrop事件中会发生什么?有关常规拖放解决方案,请参阅。请详细说明您在样式和拖放方面的具体问题是什么。您是如何尝试的?症状是什么?是否已将主窗体的DockSite属性设置为true?OnDockOver和OnDockDrop事件中会发生什么?有关常规拖放解决方案,请参阅。请详细说明你的风格和拖放的具体问题是什么。可能是重复的哦,我知道,我用类似的方式做这件事,但这种方式对皮肤不起作用!这是一个我的问题)我如何能同时使用皮肤和dragndrop@АСаааааааааббаабаабаа?我用Alpha-lite皮肤试过了,效果很好。发布您的代码示例,让我们知道错误所在。哦,对不起。我使用了standart皮肤(我的SDK-Delphi XE2;Vlc.Themes-TStyleManger)。请发布您的代码示例,因为我看不到皮肤和拖放之间的任何关系。顺便说一句,我在delphi 7上测试了它,这不一定,因为当我关闭皮肤时,所有的皮肤都工作得很好哦,我知道它,我用类似的方式做这件事,但是用皮肤这种方式不工作!这是一个我的问题)我如何能同时使用皮肤和dragndrop@АСаааааааабабабб?我用Alpha-lite皮肤试过了,效果很好。发布您的代码示例,让我们知道错误所在。哦,对不起。我使用了standart皮肤(我的SDK-Delphi XE2;Vlc.Themes-TStyleManger)。请发布您的代码示例,因为我看不到皮肤和拖放之间的任何关系。顺便说一句,我在Delphi7上测试了它,这不一定,因为当我关闭皮肤时,所有的皮肤都工作得很好