日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Delphi自带的TDockTabSet组件实现停靠功能(Jeremy North)

發布時間:2025/6/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Delphi自带的TDockTabSet组件实现停靠功能(Jeremy North) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

源地址:http://edn.embarcadero.com/article/33446

摘要: Instructions on how to use the TDockTabSet component to make advanced docking user interfaces.

Introduction

?

This article discusses the use of the TDockTabSet component that was originally introduced in Delphi 2005.

Creating the applications main form

Create a File | New | VCL Forms Application - Delphi for Win32.

Setting up the main form
Locate the TDockTabSet component??on the additional page in the Tool Palette and drop it onto the main form.

  • Set the following properties:
  • ?

    AlignalLeft
    DockSiteFalse
    ShrinkToFitTrue
    StyletsModernTabs
    TabPositiontpLeft
    Width25

    You may want to use the tsModernPopup tab style instead of the tsModernTabs. The download that accompanies this article does.


    To keep the TDockTabSet component company on the form, drop the following components and modify the properties as indicated.
  • TPanel
  • AlignalTop
    BevelKindbkTile
    BevelOuterbvNone
    Caption

  • TPanel
  • AlignalLeft
    BevelOuterbvNone
    DockSiteTrue
    NamepDockLeft
    Width0

  • TSplitter
  • AlignalLeft

  • TMemo
  • AlignClient

  • Drop a TButton on the top aligned Panel and set its caption to?Show Form
  • Set the Forms caption to?TDockTabSetDemo Application
  • Name the form?frmMain?and save the unit as?MainForm

    ?

    ?

  • If you name your components differently remember to reference the correct name when adding the source code.


    The main form of your application should look something like the following.

    The setting of the all important property

    ?

    There is one more property that needs to be set on the TDockTabSet before we can continue. Set the?DestinationDockSite?to be the left aligned panel. Called pDockLeft in this article.

    ?

    Now it's time to create another form for the application. There are now 3 ways this can be done in Delphi 2006 and I'll mention all of them:

  • Select the File | New | Form for Win32 or
  • Click on the Project Manager
  • In the Tool Palette you will see the object repository items get added.
  • Locate the Delphi Projects | Delphi Files category.
  • Double click on the Form icon to create a New Form.
  • Right click on the project manager and select the Add New menu item. From the sub menu select Form.
  • I prefer the 3rd method, which is new to Delphi 2006 and I've discussed previously on my?blog.
    Name the new form frmDock and save the unit as DockForm.
    In the code editor for this unit do the following.
  • Delete the global frmDock: TfrmDock variable from the forms implementation section, it isn't required
  • Make sure the form isn't in the list of forms that are created automatically (I always turn this option off by default). To do this select the Project | Options menu item and move frmDock to the Available Forms list for the Forms option page.
  • Add an OnClose event that contains the following code
  • 1 2 3 4 5 6 7 8 9 procedure?TfrmDock.FormClose(Sender: TObject; var?Action: TCloseAction); begin ??ManualFloat(Rect(0, 0, 0, 0)); ??Action := caFree; end;

    4.Add an OnStartDock event that contains the following code

    1 procedure?TfrmDock.FormStartDock(Sender: TObject; var?DragObject:<br data-filtered="filtered"><br data-filtered="filtered">? TDragDockObject);<br data-filtered="filtered"><br data-filtered="filtered">begin<br data-filtered="filtered"><br data-filtered="filtered">? DragObject := TDragDockObjectEx.Create(Self);<br data-filtered="filtered"><br data-filtered="filtered">? DragObject.Brush.Color := clAqua; // this will display a red outline<br data-filtered="filtered"><br data-filtered="filtered">end;<br data-filtered="filtered">
    5.Create a new class function called CreateDockForm that accepts a TColor, returns a TCustomForm and contains the following code.

    1 class?function?TfrmDock.CreateDockForm(const?aColor: TColor): TCustomForm;<br data-filtered="filtered"><br data-filtered="filtered">begin<br data-filtered="filtered"><br data-filtered="filtered">? result := TfrmDock.Create(Application);<br data-filtered="filtered"><br data-filtered="filtered">? result.Color := aColor;<br data-filtered="filtered"><br data-filtered="filtered">? result.Caption := ColorToString(aColor);<br data-filtered="filtered"><br data-filtered="filtered">? result.Show;<br data-filtered="filtered"><br data-filtered="filtered">end;<br data-filtered="filtered">

    6.Finally modify the following properties on the dock form

    BorderStylebsSizeToolWin
    DragKinddkDock
    DragModedmAutomatic


    You may also want to modify the size of the frmDock form to not be so wide.
    That is the form that will be docked completed. Time to write some in the main unit!

    ?

    Switch to the MainForm unit now and make the following changes.

    1.Invoke the Use Unit dialog (Alt+F11 or File | Use Unit) and select the DockForm unit.
    2.Create an OnClick event for the TButton with the following code

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 procedure?TfrmMain.Button1Click(Sender: TObject); var ??i: Integer; begin ??// close all previously dockable forms before recreating ??for?i := 0?to?Screen.FormCount - 1?do ????if?Screen.Forms[i] is?TfrmDock then ??????Screen.Forms[i].Close; ??// dock to the component called pDockLeft ??TfrmDock.CreateDockForm(clBlue).ManualDock(pDockLeft); ??// dock to the top on the pDockLeft panel ??TfrmDock.CreateDockForm(clGreen).ManualDock(pDockLeft, nil, alTop); ??// dock to the right on the pDockLeft panel ??TfrmDock.CreateDockForm(clRed).ManualDock(pDockLeft, nil, alRight); ??// dock directly to the DockTabSet ??TfrmDock.CreateDockForm(clWhite).ManualDock(DockTabSet1); end;

    The remaining code is required to get the docking behavior to play nice amongst each other.

    ?

    1.Create an OnDockDrop event for the pDockLeft panel and add the following code
    This OnDockDrop event makes sure that the width of the pDockLeft panel is sufficient for when the frmDock form is dropped on it. If the panel previously had a width of 0 (which means you can't see it) then set the width to 150. This value is hardcoded for the demo but I could have easily read the current width of the control being dropped and using that value. You can get the width of the control being dropped from the TDragDockObject passed in as the?Source?parameter. You would use the following to get the width of the control that is being dropped:

    ?

    1 pDockLeft.Width := Source.Control.Width;

    The OnDockDrop code also makes sure that the splitter is visible when a form is being docked and that it is in the correct position.

    ?

    1 2 3 4 5 6 7 procedure?TfrmMain.pDockLeftDockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer); begin ??if?pDockLeft.Width = 0?then ????pDockLeft.Width := 150; ??Splitter1.Visible := True; ??Splitter1.Left := pDockLeft.Width; end;

    2.Create an OnUndock event for the pDockLeft panel and add the following code
    If the form being undocked is the last one on it then we need to set the Panels width back to 0 and hide the Splitter.

    ?

    1 2 3 4 5 6 7 8 procedure?TfrmMain.pDockLeftUnDock(Sender: TObject; Client: TControl; NewTarget: TWinControl; var?Allow: Boolean); begin ??if?pDockLeft.DockClientCount = 1?then ??begin ????pDockLeft.Width := 0; ????Splitter1.Visible := False; ??end; end;
    3.Create an OnDockOver event for the pDockLeft panel and add the code below.
    The DockOver event is the event responsible for drawing the forms outline at the dock site.

    1 2 3 4 5 6 7 8 9 10 11 12 13 procedure?TfrmMain.pDockLeftDockOver(Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; ??var?Accept: Boolean); var ??lRect: TRect; begin ??Accept := Source.Control is?TfrmDock; ??if?Accept then ??begin ????lRect.TopLeft := pDockLeft.ClientToScreen(Point(0, 0)); ????lRect.BottomRight := pDockLeft.ClientToScreen(Point(150, pDockLeft.Height)); ????Source.DockRect := lRect; ??end; end;
    4.Create an OnDockDrop event for the DockTabSet1 component and add the code below.
    If a control is being docked to the DockTabSet component we want to make sure it is visible.

    ?

    1 procedure?TfrmMain.DockTabSet1DockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer);<br data-filtered="filtered">begin<br data-filtered="filtered">? DockTabSet1.Visible := True;<br data-filtered="filtered">end;<br data-filtered="filtered">
    5.Create an OnTabRemoved event for the DockTabSet1 component and add the following below.
    The DockTabSet1 component should only be visible if there is a control docked to it.

    1 2 3 4 procedure?TfrmMain.DockTabSet1TabRemoved(Sender: TObject); begin ??DockTabSet1.Visible := DockTabSet1.Tabs.Count > 0; end;
    How the created forms should look in the Structure View window

    More action shots


    Application appearance on startup

    Tab selected. Note you can click on the pin button to pin the green form to the docksite or click on the cross to close the form. To not do anything, click in the memo to change the focus away from the green form to hide it.


    Dragging an undocked form, note the red drag outline

    Hide image

    All windows unpinned


    What about VCL.NET support?

    ?

    Unfortunately there is a bug in the VCL.NET implementation of the TDockTabSet component. It is currently logged in QualityCentral and hopefully it will be addressed in the next major Delphi release.

    ?

    Report No: 24640 ( RAID: 238759 ) Status: Open
    TDockTabSet control doesn't work correctly in VCL.NET
    http://qc.borland.com/wc/qcmain.aspx?d=24640

    ?

    The bug cannot be fixed in an update as it requires an interface change to the TDockTabSet class. If you wish to fix the bug yourself you can use the following workaround:

    ?

    Move the?DoAddDockClient?method from?strict private?to?protected?and?override?it.

    previously...

    TDockTabSet = class(TTabSet)
    strict private
    procedure DoAddDockClient(Client: TControl; const ARect: TRect);
    should become... TDockTabSet = class(TTabSet)
    protected
    procedure DoAddDockClient(Client: TControl; const ARect: TRect); override;

    You also have to take the necessary steps to ensure that the modified unit is compiled into your assembly as well.

    ?

    An alternate approach might be:

  • Create a new Delphi.NET package
  • Save the package and name it FixedDockTabSetNET100
  • Open the Borland.VCL.TDockTabSet unit from the sourceDotNetVCL folder
  • Select File | Save As... and save a copy of the unit in the folder where you saved the package and rename the package to FixedDockTabSet
  • In the FixedDockTabSet unit right click on the TDockTabSet class name and select Rename refactoring. Rename the class to TFixedDockTabSet
  • Create a global function called Register and implement it as follows:
  • procedure Register;
    begin
    RegisterComponents('Fixed DockTabSet', [TFixedDockTabSet]);
    end;
    Build the new package Install the package using the Installed .NET Components menu item from the components menu, making sure to add it to the VCL.NET components tab. If all worked well when you create a new VCL.NET Application you will get a?Fixed DockTabSet?palette page that has the new TDockTabSet control on it.

    ?

    Closing comments

    With the help of the TDockTabSet component you can now create more advanced user interfaces with dockable windows which is sure to annoy most users. With a lot more hair pulling and sleepless nights, you can use the code in this article as a basis to create your our docking framework. I've done this as part for my QualityCentral windows client I created.
    I encourage you to download and try it out from my website?www.jed-software.com.

    ?

    Hide image

    Hide image


    While doing so, don't forget to add any issues or enhancements to QualityCentral.
    Source Download

    ?

    You can download the source to this article from Code Central:
    ??Download Source Code



    本文轉自 不得閑 博客園博客,原文鏈接:http://www.cnblogs.com/DxSoft/archive/2010/12/15/1906408.html?? ,如需轉載請自行聯系原作者

    總結

    以上是生活随笔為你收集整理的使用Delphi自带的TDockTabSet组件实现停靠功能(Jeremy North)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。