人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當(dāng)前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

第9章 Delphi拖放編程

第9章 Delphi拖放編程

更新時(shí)間:2022-07-12 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

拖放(DragDrop)是Windows提供的一種快捷的操作方式。作為基于Windows的開發(fā)工具,Delphi同樣支持拖放操作,而且開發(fā)應(yīng)用系統(tǒng)的拖放功能十分方便,真正體現(xiàn)了Delphi的強(qiáng)大功能和方便性。
  Delphi提供的所有控件(Control,即能獲得輸入焦點(diǎn)的部件)都支持拖放操作,并有相應(yīng)的拖放屬性、拖放事件和拖放方法。下面我們先介紹控件的拖放支持,而后再給出開發(fā)拖放操作的一般步驟和應(yīng)用實(shí)例。 

  9.1 控件的拖放支持 

  拖放操作中控件可以分為源控件和目標(biāo)控件兩類。絕大部分控件既可以作為源控件也可以作為目標(biāo)控件。但也有一部分控件只能支持其中的一種。 

  9.1.1 拖放屬性 

  拖放屬性主要有兩個(gè):

  ● DragMode : 拖動(dòng)模式

  ● DragCursor : 拖動(dòng)光標(biāo) 

  它們都是在拖放的源控件中設(shè)置。DragMode控制用戶在運(yùn)行時(shí)間內(nèi)當(dāng)在控件上按下鼠標(biāo)時(shí)控件如何反應(yīng)。如果DragMode置為dmAutomatic,那么當(dāng)用戶在控件上按下鼠標(biāo)時(shí)拖動(dòng)自動(dòng)開始;如果DragMode置為dmManual(這是缺省值),則將通過處理鼠標(biāo)事件來判斷一個(gè)拖動(dòng)是否可以開始。

  DragCursor用于選擇拖動(dòng)時(shí)顯示的光標(biāo),缺省值是CrDrag,一般不要去修改它。在程序設(shè)計(jì)過程中通用的界面規(guī)范應(yīng)該得到開發(fā)者的尊重。但有時(shí)候?yàn)榱颂囟ǖ哪康模_發(fā)者也可以把自己設(shè)計(jì)的光標(biāo)賦給DragCursor。 

  9.1.2 拖放事件 

  拖放事件主要有三個(gè):

  ●OnDragOver:拖動(dòng)經(jīng)過時(shí)激發(fā)

  ●OnDragDrop:拖動(dòng)放下時(shí)激發(fā)

  ●OnEndDrop :拖動(dòng)結(jié)束時(shí)激發(fā) 

  前兩個(gè)事件由目標(biāo)控件響應(yīng),后一個(gè)事件由源控件響應(yīng)。

  OnDragOver事件最主要的功能是確定當(dāng)用戶就地放下拖動(dòng)時(shí)控件是否可以接受。它的參數(shù)包括: 

  Source : TObject;  {源控件}

  X,Y : Integer; {光標(biāo)位置}

  State : TDragState; {拖動(dòng)狀態(tài)}

  var Accept : Boolean {能否接受} 

  TDragState是一個(gè)枚舉類型,表示拖放項(xiàng)目與目標(biāo)控件的關(guān)系。 

   type

  TDragState = (dsDragEnter, dsDragLeave, dsDragMove);

  不同取值的意義如下表:

  表9.1 DragState 的取值與意義

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━

  取 值 意 義

  ───────────────────────────

  dsDragEnter 拖動(dòng)對象進(jìn)入一個(gè)允許拖動(dòng)對象放下

  的控件中。為缺省狀態(tài)。

  dsDragLeave 拖動(dòng)對象離開一個(gè)允許拖動(dòng)對象放下

  的控件。

  dsDragMove 拖動(dòng)對象在一個(gè)允許拖動(dòng)對象放下的

  控件內(nèi)移動(dòng)。

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━  

  用戶可以利用提供的參數(shù)來確定放下的拖動(dòng)是否可被接受,如:

  ● 判斷源控件類型: 

   Accept := Source is TLabel;

  ● 判斷源控件對象: 

   Accept := (Source = TabSet1);

  ● 判斷光標(biāo)位置:

  見(9.2),(9.3)中的例程。 

  ● 判斷拖動(dòng)狀態(tài): 

   If (Source is TLabel) and (State = dsDragMove) then

   begin

  source.DragIcon := ' New.Ico ';

  Accept := True;

   end

   else

   Accept := False;

  當(dāng)Accept=True時(shí),目標(biāo)控件可以響應(yīng)OnDragDrop事件,用于確定拖動(dòng)被放下后程序如何進(jìn)行處理。

  OnDragDrop事件處理過程的參數(shù)包括源控件和光標(biāo)位置。這些信息可用于處理方式的確定。

  OnEndDrag事件是在拖動(dòng)操作結(jié)束后由源控件來進(jìn)行響應(yīng)的,用于源控件進(jìn)行相應(yīng)的處理。拖動(dòng)操作結(jié)束既包括拖動(dòng)放下被接受,也包括用戶在一個(gè)不能接受放下的控件上釋放了鼠標(biāo)。該事件處理過程的參數(shù)包括目標(biāo)控件(Target)和放下位置的坐標(biāo)。如果Target=nil, 表示拖動(dòng)項(xiàng)目沒有被任何控件接受。

  在第3節(jié)將介紹的文件拖放移動(dòng)、拖放拷貝操作中,如果操作成功,則文件列表框應(yīng)更新顯示內(nèi)容。下面這段程序用于實(shí)現(xiàn)這一功能。 

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

  begin

  if Target <> nil then FileList.Update;

  end;

  除以上介紹的三個(gè)事件外,還有一個(gè)事件onMouseDown 也常用于拖放操作的響應(yīng)。onMouseDown雖然不是一個(gè)專門的拖放事件,但在人工模式下拖動(dòng)的開始是在這一事件的處理過程中實(shí)現(xiàn)的。 

  9.1.3 拖放方法 

  拖放方法有三個(gè):

  ●BeginDrag : 人工方式下開始一個(gè)拖動(dòng)

  ●EndDrag : 結(jié)束一個(gè)拖動(dòng)

  ●Dragging : 判斷一個(gè)控件是否正被拖動(dòng) 

  這三個(gè)方法都被源控件使用。

  當(dāng)DragMode置為dmManual時(shí),拖動(dòng)必須調(diào)用控件的BeginDrag方法才能開始。BeginDrag有一個(gè)布爾參數(shù)Immediate。如果輸入?yún)?shù)為True,拖動(dòng)立即開始,光標(biāo)改變到DragCursor的設(shè)置。如果輸入?yún)?shù)為False,直到用戶將光標(biāo)移動(dòng)了一定的距離(5個(gè)象素點(diǎn))后才改變光標(biāo),開始拖動(dòng)。這就允許控件接受一個(gè)onClick事件而并不開始拖動(dòng)操作。

  EndDrag方法中止一個(gè)對象的被拖動(dòng)狀態(tài)。它有一個(gè)布爾參數(shù)Drop。如果Drop設(shè)置為True,被拖動(dòng)的對象在當(dāng)前位置放下(能否被接受由目標(biāo)控件決定);如果Drop設(shè)置為False,則拖動(dòng)就地被取消。

  下面一段程序表明當(dāng)拖動(dòng)進(jìn)入一控制面板時(shí)拖動(dòng)被取消。     

  procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;

  State: TDragState; var Accept: Boolean);

  begin

  Accept := False;

  if (Source is TLabel) and (State = dsDragEnter) then

  (Source as TLabel).EndDrag(False);

  end;

  Draging方法判斷一個(gè)控件是否正被拖動(dòng)。在下面的例子中當(dāng)用戶拖動(dòng)不同的檢查框時(shí)窗口改變?yōu)椴煌念伾!?

  procedure TForm1.FormActivate(Sender: TObject);

  begin

  CheckBox1.DragMode := dmAutomatic;

  CheckBox2.DragMode := dmAutomatic;

  CheckBox3.DragMode := dmAutomatic;

  end; 

  procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;

  State: TDragState; var Accept: Boolean);

  begin

  if CheckBox1.Dragging then

  Color := clAqua;

  if CheckBox2.Dragging then

  Color := clYellow;

  if CheckBox3.Dragging then

  Color := clLime;

  end; 

  9.2 開發(fā)拖放功能的一般步驟 

  拖放作為Windows提供的一種方便操作對象的功能,在Delphi中可以很容易地開發(fā)出來。根據(jù)拖放操作的過程可以把開發(fā)步驟劃分為四個(gè)階段,即:

  ● 開始拖動(dòng)操作

  ● 接收拖動(dòng)項(xiàng)目

  ● 放下拖動(dòng)項(xiàng)目

  ● 終止拖動(dòng)操作 

  在介紹過程中我們將結(jié)合一個(gè)TabSet(標(biāo)簽集)的拖放操作實(shí)例。界面設(shè)計(jì)如圖。在運(yùn)行時(shí)當(dāng)用戶把一個(gè)標(biāo)簽拖動(dòng)到另一個(gè)標(biāo)簽的位置時(shí),該標(biāo)簽將移動(dòng)到該位置并引起標(biāo)簽集的重新布置。

  9.2.1 開始拖動(dòng)操作 

  當(dāng)拖動(dòng)模式(DragMode)設(shè)置為dmAutomatic時(shí),用戶在源控件上按下鼠標(biāo)時(shí)拖動(dòng)自動(dòng)開始;當(dāng)設(shè)置為dmManual時(shí)通過處理鼠標(biāo)事件來決定拖動(dòng)是否開始。如果想開始拖動(dòng)調(diào)用BeginDrag方法。

  在TabSet拖放中,我們用下面的MouseDown事件處理過程來開始一個(gè)標(biāo)簽的拖動(dòng)。首先判斷按下的是否是左鍵,而后再判斷項(xiàng)目是否合法。 

  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; 

  

[1] [2]  下一頁

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
主站蜘蛛池模板: 铜川市| 明光市| 郯城县| 长乐市| 自治县| 岢岚县| 曲周县| 延寿县| 巨野县| 霍州市| 利川市| 红桥区| 镇康县| 衡水市| 康乐县| 汤阴县| 汽车| 厦门市| 庆元县| 阆中市| 新疆| 南京市| 眉山市| 年辖:市辖区| 建平县| 全州县| 西畴县| 长寿区| 高安市| 昆山市| 柏乡县| 拉孜县| 田阳县| 海盐县| 外汇| 太康县| 宜春市| 长白| 蒙山县| 长治市| 连平县|