程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> -添加FileDrop屬性到可視化控件(visualcontrol)中-

-添加FileDrop屬性到可視化控件(visualcontrol)中-

編輯:Delphi

作者:Damir Kojevod

添加FileDrop屬性到可視化控件[visual control] 中


1.首先從可視化控件(visual control )中繼承一個新的控件。
2.增加接受文件拖拽消息的屬性。
3.增加消息被處觸發時要響應處理的事件。
4.使用測試這個新創建的控件。


詳細說明:
1。在delphi中 Component|Newcomponent 選擇一個祖先。這裡使用TEdit,給這個控件取名 TFileDropEdit,可設置其他參數,並選擇確定或安裝(這種情況表示自動安裝控件到 控件模板)。
2。增加接收文件拖拽的屬性。
在private部分 增加一個消息過程,聲明如下:
procedure WMDROPFILES(var Message: TWMDROPFILES); message WM_DROPFILES;
這個消息過程完成從Windows 接收WM_DROPFILES消息並且能進行初加工。這個過程完成一系列通常的處理,接收者從消息中提取消息參數等。同時我們還允許用戶定義她自己的動作(把提取的信息交給用戶處理),所以我們必須定義一個事件指針來完成這個功能。如果用戶定義了處理過程,消息處理過程會調用用戶定義的過程。另外,控件必須向windows聲明自己是能接收文件拖拽的控件。是否注冊要調用windows函數 DragAcceptFiles.參數中需要控件的句柄,所以不能在控件的構造器中完成注冊,這裡在public部分增加屬性。這裡用AcceptFiles屬性來注冊和注銷文件拖拽功能。

3。定義消息觸發事件(提供事件指針)以便用戶定義處理過程事件。
先定義一個過程事件:參數為TStringList。如下:
TFileDropEvent = procedure(File: TStringList) of object;
再在published 部分定義屬性 如下
property OnFileDrop: TFileDropEvent Read FFileDrop write FFileDrop;
同時在private部分定義過程指針變量:
FFileDrop: TFileDropEvent;

 

下面的源代碼是 TDropEdit控制的全部代碼。注意:開始控件是不接受文件拖拽的,如果用戶設置AcceptFile 屬性為真則可接受文件拖拽。

unit FileDropEdit;

interface

uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
ShellApi;

type
TFileDropEvent = procedure(files: tstringlist) of object;

TFileDropEdit = class(TEdit)
private
{ Private declarations }
FFileDrop: TFileDropEvent;
FAcceptFiles: Boolean;
procedure WMDROPFILES(var Message: TWMDROPFILES); message WM_DROPFILES;
procedure SetAcceptFiles(const Value: Boolean);
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;

property AcceptFiles: Boolean read FAcceptFiles write SetAcceptFiles;
published
{ Published declarations }
property OnFileDrop: TFileDropEvent read FFileDrop write FFileDrop;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents(Samples, [TFileDropEdit]);
end;

constructor TFileDropEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner: TComponent);
FFileDrop := nil;
FAcceptFiles := False;
end;

procedure TFileDropEdit.WMDROPFILES(var Message: TWMDROPFILES);
var
NumFiles: integer;
buffer: array[0..255] of char;
i: integer;
l: TStringList;
begin
if Assigned(FFiledrop) then
begin
l := TStringList.Create;
NumFiles := DragQueryFile(Message.Drop, $FFFFFFFF, nil, 0); {thanks to Mike Heydon for D5 adjustment of parameters}
for i := 0 to NumFiles - 1 do {Accept the dropped file}
begin
DragQueryFile(Message.Drop, i, buffer, sizeof(buffer));
l.append(StrPas(buffer))
end;
FFileDrop(l);
l.free
end
end;

procedure TFileDropEdit.SetAcceptFiles(const Value: Boolean);
begin
if FAcceptFiles <> Value then
begin
FAcceptFiles := Value;
DragAcceptFiles(Handle, Value);
end
end;

end.


 

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