2009-8-6 22:44
小帆
建议 CnFileSystemWatcher 增加 Sender 这个参数
在很多时候我们需要传递 Sender 使用,所以
TFileDealMethod = procedure(FileOperation: TFileOperation; const FileName1, FileName2: string) of object;
最好改为:
TFileDealMethod = procedure([color=Red]Sender: Tobject;[/color] FileOperation: TFileOperation; const FileName1, FileName2: string) of object;
这样做的好处显而易见,可以将 Sender 参数传递给需要的时候使用,多个CnFileSystemWatcher 可以共用一个事件过称,靠 Sender 来控制各自的不同的设置。
2009-8-7 19:29
小帆
建议它改为这样:[b](红色部分为修改)[/b]
TFileDealMethod = procedure(FileOperation: TFileOperation; const FileName1,
FileName2: string) of object;
改为:
TFileDealMethod = procedure([color=Red]Sender: Tobject;[/color] FileOperation: TFileOperation; const FileName1,
FileName2: string) of object;
[color=Red]TCnFileSystemWatcher = class;[/color][color=Green]//增加[/color]
TCnShellChangeThread = class(TThread)
private
[color=Red]FParent: TCnFileSystemWatcher;[/color][color=SeaGreen]//增加[/color]
......
public
constructor Create([color=Red]AParent:TCnFileSystemWatcher;[/color] ChangeEvent: TFileDealMethod); virtual;
.........
end;
constructor TCnShellChangeThread.Create([color=Red]AParent:TCnFileSystemWatcher;[/color] ChangeEvent: TFileDealMethod);
begin
............
[color=Red] FParent := AParent;[/color][color=SeaGreen]//增加[/color]
inherited Create(True);
end;
procedure TCnFileSystemWatcher.Start;
begin
if csDesigning in ComponentState then
Exit;
if Assigned(FOnChange) then
begin
FThread := TCnShellChangeThread.Create([color=Red]Self,[/color]FOnChange);
..............
end;
procedure TCnShellChangeThread.DoIOCompletionEvent;
var
TempBuffer: TNotificationBuffer;
FileOpNotification: PFileNotifyInformation;
Offset: Longint;
FileName1, FileName2: string;
FileOperation: TFileOperation;
procedure DoDirChangeEvent;
var
IsInFileMasks: Boolean;
begin
if Assigned(ChangeEvent) and FActive then
begin
if FTmpFileMasks.Count > 0 then
IsInFileMasks := FileMatchesMasks(FileName1, FTmpFileMasks)
else
IsInFileMasks := FileMatchesMasks(FileName1, '*.*', False);
if IsInFileMasks then
begin
if FIncludePath then
begin
FileName1 := GetTrueFileName(FDirectory + FileName1);
if FileOperation = foRenamed then
FileName2 := GetTrueFileName(FDirectory + FileName2);
end;
ChangeEvent([color=Red]FParent,[/color] FileOperation, FileName1, FileName2);
end;
end;
end;
function GetFileName(const FileName: PWideChar; FileNameLength: DWORD):string;
end;
[[i] 本帖最后由 小帆 于 2009-8-7 19:30 编辑 [/i]]