自制支援檔案拖放的VCL元件 (轉)
自制支援檔案拖放的VCL元件 (轉)[@more@] 用過的朋友都知道,Winamp的介面能支援拖放,當你想欣賞某檔案時,只需要
將檔案拖到Winamp的視窗上,然後放開滑鼠就行了。那我們如何讓自己的也實現這樣的功能
呢?我們可以透過改進開發工具提供的標準來實現。下面以環境中的ListBox元件為
例,讓ListBox支援檔案拖放。
首先介紹一下要用到的:
DragAcceptFiles() 初始化某視窗使其允許/禁止接受檔案拖放
DragQueryFile() 查詢拖放的檔名
DragFinish() 釋放拖放檔案時使用的資源
實現的基本原理如下:首先DragAcceptFiles()函式初始化元件視窗,使其允許接受檔案
拖放,然後等待WM_DropFiles訊息(一旦進行了拖放檔案操作,元件視窗即可獲得此訊息),
獲得訊息後即可使用DragQueryFile()函式查詢被拖放的檔名,最後呼叫DragFinish()釋放資
源。
因為在VCL類庫中,ListBox元件,所屬類名為:TListBox,所以我們可以從TListBox繼承建立
自己的元件。新元件名為:TDropFileListBox,它比標準TListBox增加了一個OnDropFiles事件和
一個DropEnabled屬性。當DropEnabled為True時即可接受檔案拖放,檔案拖放完成後激發
OnDropFiles事件,該事件提供一個FileNames引數讓使用者獲得檔名。
元件的程式碼如下:
{ TDropFileListBox V1.00 Component }
{ Copyright (c) 2000.5 by Shen Min, Sunisoft }
{ E: sunisoft@21cn.com }
{ : }
unit DropFileListBox;
interface
uses
, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Api; //增加ShellApi單元,因為所使用的三個API函式宣告於此單元檔案中
type
TMyNotifyEvent = procedure (Sender: T;FileNames:TStringList) of object; //自定
義事件型別。
TDropFileListBox = class(TListBox) //新的類從TListBox繼承
private
{ Private declarations }
FEnabled:Boolean; //屬性DropEnabled的內部變數
protected
FDropFile:TMyNotifyEvent; //事件指標
procedure DropFiles(var Mes:TMessage);message WM_DROPFILES;
procedure FDropEnabled(Enabled:Boolean); //設定DropEnabled屬性的過程
{ Protected declarations }
public
constructor Create(AOwner: TComponent);overr;
destructor Destroy;override;
{ Public declarations }
published
property OnDropFiles:TMyNotifyEvent read FDropFile write FDropFile;
property DropEnabled:Boolean read FEnabled write FDropEnabled;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Sunisoft', [TDropFileListBox]); //註冊元件到元件板上
end;
constructor TDropFileListBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnabled:=true; //類被構造時,使DropEnabeld的預設值為True
end;
destructor TDropFileListBox.Destroy;
begin
inherited Destroy;
end;
//改變屬性DropEnabled的呼叫過程
procedure TDropFileListBox.FDropEnabled(Enabled:Boolean);
begin
FEnabled:=Enabled;
DragAcceptFiles(Self.Handle,Enabled);//設定元件視窗是否接受檔案拖放
end;
//接受WM_DropFiles訊息的過程
procedure TDropFileListBox.DropFiles(var Mes:TMessage);
var FN:TStringList;
FileName:array [1..256] of char;
N:String;
i,Count,p:integer;
begin
FN:=TStringList.Create;
Count:=DragQueryFile(Mes.WParam,$FFFFFFFF,@FileName,256);//得到拖放檔案的個數
For i:=0 to Count-1 do
begin
DragQueryFile(mes.WParam,i,@FileName,256);//查詢檔名稱
sFN:=FileName;
p:=pos(chr(0),sFN);//去掉檔名末尾的ASCII碼為0的字元
sFN:=copy(sFN,1,p-1);
FN.Add(sFN);
end;
DragFinish(mes.WParam); //釋放所使用的資源
if Assigned(FDropFile) then
FDropFile(self, FN); //呼叫事件,並返回檔名列表引數
FN.Free;
end;
end.
該元件後即可使用,我們可以新建一個工程,將該元件放置在Form上,然後在
TDropFileListBox元件的OnDropFiles事件中寫下具體處理拖放操作的程式碼。
例如將所有拖放的檔名加入該列表中,新增程式碼如下:
procedure TForm1.DropFileListBox1DropFiles(Sender: TObject;FileNames: TStringList);
begin
DropFileListBox1.Items.AddStrings(FileNames);
end;
執行一下看看,是不是很有趣?本文僅僅對於ListBox元件做了擴充套件,你也可以對其它元件做
類似的擴充套件,實現支援檔案的拖放。
將檔案拖到Winamp的視窗上,然後放開滑鼠就行了。那我們如何讓自己的也實現這樣的功能
呢?我們可以透過改進開發工具提供的標準來實現。下面以環境中的ListBox元件為
例,讓ListBox支援檔案拖放。
首先介紹一下要用到的:
DragAcceptFiles() 初始化某視窗使其允許/禁止接受檔案拖放
DragQueryFile() 查詢拖放的檔名
DragFinish() 釋放拖放檔案時使用的資源
實現的基本原理如下:首先DragAcceptFiles()函式初始化元件視窗,使其允許接受檔案
拖放,然後等待WM_DropFiles訊息(一旦進行了拖放檔案操作,元件視窗即可獲得此訊息),
獲得訊息後即可使用DragQueryFile()函式查詢被拖放的檔名,最後呼叫DragFinish()釋放資
源。
因為在VCL類庫中,ListBox元件,所屬類名為:TListBox,所以我們可以從TListBox繼承建立
自己的元件。新元件名為:TDropFileListBox,它比標準TListBox增加了一個OnDropFiles事件和
一個DropEnabled屬性。當DropEnabled為True時即可接受檔案拖放,檔案拖放完成後激發
OnDropFiles事件,該事件提供一個FileNames引數讓使用者獲得檔名。
元件的程式碼如下:
{ TDropFileListBox V1.00 Component }
{ Copyright (c) 2000.5 by Shen Min, Sunisoft }
{ E: sunisoft@21cn.com }
{ : }
unit DropFileListBox;
interface
uses
, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Api; //增加ShellApi單元,因為所使用的三個API函式宣告於此單元檔案中
type
TMyNotifyEvent = procedure (Sender: T;FileNames:TStringList) of object; //自定
義事件型別。
TDropFileListBox = class(TListBox) //新的類從TListBox繼承
private
{ Private declarations }
FEnabled:Boolean; //屬性DropEnabled的內部變數
protected
FDropFile:TMyNotifyEvent; //事件指標
procedure DropFiles(var Mes:TMessage);message WM_DROPFILES;
procedure FDropEnabled(Enabled:Boolean); //設定DropEnabled屬性的過程
{ Protected declarations }
public
constructor Create(AOwner: TComponent);overr;
destructor Destroy;override;
{ Public declarations }
published
property OnDropFiles:TMyNotifyEvent read FDropFile write FDropFile;
property DropEnabled:Boolean read FEnabled write FDropEnabled;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Sunisoft', [TDropFileListBox]); //註冊元件到元件板上
end;
constructor TDropFileListBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnabled:=true; //類被構造時,使DropEnabeld的預設值為True
end;
destructor TDropFileListBox.Destroy;
begin
inherited Destroy;
end;
//改變屬性DropEnabled的呼叫過程
procedure TDropFileListBox.FDropEnabled(Enabled:Boolean);
begin
FEnabled:=Enabled;
DragAcceptFiles(Self.Handle,Enabled);//設定元件視窗是否接受檔案拖放
end;
//接受WM_DropFiles訊息的過程
procedure TDropFileListBox.DropFiles(var Mes:TMessage);
var FN:TStringList;
FileName:array [1..256] of char;
N:String;
i,Count,p:integer;
begin
FN:=TStringList.Create;
Count:=DragQueryFile(Mes.WParam,$FFFFFFFF,@FileName,256);//得到拖放檔案的個數
For i:=0 to Count-1 do
begin
DragQueryFile(mes.WParam,i,@FileName,256);//查詢檔名稱
sFN:=FileName;
p:=pos(chr(0),sFN);//去掉檔名末尾的ASCII碼為0的字元
sFN:=copy(sFN,1,p-1);
FN.Add(sFN);
end;
DragFinish(mes.WParam); //釋放所使用的資源
if Assigned(FDropFile) then
FDropFile(self, FN); //呼叫事件,並返回檔名列表引數
FN.Free;
end;
end.
該元件後即可使用,我們可以新建一個工程,將該元件放置在Form上,然後在
TDropFileListBox元件的OnDropFiles事件中寫下具體處理拖放操作的程式碼。
例如將所有拖放的檔名加入該列表中,新增程式碼如下:
procedure TForm1.DropFileListBox1DropFiles(Sender: TObject;FileNames: TStringList);
begin
DropFileListBox1.Items.AddStrings(FileNames);
end;
執行一下看看,是不是很有趣?本文僅僅對於ListBox元件做了擴充套件,你也可以對其它元件做
類似的擴充套件,實現支援檔案的拖放。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989770/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用IDropTarget介面同時支援文字和檔案拖放 (轉)
- 實現檔案拖放的一種簡潔方法 (轉)
- 裝置元件檔案轉換為EVE-NG環境的支援元件元件
- Project JEDI VCL元件編碼標準 (轉)Project元件
- Yoink for Mac(臨時檔案拖放助手)Mac
- Blazor 使用拖放(drag and drop)上傳檔案Blazor
- perl檔案上傳程式,支援多檔案! (轉)
- javascript的拖放入門(轉)JavaScript
- Blazor 拖放上傳檔案轉換格式並推送到瀏覽器下載Blazor瀏覽器
- 透過例項看VCL元件開發全過程(一) (轉)元件
- 透過例項看VCL元件開發全過程(二) (轉)元件
- 贊!帶進度條的 jQuery 檔案拖放上傳外掛jQuery
- VCL介面控制元件DevExpress VCL釋出v17.2.8|附下載控制元件devExpress
- tlistview使用--拖放操作 (轉)View
- 使用C++Builder建立自定義VCL元件時的一些問題 (轉)C++UI元件
- 讓UpdatePanel支援檔案上傳(2):伺服器端元件伺服器元件
- TListView元件顯示資料夾中的檔案 (轉)View元件
- windows下檔案系統支援的檔案大小Windows
- 檢查特殊字元的簡單VCL (轉)字元
- ALV Grid控制元件拖放功能控制元件
- 【版本升級】VCL介面控制元件DevExpress VCL釋出v17.2.6|附下載控制元件devExpress
- VCL介面控制元件DevExpress VCL Controls v17.2.2釋出|附下載控制元件devExpress
- 輕輕鬆鬆找檔案--支援回撥函式的通用檔案查詢函式 (轉)函式
- Angular元件-檔案上傳元件Angular元件
- VCL介面控制元件DevExpress VCL Controls釋出v18.1.3|附下載控制元件devExpress
- 自己編寫JAVA環境下的檔案上傳元件 (轉)Java元件
- FastReport VCL報表控制元件教程:元件編輯器寫作AST控制元件
- VCL中訊息處理初探 (轉)
- 深入VCL 理解BCB的訊息機制 (一) (轉)
- 用DELPHI為ASP開發檔案上載元件 (轉)元件
- WPF + Winform 解決管理員許可權下無法拖放檔案的問題ORM
- 使用ATL建立支援IClassFactory2的COM元件 (轉)元件
- 使用ln同步檔案內容,支援忽略檔案
- .NET中使用APlayer元件自制播放器元件播放器
- 臨時檔案拖放暫存工具:Yoink for mac v3.6.89啟用版Mac
- 深入C++ Builder之編寫自己的元件 -深入分析VCL繼承、訊息機制(2) (轉)C++UI元件繼承
- 深入C++ Builder之編寫自己的元件-深入分析VCL繼承、訊息機制(3) (轉)C++UI元件繼承
- ASM 檔案與本地檔案的轉換ASM