注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BCB-DG's Blog

...

 
 
 

日志

 
 

TListView接收文件拖放  

2013-07-02 14:24:58|  分类: Delphi |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
//轉
在使用Delphi开发应用程序时常常要使用到TListView列表视控件,但是仅仅使用TListView的原有属性、方法和事件是不够的,常常需要 在程序开发过程中对列表视的功能进行扩展,比如对列表视添加任意列组合排序、ListItem拖动、CustomDraw自绘制、加入背景图等功能,由此 可见Delphi自带的TListView列表视控件功能有限,并不让人感到满意。为了让列表视具有更多的功能,我们只有求助于第三方控件,或者自己编写 代码对TListView进行改造。  
最近我在用Delphi开发一个应用软件的过程中,需要实现让TListView列表视可接收资源管理器或文件管理器文件拖放,并将接收到的文件名和路径 显示在TListView列表视中的功能,一下子找不到可以实现此功能的第三方控件,于是便摸索着自己写代码实现了该功能。现将该功能的实现方法整理出 来,方便大家以后在工作当中需要使用到类似的功能时做为参考。  
一、编程思路  
Windows应用程序下实现接收文件的方式是这样的:首先应用程序需要使用 VOID DragAcceptFiles(HWND hWnd, BOOL fAccept)函数声明该应用程序中的窗口或控件的句柄可以接受资源管理 器或文件管理器发送的WM_DROPFILES消息,窗口或控件的句柄由DragAcceptFiles()参数的hWnd指定,并相应的在应用程序中增 加对WM_DROPFILES消息进行处理的代码;当应用程序(准确的说是调用DragAcceptFiles()函数时在参数hWnd中指定的句柄所对 应的窗口或控件)接收到WM_DROPFILES消息时,应用程序调用DragQueryFile、 DragFinish, DragQueryPoint这三个函数对接收到的消息进行处理,关于这几个函数的详细使用方法和说明请参阅Delphi自带 win32.hlp或Microsoft Visual Studio开发包中的MSDN。在Delphi中使用TApplication的 OnMessage事件来处理WM_DROPFILES消息。  
二、实现步骤  
启动Delphi,新建一个工程Project1,从Win32控件面板中拖放一个TListView列表视控件到窗口Form1中,将 ViewStyle属性设置为vsReport,接着在ListView1中添加两个列,分别为FileName和Path。好了,列表视设置完成,现在 开始在Unit1.Pas进行编码(不要忘了加入shellapi单元),具体如下:  
  
unit Unit1;  
  
interface  
  
uses  
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, shellapi,  
ComCtrls;  
  
type  
TForm1 = class(TForm)  
ListView1: TListView;  
procedure FormCreate(Sender: TObject);  
private 
public 
procedure AppMessage(var Msg: TMsg; var Handled: Boolean);  
end;  
  
var  
Form1: TForm1;  
  
implementation   
{$R *.DFM}  
  
procedure TForm1.FormCreate(Sender: TObject);  
begin  
file://设置需要处理文件WM_DROPFILES拖放消息  
DragAcceptFiles(ListView1.Handle, TRUE);  
file://设置AppMessage过程来捕获所有消息  
Application.OnMessage := AppMessage;  
end;  
  
procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);  
var  
nFiles, I: Integer;  
Filename: string;  
ListItem: TListItem;  
begin 
// 注意!所有消息都将通过这里!  
// 不要在此过程中编写过多的或者需要长时间操作的代码,否则将影响程序的性能 
// 判断是否是发送到ListView1的WM_DROPFILES消息  
if (Msg.message = WM_DROPFILES) and (msg.hwnd = ListView1.Handle) then  
begin  
// 取dropped files的数量  
nFiles := DragQueryFile (Msg.wParam, $FFFFFFFF, nil, 0);  
// 循环取每个拖下文件的全文件名  
try  
for I := 0 to nFiles - 1 do  
begin  
// 为文件名分配缓冲 allocate memory  
SetLength (Filename, 80);  
// 取文件名 read the file name  
DragQueryFile (Msg.wParam, I, PChar (Filename), 80);  
Filename := PChar (Filename);  
file://将全文件名分解程文件名和路径  
ListItem := ListView1.Items.Add;  
ListItem.Caption := ExtractFileName(FileName);  
ListItem.SubItems.Add(ExtractFilePath(FileName));  
end;  
finally  
file://结束这次拖放操作  
DragFinish (Msg.wParam);  
end;  
file://标识已处理了这条消息  
Handled := True;  
end;  
end;  
  
end.  
  
  
三、编译运行  
按F9编译、运行Project1程序,打开资源管理器或文件管理器,并从中拖放一些文件到Project1程序中,当鼠标指针移动到ListView1 时,指针变成了Drag形状,这时候弹开鼠标键,看到了吗?FileName、Path两列分别显示出了这些被拖放到Project1程序中文件名和路径,至此,TListView接受文件拖放的功能成功实现。
  评论这张
 
阅读(671)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017