您现在的位置:首页 >> 基础算法 >> window基础 >> 内容

Delphi拖放编程详解(3)

时间:2011/9/3 15:34:35 点击:

 
9.2.4 结束拖动操作 
  结束拖动操作的方式有两种:或者是用户释放了鼠标键或者是程序用EndDrag方法强行中止拖动。结束拖动操作的后果有两种:放下被接受或放下被忽略。
  拖动操作结束后源控件都要收到一条消息响应拖动结束事件OnEndDrag。 
9.3  拖放应用实例:文件管理器的拖放支持 
  在第六章最后开发的文件管理器应用实例,虽然功能上已初具规模,但在操作上与Windows的文件管理器相比还有很大不足。其中最大的缺陷是它不支持文件的拖放移动和拖放拷贝。在这一章结束的时候,我们可以来弥补这一缺陷了。
  文件拖放移动指的是当用户把一个文件拖动到目录树下的某一目录并放下时,文件将自动移动到该目录中;文件拖放拷贝指的是当用户把一个文件拖动到某个驱动器标签上并放下时,文件将自动拷贝到该驱动器的当前目录下。作为源控件的文件列表框和作为目标控件的目录树、驱动器标签可以位于不同的子窗口。驱动器的当前目录是任一子窗口的最新操作结果,而不论这一子窗口与拖动源、拖动目标是否有关系。
  为了实现上述功能,有两个问题必须首先解决:
  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需检查是否是合法的标签。

上一页1234下一页

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号