知识大全 Delphi拖放编程[3]
Posted 文件
篇首语:没有比知识更好的朋友,没有比病魔更坏的敌人。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Delphi拖放编程[3]相关的知识,希望对你有一定的参考价值。
DELPHI基础教程:Delphi拖放编程[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在TabSet拖放中 我们用下面的MouseDown事件处理过程来开始一个标签的拖动 首先判断按下的是否是左键 而后再判断项目是否合法
procedure TForm TabSet MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X Y: Integer)
var
DragItem: Integer;
begin
if Button = mbLeft then
begin
DragItem := TabSet ItemAtPos(Point(X Y))
if (DragItem > ) and (DragItem < TabSet Tabs Count) then
TabSet BeginDrag(False)
end;
end;
接收拖动项目
一个控件能否接收拖动项目是由该控件的OnDragOver事件决定的 在TabSet拖动中 主要是利用鼠标的位置进行判断
procedure TForm TabSet DragOver(Sender Source: TObject; X Y: Integer;
State: TDragState; var Accept: Boolean)
var
DropPos: Integer;
begin
if Source = TabSet then
begin
DropPos := TabSet ItemAtPos(Point(X Y))
Accept := (DropPos > ) and (DropPos <> TabSet TabIndex) and
(DropPos < TabSet Tabs Count)
end;
else
Accept := False;
end;
放下拖动项目
当OnDragOver事件处理过程返回的Accept为True且项目被放下时 由OnDragDrop事件处理过程来完成拖动放下后的响应 在TabSet拖放实例中是改变标签的位置
procedure TForm TabSet DragDrop(Sender Source: TObject; X Y: Integer)
var
OldPos: Integer;
NewPos: Integer;
begin
if Source = TabSet then
begin
OldPos := TabSet TabIndex;
NewPos := TabSet ItemAtPos(Point(X Y))
if (NewPos > ) and (NewPos <> OldPos) then
TabSet Tabs Move(OldPos NewPos)
end;
end;
结束拖动操作
结束拖动操作的方式有两种 或者是用户释放了鼠标键或者是程序用EndDrag方法强行中止拖动 结束拖动操作的后果有两种 放下被接受或放下被忽略
拖动操作结束后源控件都要收到一条消息响应拖动结束事件OnEndDrag
拖放应用实例 文件管理器的拖放支持
在第六章最后开发的文件管理器应用实例 虽然功能上已初具规模 但在操作上与Windows的文件管理器相比还有很大不足 其中最大的缺陷是它不支持文件的拖放移动和拖放拷贝 在这一章结束的时候 我们可以来弥补这一缺陷了
文件拖放移动指的是当用户把一个文件拖动到目录树下的某一目录并放下时 文件将自动移动到该目录中 文件拖放拷贝指的是当用户把一个文件拖动到某个驱动器标签上并放下时 文件将自动拷贝到该驱动器的当前目录下 作为源控件的文件列表框和作为目标控件的目录树 驱动器标签可以位于不同的子窗口 驱动器的当前目录是任一子窗口的最新操作结果 而不论这一子窗口与拖动源 拖动目标是否有关系
为了实现上述功能 有两个问题必须首先解决
如何记录每一驱动器的当前目录?
为此我们定义了一个全局变量
var
CurentDirList: Array[ … ] of string[ ];
在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数组项不为空字符串
如何保证移动 拷贝与子窗口的无关性?
在这里一个关键问题是我们判断源控件时是用is操作符进行类型检查
If Source is TFileList then
…
如果我们用下面的语句
If Source = FileList then
…
则移动 拷贝操作将限制在本子窗口范围内
当解决了上述问题后我们的工作就只是遵循拖放的一般开发步骤 按步就班来完成了
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) >= then
BeginDrag(False)
end;
end;
ItemAtPos用来检查当前是否有文件存在 而BeginDrag方法传递参数False 允许FileList单独处理鼠标事件而并不开始拖动 事实上这种情况是大量存在的
cha138/Article/program/Delphi/201311/25211相关参考
DELPHI基础教程:Delphi拖放编程[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:Delphi拖放编程[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在Delphi中有许多控件支持拖放操作但仅限于应用程序内部而不能实现从Windows环境里向应用程序拖放文件本文将要介绍的就是如何用Delphi编写支持文件拖放的应用程序由于主要使用Windows
DELPHI基础教程:Delphi图形图像编程(一)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
DELPHI基础教程:Delphi图形图像编程(二)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
C语言代码套用在Delphi编程中[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在Delphi编程中使用C语言代码[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Delphi编程技巧集锦 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧![DELPHI]网络邻居复制
Delphi面向对象的编程方法(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Delphi
DELPHI基础教程:Delphi图形图像编程(一)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一