在我們經常使用的軟件比如photoshopofficedelphi等等我們經常可以對工具欄進行拖拽操作將相關的工具欄拖拉出來形成獨立的小窗口或者將幾個工具欄進行互相的組合!(這些就是我們常說的DOCK功能)
其實利用DELPHI或是其它的可視化編程工具(如c++ builder等)很容易實現上面的功能!下面我們通過一個小例子來看看它是如何實現的這裡使用的編程工具為Delphi!
開始實例前先要說明些東東!(講些廢話先^_^)
可視化的VCL元件皆支持DOCK功能!
在delphi中所有繼承自Tcontrol及TWinControl的VCL元件都支持dock功能
基本上要進行dock動作至少需要兩個元件一個是被附著的dock site元件另一個是附著在dock site的元件DELPHI所提供的可視化元件中只有繼承自TWinControl的VCL元件才具有dock site的功能而只要是繼承自Tcontrol的VCL元件則都具有附著在dock site的功能
* 如果你希望某個繼承自TWinControl的元件具有dock site的功能只要把該元件的屬性DockSite設成true即可
* 若是要把某個繼承自TControl的元件附著在dock site上只要把屬性Drag kind設成dkDock屬性DragMode設成dmAutomatic即可
當程序執行後你就可以利用鼠標把後者元件拖拉到前者元件上進行dock動作至於dock的實際動作都被封裝在元件內用戶根本不用管這些動作是如何進行的
馬上開始我們的實例!
新建一個普通的工程(project)從win控件頁中拖拉一個CoolBar一個ToolBar一個ImageList到form窗體中屬性設置如下
Form
Caption: 實例一DOCK功能的實現
CoolBar(被附著的dock site元件)
AutoSize: true;
DockSite: true;
為了一些更好的效果你可以對BorderWidthEdgeBordersEdgeInner EdgeOuter進行相關的設置!
ToolBar(附著在dock site的元件)
在ToolBar元件上點擊右鍵選擇New Button新建一些按鈕它們之間可以通過New Separator進行相關組的分隔!
Caption: 工具欄(獨立出來時窗口顯示的標題)
AutoSize: true
DockKind: dkDock
DragMode: dmAutomatic
Flat: ture(這樣好看些)
Images: ImageList
同樣為了一些更好的效果你可以對BorderWidthEdgeBordersEdgeInner EdgeOuter進行相關的設置!
ImageList雙擊該控件選擇Add…添加幾幅圖片這樣可以很方便地將這些圖片賦於ToolBar中的Button!
點擊運行按鈕你拖拽下你的工具欄是不是馬上就可以看到效果啦?我們還沒有編寫一行代碼呢????這就是Delphi的強大之處!
為了更好地進行拖拽操作我們添加下面幾行代碼!(主要是CoolBar的onDragOveronDockDrop和UnDock事件)
unit sample;
interface
uses
Windows Messages SysUtils Classes Graphics Controls Forms Dialogs
ImgList ComCtrls ToolWin;
type
TForm = class(TForm)
ImageList: TImageList;
CoolBar: TCoolBar;
ToolBar: TToolBar;
ToolButton: TToolButton;
ToolButton: TToolButton;
ToolButton: TToolButton;
ToolButton: TToolButton;
ToolButton: TToolButton;
ToolButton: TToolButton;
ToolButton: TToolButton;
procedure CoolBarDragOver(Sender Source: TObject; X Y: Integer;
State: TDragState; var Accept: Boolean);
procedure CoolBarDockDrop(Sender: TObject; Source: TDragDockObject; X
Y: Integer);
procedure CoolBarUnDock(Sender: TObject; Client: TControl;
NewTarget: TWinControl; var Allow: Boolean);
procedure ToolButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form: TForm;
implementation
{$R *DFM}
procedure TFormCoolBarDragOver(Sender Source: TObject; X Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:=(source=ToolBar); //指定接受拖拽操作的條件是拖拽對象為ToolBar;
end;
procedure TFormCoolBarDockDrop(Sender: TObject; Source: TDragDockObject;
X Y: Integer);
begin
ToolBarAutoSize:=false; //當元件拖到dock site元件上面並且放開鼠標左鍵之後此事件就會被執行
ToolBarAlign:=altop; //為了便於拖拽將toolbar的寬度與coolbar相近
ToolBarWidth:=CoolBarWidth;
end;
procedure TFormCoolBarUnDock(Sender: TObject; Client: TControl;
NewTarget: TWinControl; var Allow: Boolean);
begin
ToolBarAutoSize:=true; //當元件一拖離dock site元件時此事就會被執行
ToolBarCaption:=工具欄; //設定獨立工具欄窗口的大小和標題
end;
procedure TFormToolButtonClick(Sender: TObject);
begin
Close; //退出程序
end;
end
下面列出與DOCK功能有關的事件
OnDragDrop: 當元件被拖動時此事件被執行
OnDragOver: 用於指定元件可以被拖動的條件
OnDockDrop: 當元件拖到dock site元件上面並且放開鼠標左鍵之後此事件就會被執行
OnDockOver當元件一拖到dock site元件上此事件就會被執行
OnUnDock當元件一拖離dock site元件時此事就會被執行
OnGetSiteInfo取得dock site元件的一些信息
好了通過一個小小的拖放工具欄的例子我們馬上就可以體會到Delphi的易用與強大之處!以後我會繼續寫一些關於用Delphi進行實例編程的文章!各位Delphi愛好者大家將Delphi進行到底吧!小生水平有限如有不對之處請各位網友指出!謝謝! aatun@net
From:http://tw.wingwit.com/Article/program/Delphi/201311/25011.html