begin
if Button = mbLeft then
with Sender as TFileListBox do
begin
if ItemAtPos(Point(X, Y), True) $#@62;= 0 then
BeginDrag(False);
end;
end;
ItemAtPos用来检查当前是否有文件存在。而BeginDrag方法传递参数False,允许FileList单独处理鼠标事件而并不开始拖动。事实上这种情况是大量存在的。
2.DirectoryOutline、DriveTabSet决定是否能接受拖动的就地放下。
procedure TFMForm.DirectoryOutlineDragOver(Sender, Source: TObject; X,Y: Integer; State: TDragState; var Accept: Boolean);
begin
if Source is TFileListBox then
Accept := True;
end;
procedure TFMForm.DriveTabSetDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
var
PropPos: Integer;
begin
if Source is TFileListBox then
with DriveTabSet do
begin
PropPos := ItemAtPos(Point(X,Y));
Accept := (PropPos $#@62; -1) and (PropPos $#@60; Tabs.Count);
end;
end;
DirectoryOutline是无条件的接受,而DriveTabSet需检查是否是合法的标签。
3.拖动放下的响应
DirectoryOutline的拖动放下用于实现文件移动功能。程序中调用ConfirmChange 事件处理过程,目标路径由DirctoryOutline.Items[GetItem(X,Y)].FullPath来得到。
procedure TFMForm.DirectoryOutlineDragDrop(Sender, Source: TObject; X,Y: Integer);
begin
if Source is TFileListBox then
with DirectoryOutline do
begin
ConfirmChange(Move,FileList.FileName, Items[GetItem(X, Y)].FullPath);
end;
end;
DriveTabSet的拖动放下用于实现文件拷贝功能。程序中把当前位置转化为相应的驱动器号,目标路径由CurrentDirList[DriveTabSet.TabIndex]获得。
procedure TFMForm.DriveTabSetDragDrop(Sender, Source: TObject; X,Y: Integer);
var
APoint: TPoint;
begin
APoint.X := X; APoint.Y := Y;
DriveTabSet.TabIndex := DriveTabSet.ItemAtPos(APoint);
if Source is TFileListBox then
with DriveTabSet do
begin
if CurrentDirList[TabIndex] $#@60;$#@62; then
ConfirmChange(Copy,TheFilename,CurrentDirList[TabIndex]);
end;
end;
4.FileList响应拖动结束,更新文件列表
procedure TFMForm.FileListEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
if Target $#@60;$#@62; nil then FileList.Update;
end;
到目前为止,我们的文件管理器功能已足够强大。不过还有许多问题值得读者去进一步探讨,如:
1.文件与应用程序关联的建立;
2.在文件列表框中显示更多的文件信息;
3.文件列表框中的文件按后缀各排序等。
文件管理器是一个真正的综合例程,对它的钻研会使您更进一步模到Delphi编程的精髓。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




