给要“文件拖放时实现复制功能”问题的两位大哥,贴子名好像叫“像WINRAR那样。。。”,“施放文件的问题”实在找不到你们的贴子了。(0分)

  • 主题发起人 主题发起人 怡.梦
  • 开始时间 开始时间

怡.梦

Unregistered / Unconfirmed
GUEST, unregistred user!
文件拖放移动指的是当用户把一个文件拖动到目录树下的某一目录并放下时,文件将自动移动到该目录中;文件拖放拷贝指的是当用户把一个文件拖动到某个驱动器标签上并放下时,文件将自动拷贝到该驱动器的当前目录下。作为源控件的文件列表框和作为目标控件的目录树、驱动器标签可以位于不同的子窗口。驱动器的当前目录是任一子窗口的最新操作结果,而不论这一子窗口与拖动源、拖动目标是否有关系。

  为了实现上述功能,有两个问题必须首先解决:

  1.如何记录每一驱动器的当前目录?

  为此我们定义了一个全局变量: 

  var

CurentDirList: Array[0...25] of string[70]; 

在DirectoryOutline的OnChange事件中: 

procedure TFMForm.DirectoryOutlineChange(Sender: TObject);

begin

CreateCaption;

FileList.clear;

FileList.Directory := DirectoryOutline.Directory;

FileList.Update;

CurrentDirList[DriveTabSet.TabIndex] := DirectoryOutline.Directory;

FileManager.DirectoryPanel.Caption := DirectoryOutline.Directory;

end;  

  由于DriveTabSet在响应OnDragDrop事件前先响应OnClick事件,并由该事件激发DirectoryOutline的Onchange事件,因而可保证在任何时候OnDragDrop事件中用到的CurrentDirList数组项不为空字符串。

 2.如何保证移动、拷贝与子窗口的无关性?

  在这里一个关键问题是我们判断源控件时是用is操作符进行类型检查: 

If Source is TFileList then



  如果我们用下面的语句: 

  If Source = FileList then

   …

  则移动、拷贝操作将限制在本子窗口范围内。

  当解决了上述问题后我们的工作就只是遵循拖放的一般开发步骤,按步就班来完成了。

  1.FileList开始拖动操作 

procedure TFMForm.FileListMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if Button = mbLeft then

with Sender as TFileListBox do

begin

if ItemAtPos(Point(X, Y), True) >= 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 > -1) and (PropPos < 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] <> '' then

ConfirmChange('Copy',TheFilename,CurrentDirList[TabIndex]);

end;

end; 

4.FileList响应拖动结束,更新文件列表 

procedure TFMForm.FileListEndDrag(Sender, Target: TObject; X, Y: Integer);

begin

if Target <> nil then FileList.Update;

end; 

到目前为止,我们的文件管理器功能已足够强大。 不过还有许多问题值得读者去进

一步探讨,如:

  1.文件与应用程序关联的建立;

  2.在文件列表框中显示更多的文件信息;

  3.文件列表框中的文件按后缀各排序等。

  文件管理器是一个真正的综合例程,对它的钻研会使您更进一步模到Delphi编程的精髓。
 
谢谢了.
 
不客气!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
734
import
I
I
回复
0
查看
521
import
I
后退
顶部