亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

DELPHI中的拖動開發(2)

2019-11-18 18:10:22
字體:
來源:轉載
供稿:網友
 

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;


上一篇:PB與DELPHI的比較

下一篇:DELPHI中拖放的操作

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美最新羞羞视频在线观看| 青草青草久热精品视频在线观看| 亚洲男人天堂网| 久久精品国产成人| 欧美裸体视频网站| 欧美色道久久88综合亚洲精品| 成人欧美一区二区三区在线| 日本久久久a级免费| 色先锋资源久久综合5566| 久久国内精品一国内精品| 日本老师69xxx| 在线播放精品一区二区三区| 成人激情免费在线| 伊人av综合网| 日韩中文字幕视频在线观看| 欧美性色xo影院| 91精品国产91久久久久久最新| 精品中文字幕乱| 欧美成人精品一区二区三区| 亚洲va欧美va在线观看| 国产精品久久久久aaaa九色| 国产免费一区视频观看免费| 久久精品这里热有精品| 国内成人精品视频| 国产成人亚洲综合青青| 亚洲欧美日韩高清| 影音先锋欧美在线资源| 中文字幕综合一区| 色狠狠久久aa北条麻妃| 亚洲激情电影中文字幕| 日本高清视频一区| 国产午夜精品免费一区二区三区| 91精品视频在线看| 色999日韩欧美国产| 欧美性猛交xxxx免费看漫画| 中文字幕精品—区二区| 午夜精品在线观看| 91精品国产99久久久久久| 91亚洲精品在线观看| 亚洲欧美在线第一页| 国产精品69久久久久| 日韩电影大片中文字幕| 亚洲风情亚aⅴ在线发布| 亚洲2020天天堂在线观看| 日韩精品免费看| 综合激情国产一区| 久久久999精品| 欧美激情综合色| 精品久久久视频| 久久69精品久久久久久国产越南| 91网站免费观看| 国内偷自视频区视频综合| 91中文字幕在线观看| 亚洲一区二区久久久久久久| 日韩欧美国产黄色| 色777狠狠综合秋免鲁丝| 亚洲专区在线视频| 成人xxxx视频| 欧美性xxxx极品hd欧美风情| 国产精品情侣自拍| 日韩中文字幕网站| 国产在线一区二区三区| 成人激情视频免费在线| 亚洲精品一二区| xxx一区二区| 在线日韩av观看| 亚洲欧美999| 欧美极品少妇xxxxⅹ免费视频| 国产精品三级美女白浆呻吟| 精品亚洲一区二区三区在线观看| 欧美精品videos| 欧美人与性动交a欧美精品| 欧美高清自拍一区| 日本久久久久久久久久久| 久久免费高清视频| 国产精品国模在线| 在线视频日韩精品| 亚洲最大中文字幕| 欧美大片在线免费观看| 亚洲视频专区在线| 欧美精品午夜视频| 欧美激情亚洲一区| 精品久久久国产| 一个人看的www欧美| 久久久久久这里只有精品| 国外视频精品毛片| 久久国产色av| 在线国产精品视频| 最新中文字幕亚洲| 国产一区二区免费| 亚洲国产成人精品一区二区| 91美女福利视频高清| 欧美高清在线视频观看不卡| 国产一区二区三区18| 欧美性jizz18性欧美| 国产精品视频免费在线| 色综合视频一区中文字幕| 亚洲国产精品国自产拍av秋霞| 欧美激情在线视频二区| 精品国产91乱高清在线观看| 欧美成人黄色小视频| 久久久日本电影| 国产精品欧美久久久| 国产视频亚洲视频| 欧美电影免费观看| 欧美富婆性猛交| 在线播放日韩精品| 国产精品自拍偷拍视频| 在线精品91av| 日本免费一区二区三区视频观看| 国产精品jizz在线观看麻豆| 国产精品美女免费| 97视频在线观看成人| 国产精品一区二区电影| 久久久精品视频在线观看| 久久av.com| 黑人精品xxx一区| 色婷婷久久一区二区| 91精品国产色综合久久不卡98| 欧美激情精品久久久久久蜜臀| 91精品国产91久久久久久最新| 日韩中文字幕在线视频播放| 91精品国产九九九久久久亚洲| 精品日韩美女的视频高清| 国产精品狼人色视频一区| 日韩av综合中文字幕| 国产精品一区专区欧美日韩| 91国内揄拍国内精品对白| 欧美另类99xxxxx| 成人精品久久av网站| 亚洲国产精品va在线看黑人动漫| 91精品国产高清自在线| 国产成人精品a视频一区www| 欧洲成人在线观看| 国产精品ⅴa在线观看h| 国内精品久久久久久久久| 欧美日韩免费网站| 亚洲男人天堂手机在线| 精品亚洲国产成av人片传媒| 日韩电影中文字幕在线观看| 欧美国产日本高清在线| 国产精品中文久久久久久久| 欧美成人激情图片网| 国产精品影院在线观看| 2019中文在线观看| 国产福利精品视频| 午夜免费久久久久| 久久久久中文字幕2018| zzjj国产精品一区二区| 欧美视频裸体精品| 91视频免费在线| 18久久久久久| 国产99久久精品一区二区| 亚洲欧美综合图区| 久久天天躁夜夜躁狠狠躁2022| 欧美日产国产成人免费图片| 成人黄色生活片| 色在人av网站天堂精品| 91深夜福利视频| 久操成人在线视频| 日本视频久久久| 国产精品一久久香蕉国产线看观看| 丝袜亚洲另类欧美重口| 欧美日韩综合视频|