熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:Delphi拖放編程[3]

2013-11-23 17:51:06  來源: Delphi編程 

  在TabSet拖放中我們用下面的MouseDown事件處理過程來開始一個標簽的拖動首先判斷按下的是否是左鍵而後再判斷項目是否合法

  procedure TFormTabSetMouseDown(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X Y: Integer)

  var

  DragItem: Integer;

  begin

  if Button = mbLeft then

  begin

  DragItem := TabSetItemAtPos(Point(X Y))

  if (DragItem > ) and (DragItem < TabSetTabsCount) then

  TabSetBeginDrag(False)

  end;

  end;

   接收拖動項目

  一個控件能否接收拖動項目是由該控件的OnDragOver事件決定的在TabSet拖動中主要是利用鼠標的位置進行判斷

  procedure TFormTabSetDragOver(Sender Source: TObject; X Y: Integer;

  State: TDragState; var Accept: Boolean)

  var

  DropPos: Integer;

  begin

  if Source = TabSet then

  begin

  DropPos := TabSetItemAtPos(Point(X Y))

  Accept := (DropPos > ) and (DropPos <> TabSetTabIndex) and

  (DropPos < TabSetTabsCount)

  end;

  else

  Accept := False;

  end;

   放下拖動項目

  當OnDragOver事件處理過程返回的Accept為True且項目被放下時由OnDragDrop事件處理過程來完成拖動放下後的響應在TabSet拖放實例中是改變標簽的位置

  procedure TFormTabSetDragDrop(Sender Source: TObject; X Y: Integer)

  var

  OldPos: Integer;

  NewPos: Integer;

  begin

  if Source = TabSet then

  begin

  OldPos := TabSetTabIndex;

  NewPos := TabSetItemAtPos(Point(X Y))

  if (NewPos > ) and (NewPos <> OldPos) then

  TabSetTabsMove(OldPos NewPos)

  end;

  end;

   結束拖動操作

  結束拖動操作的方式有兩種或者是用戶釋放了鼠標鍵或者是程序用EndDrag方法強行中止拖動結束拖動操作的後果有兩種放下被接受或放下被忽略

  拖動操作結束後源控件都要收到一條消息響應拖動結束事件OnEndDrag

    拖放應用實例文件管理器的拖放支持

  在第六章最後開發的文件管理器應用實例雖然功能上已初具規模但在操作上與Windows的文件管理器相比還有很大不足其中最大的缺陷是它不支持文件的拖放移動和拖放拷貝在這一章結束的時候我們可以來彌補這一缺陷了

  文件拖放移動指的是當用戶把一個文件拖動到目錄樹下的某一目錄並放下時文件將自動移動到該目錄中文件拖放拷貝指的是當用戶把一個文件拖動到某個驅動器標簽上並放下時文件將自動拷貝到該驅動器的當前目錄下作為源控件的文件列表框和作為目標控件的目錄樹驅動器標簽可以位於不同的子窗口驅動器的當前目錄是任一子窗口的最新操作結果而不論這一子窗口與拖動源拖動目標是否有關系

  為了實現上述功能有兩個問題必須首先解決

  如何記錄每一驅動器的當前目錄?

  為此我們定義了一個全局變量

  var

  CurentDirList: Array[] of string[];

  在DirectoryOutline的OnChange事件中

  procedure TFMFormDirectoryOutlineChange(Sender: TObject)

  begin

  CreateCaption;

  FileListclear;

  FileListDirectory := DirectoryOutlineDirectory;

  FileListUpdate;

  CurrentDirList[DriveTabSetTabIndex] := DirectoryOutlineDirectory;

  FileManagerDirectoryPanelCaption := DirectoryOutlineDirectory;

  end;

  由於DriveTabSet在響應OnDragDrop事件前先響應OnClick事件並由該事件激發DirectoryOutline的Onchange事件因而可保證在任何時候OnDragDrop事件中用到的CurrentDirList數組項不為空字符串

  如何保證移動拷貝與子窗口的無關性?

  在這裡一個關鍵問題是我們判斷源控件時是用is操作符進行類型檢查

  If Source is TFileList then

  …

  如果我們用下面的語句

  If Source = FileList then

  …

  則移動拷貝操作將限制在本子窗口范圍內

  當解決了上述問題後我們的工作就只是遵循拖放的一般開發步驟按步就班來完成了

  FileList開始拖動操作

  procedure TFMFormFileListMouseDown(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單獨處理鼠標事件而並不開始拖動事實上這種情況是大量存在的

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25211.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.