程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中實現讓TListView接收文件拖放

Delphi中實現讓TListView接收文件拖放

編輯:Delphi

在使用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
{ Private declarations }
public
{ Public declarations }
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接受文件拖放的功能成功實現。

注:本程序在Delphi 5,Windows 2000 Professional 中文版中調試運行通過。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved