首頁 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡(luò)課程 模擬考試 考友錄 實(shí)用文檔 求職招聘 論文下載
2011中考 | 2011高考 | 2012考研 | 考研培訓(xùn) | 在職研 | 自學(xué)考試 | 成人高考 | 法律碩士 | MBA考試
MPA考試 | 中科院
四六級 | 職稱英語 | 商務(wù)英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT
新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學(xué)習(xí) | 法語 | 德語 | 韓語
計(jì)算機(jī)等級考試 | 軟件水平考試 | 職稱計(jì)算機(jī) | 微軟認(rèn)證 | 思科認(rèn)證 | Oracle認(rèn)證 | Linux認(rèn)證
華為認(rèn)證 | Java認(rèn)證
公務(wù)員 | 報(bào)關(guān)員 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 期貨從業(yè)資格 | 司法考試 | 法律顧問 | 導(dǎo)游資格
報(bào)檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務(wù)師 | 跟單員 | 單證員 | 物流師 | 價(jià)格鑒證師
人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業(yè)資格 | 廣告師職業(yè)水平
駕駛員 | 網(wǎng)絡(luò)編輯
衛(wèi)生資格 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 執(zhí)業(yè)護(hù)士
會計(jì)從業(yè)資格考試會計(jì)證) | 經(jīng)濟(jì)師 | 會計(jì)職稱 | 注冊會計(jì)師 | 審計(jì)師 | 注冊稅務(wù)師
注冊資產(chǎn)評估師 | 高級會計(jì)師 | ACCA | 統(tǒng)計(jì)師 | 精算師 | 理財(cái)規(guī)劃師 | 國際內(nèi)審師
一級建造師 | 二級建造師 | 造價(jià)工程師 | 造價(jià)員 | 咨詢工程師 | 監(jiān)理工程師 | 安全工程師
質(zhì)量工程師 | 物業(yè)管理師 | 招標(biāo)師 | 結(jié)構(gòu)工程師 | 建筑師 | 房地產(chǎn)估價(jià)師 | 土地估價(jià)師 | 巖土師
設(shè)備監(jiān)理師 | 房地產(chǎn)經(jīng)紀(jì)人 | 投資項(xiàng)目管理師 | 土地登記代理人 | 環(huán)境影響評價(jià)師 | 環(huán)保工程師
城市規(guī)劃師 | 公路監(jiān)理師 | 公路造價(jià)師 | 安全評價(jià)師 | 電氣工程師 | 注冊測繪師 | 注冊計(jì)量師
繽紛校園 | 實(shí)用文檔 | 英語學(xué)習(xí) | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲

2011計(jì)算機(jī)等級考試Delphi講義:Delphi拖放編程

