-新增 FileDrop 屬性到 視覺化控制元件(visual control) 中- (轉)

worldblog發表於2007-12-04
-新增 FileDrop 屬性到 視覺化控制元件(visual control) 中- (轉)[@more@]

作者:Damir Kojevod

新增FileDrop屬性到視覺化[visual control] 中


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


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

3。定義訊息觸發事件(提供事件指標)以便使用者定義處理過程事件。
先定義一個過程事件:引數為TStringList。如下:
TFileDropEvent = procedure(File: TStringList) of ;
再在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,
;

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); overr;

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.


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988462/,如需轉載,請註明出處,否則將追究法律責任。

相關文章