DELPHI中的拖动开发(2)

9.2开发拖放功能的一般步骤

数据挖掘交友

  拖放作为Windows提供的一种方便操作对象的功能,在Delphi中可以很容易地开发
出来。根据拖放操作的过程可以把开发步骤划分为四个阶段,即:

数据挖掘交友

  ●开始拖动操作

数据挖掘研究院

  ●接收拖动项目 数据挖掘工具

  ●放下拖动项目

数据挖掘工具

  ●终止拖动操作 数据挖掘研究院

  在介绍过程中我们将结合一个TabSet(标签集)的拖放操作实例。界面设计如图。
在运行时当用户把一个标签拖动到另一个标签的位置时,该标签将移动到该位置并引起
标签集的重新布置。

数据挖掘研究院

  

  9.2.1开始拖动操作

数据挖掘实验室

  当拖动模式(DragMode)设置为dmAutomatic时,用户在源控件上按下鼠标时拖动自动
开始;当设置为dmManual时通过处理鼠标事件来决定拖动是否开始。如果想开始拖动调
用BeginDrag方法。 数据挖掘实验室

  在TabSet拖放中,我们用下面的MouseDown事件处理过程来开始一个标签的拖动。

数据挖掘交友

  首先判断按下的是否是左键,而后再判断项目是否合法。 数据挖掘研究院

procedure TForm1.TabSet1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer); 数据挖掘研究院

var

DragItem: Integer; 数据挖掘实验室

begin 数据挖掘工具

if Button = mbLeft then 数据挖掘实验室

begin

数据挖掘论坛

DragItem := TabSet1.ItemAtPos(Point(X, Y));

if (DragItem > -1) and (DragItem < TabSet1.Tabs.Count) then

TabSet1.BeginDrag(False);

数据挖掘研究院

end;

end; 数据挖掘论坛


  9.2.2接收拖动项目

数据挖掘实验室

  一个控件能否接收拖动项目是由该控件的OnDragOver事件决定的。在TabSet拖动中,主要是利用鼠标的位置进行判断。 数据挖掘实验室


procedure TForm1.TabSet1DragOver(Sender, Source: TObject; X, Y: Integer; 数据挖掘论坛

State: TDragState; var Accept: Boolean); 数据挖掘交友

var

DropPos: Integer;

begin 数据挖掘工具

if Source = TabSet1 then 数据挖掘交友

begin

数据挖掘交友

DropPos := TabSet1.ItemAtPos(Point(X, Y));

数据挖掘工具

Accept := (DropPos > -1) and (DropPos <> TabSet1.TabIndex) and 数据挖掘实验室

(DropPos < TabSet1.Tabs.Count);

数据挖掘论坛

end; 数据挖掘研究院

else 数据挖掘交友

Accept := False;

数据挖掘实验室

end; 数据挖掘交友


  9.2.3放下拖动项目 数据挖掘工具

  当OnDragOver事件处理过程返回的Accept为True且项目被放下时,由OnDragDrop事
件处理过程来完成拖动放下后的响应。在TabSet拖放实例中是改变标签的位置。 数据挖掘研究院

procedure TForm1.TabSet1DragDrop(Sender, Source: TObject; X, Y: Integer); 数据挖掘交友

var

OldPos: Integer;

数据挖掘研究院

NewPos: Integer;

数据挖掘交友

begin

数据挖掘实验室

if Source = TabSet1 then 数据挖掘工具

begin 数据挖掘研究院

OldPos := TabSet1.TabIndex; 数据挖掘实验室

NewPos := TabSet1.ItemAtPos(Point(X, Y)); 数据挖掘工具

if (NewPos > -1) and (NewPos <> OldPos) then 数据挖掘交友

TabSet1.Tabs.Move(OldPos, NewPos); 数据挖掘工具

end; 数据挖掘工具

end; 数据挖掘实验室


  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需检查是否是合法的标签。

数据挖掘论坛

   数据挖掘研究院

  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;
数据挖掘交友

[数据挖掘专家] [数据挖掘研究院] [数据挖掘论坛] [数据挖掘实验室]
上一篇:[Delphi]在TWebBrowser中接收Enter键
下一篇:DELPHI中拖放的操作
最新评论共有 0 位网友发表了评论 , 查看所有评论
发表评论( 不能超过250字,需审核,请自觉遵守互联网相关政策法规。 )
匿名?
数据挖掘网站导航 数据挖掘论坛导航
  • 数据挖掘工具
  • 数据挖掘论坛
  • DataCruncher - Cognos
  • MineSet - MathSoft
  • Intelligent Miner - GainSmarts
  • Sqlserver - SAS - Clementine
  • CART - Weka - WizSoft
  • NeuroShell - ModelQuest
  • data mining tools - Darwin
  • 数据挖掘交友
  • 数据挖掘博客
  • 数据挖掘工具
  • 数据挖掘资源
  • 数据挖掘技术算法
  • 数据挖掘相关期刊、会议
  • 研究院联盟合作专区
  • 数据挖掘基础与相关技术
  • 数据挖掘厂商与就业
  • 数据挖掘研究者乐园
  • 知名厂商数据挖掘工具资料
  • 国内数据挖掘实验室
  • Foreign Data Mining Lab
  • 热点关注
  • GDI+简介
  • COM与DCOM的区别与联系
  • 使用Delphi解析XML 文档
  • 如何设置delphi/cbuilder/BDE/MSSQL
  • BORLAND在“迫害”程序员?
  • 将image的图片保存为JPG格式图片方法
  • InstallShieldExpressfordelphi制作安装程
  • Real Programmers Use Pascal
  • 关于在COM中使用可选参数的研究
  • TStrings的AddObject方法应用
  • 论坛最新话题
  • Foundations of Statistical Natural Langu
  • Game Theory meet Data Mining: A Recent P
  • System Building: How does it help or hin
  • 数据挖掘与Clementine培训
  • 新手报到
  • 求 SASEM 客户流失预测分析
  • 数据挖掘工程师/搜索研究院—北京——无线
  • 数据挖掘入门介绍(如何着手数据挖掘)
  • Information Overload Survey Results
  • The INEX 2005 Workshop on Element Retrie
  • 相关资讯
  • BORLAND在“迫害”程序员?
  • 李维:我的回忆和一些有趣的事(精彩绝伦)
  • 李维看.net和DELPHI6(含李维照片)
  • 《代码大全》电子版1.01发布了
  • Real Programmers Use Pascal
  • Kylix安装手记
  • Borland与Microsoft关于Delphi的对话
  • InstallShieldExpressfordelphi制作安装程
  • 关于在COM中使用可选参数的研究
  • msagent经典用法
  • 数据挖掘实验室资料
  • 数据挖掘博客地址
  • 数据挖掘实验室网站地址
  • Prepare for Medicare audits by using dat
  • 注册成为SAS用户与爱好者俱乐部会员
  • 水南梅
  • 明日烟
  • 新人报道
  • 下载
  • 厦门服务器托管,450元/月—0592-5177319 高
  • 买空间送域名--0592-5177319 高静