Delphi提供的所有控件(Control,即能獲得輸入焦點(diǎn)的部件)都支持拖放操作,并有相應(yīng)的拖放屬性、拖放事件和拖放方法。

  9.2.2 接收拖動項(xiàng)目

  一個控件能否接收拖動項(xiàng)目是由該控件的OnDragOver事件決定的。在TabSet拖動中,主要是利用鼠標(biāo)的位置進(jìn)行判斷。

  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 放下拖動項(xiàng)目

  當(dāng)OnDragOver事件處理過程返回的Accept為True且項(xiàng)目被放下時(shí),由OnDragDrop事件處理過程來完成拖動放下后的響應(yīng)。在TabSet拖放實(shí)例中是改變標(biāo)簽的位置。

  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 結(jié)束拖動操作

  結(jié)束拖動操作的方式有兩種:或者是用戶釋放了鼠標(biāo)鍵或者是程序用EndDrag方法強(qiáng)行中止拖動。結(jié)束拖動操作的后果有兩種:放下被接受或放下被忽略。

  拖動操作結(jié)束后源控件都要收到一條消息響應(yīng)拖動結(jié)束事件OnEndDrag。

  9.3 拖放應(yīng)用實(shí)例:文件管理器的拖放支持

  在第六章最后開發(fā)的文件管理器應(yīng)用實(shí)例,雖然功能上已初具規(guī)模,但在操作上與Windows的文件管理器相比還有很大不足。其中最大的缺陷是它不支持文件的拖放移動和拖放拷貝。在這一章結(jié)束的時(shí)候,我們可以來彌補(bǔ)這一缺陷了。

  文件拖放移動指的是當(dāng)用戶把一個文件拖動到目錄樹下的某一目錄并放下時(shí),文件將自動移動到該目錄中;文件拖放拷貝指的是當(dāng)用戶把一個文件拖動到某個驅(qū)動器標(biāo)簽上并放下時(shí),文件將自動拷貝到該驅(qū)動器的當(dāng)前目錄下。作為源控件的文件列表框和作為目標(biāo)控件的目錄樹、驅(qū)動器標(biāo)簽可以位于不同的子窗口。驅(qū)動器的當(dāng)前目錄是任一子窗口的最新操作結(jié)果,而不論這一子窗口與拖動源、拖動目標(biāo)是否有關(guān)系。

  為了實(shí)現(xiàn)上述功能,有兩個問題必須首先解決:

  1.如何記錄每一驅(qū)動器的當(dāng)前目錄?

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

  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在響應(yīng)OnDragDrop事件前先響應(yīng)OnClick事件,并由該事件激發(fā)DirectoryOutline的Onchange事件,因而可保證在任何時(shí)候OnDragDrop事件中用到的CurrentDirList數(shù)組項(xiàng)不為空字符串。

  2.如何保證移動、拷貝與子窗口的無關(guān)性?

  在這里一個關(guān)鍵問題是我們判斷源控件時(shí)是用is操作符進(jìn)行類型檢查:

  If Source is TFileList then

  …

  如果我們用下面的語句:

  If Source = FileList then

  …

  則移動、拷貝操作將限制在本子窗口范圍內(nèi)。

  當(dāng)解決了上述問題后我們的工作就只是遵循拖放的一般開發(fā)步驟,按步就班來完成了。

  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用來檢查當(dāng)前是否有文件存在。而BeginDrag方法傳遞參數(shù)False, 允許FileList單獨(dú)處理鼠標(biāo)事件而并不開始拖動。事實(shí)上這種情況是大量存在的。

  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需檢查是否是合法的標(biāo)簽。

  3.拖動放下的響應(yīng)

  DirectoryOutline的拖動放下用于實(shí)現(xiàn)文件移動功能。程序中調(diào)用ConfirmChange事件處理過程,目標(biāo)路徑由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的拖動放下用于實(shí)現(xiàn)文件拷貝功能。程序中把當(dāng)前位置轉(zhuǎn)化為相應(yīng)的驅(qū)動器號,目標(biāo)路徑由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響應(yīng)拖動結(jié)束,更新文件列表

  procedure TFMForm.FileListEndDrag(Sender, Target: TObject; X, Y: Integer);

  begin

  if Target <> nil then FileList.Update;

  end;

  到目前為止,我們的文件管理器功能已足夠強(qiáng)大。 不過還有許多問題值得讀者去進(jìn)一步探討,如:

  1.文件與應(yīng)用程序關(guān)聯(lián)的建立;

  2.在文件列表框中顯示更多的文件信息;

  3.文件列表框中的文件按后綴各排序等。

  文件管理器是一個真正的綜合例程,對它的鉆研會使您更進(jìn)一步模到Delphi編程的精髓。

  相關(guān)推薦:2010年9月計(jì)算機(jī)等級考試試題及答案解析專題
       預(yù)告:名師解析2010年9月計(jì)算機(jī)等級考試試題答案
       2010年9月計(jì)算機(jī)等級考試成績查詢時(shí)間及入口
       2010年9月計(jì)算機(jī)等考成績查詢短信免費(fèi)提醒開通
文章搜索
版權(quán)聲明:如果計(jì)算機(jī)等級考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系800@exam8.com,我們將會及時(shí)處理。如轉(zhuǎn)載本計(jì)算機(jī)等級考試網(wǎng)內(nèi)容,請注明出處。