« ☆TCategoryButtonsを使ってみる。 | トップページ | ■TMS Advanced ToolBars & Menusアップデート »

☆TDockTabSetを使ってみる。

Delphiを使っておられる方なら、新コンポーネントの仕様通りに動作しない点やメモリ違反に 悩まされた方も多いと思います。私、昔は率先して新コンポーネント採用してきた方なのですが、 ひどい経験を積み重ねる内に、新コンポーネントの採用は敬遠するようになっていました(笑)

このTDockTabSetも同様で、全く使っていなかったのですが、 Delphi2005で登場してから2世代経って、問題なく動作しているようですね。 (当初から問題なかったのかどうかは知りませんが)

CodeGearのサイトに左側にTDockTabSetを表示するサンプルがあるのですが、 今回は右側に表示させてみました。(ほとんどサンプルのままですけど)

Memo1、Splitter1、Panel1、DockTabSet1を図のように配置します。

Tdocktabset1

次にコードです。
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Tabs, DockTabSet, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Splitter1: TSplitter;
    Panel1: TPanel;
    DockTabSet1: TDockTabSet;
    procedure FormShow(Sender: TObject);
    procedure DockTabSet1TabRemoved(Sender: TObject);
    procedure DockTabSet1DockDrop(Sender: TObject; Source: TDragDockObject; X,
      Y: Integer);
    procedure Panel1DockDrop(Sender: TObject; Source: TDragDockObject; X,
      Y: Integer);
    procedure Panel1DockOver(Sender: TObject; Source: TDragDockObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    procedure Panel1UnDock(Sender: TObject; Client: TControl;
      NewTarget: TWinControl; var Allow: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2, Unit3,
   ComCtrls; // ←tpLeftが宣言されています。

{$R *.dfm}

const
  FormWidth = 180;

// 初期設定
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Panel1の設定
  Panel1.DockSite := True;
  Panel1.Width := 0;

  // DockTabSet1の設定
  DockTabSet1.Width := 25;
  DockTabSet1.DockSite := False;
  DockTabSet1.ShrinkToFit := True;
  DockTabSet1.Style := tsModernTabs;
  DockTabSet1.DestinationDockSite := Panel1;
  DockTabSet1.TabPosition := tpLeft;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Panel1.Caption := '';

  // フォームの幅
  Form2.Width := FormWidth;
  Form3.Width := FormWidth;

  // フォームが一瞬表示されてしまうので、画面の外に表示させます。
  Form2.Left := -2000;
  Form3.Left := -2000;

  // フォームの表示
  Form2.Show;
  Form3.Show;

  Form2.ManualDock(Panel1);


  // 収納して表示
  Form3.ManualDock(DockTabSet1);
  //Form3.ManualDock(Panel1, nil, alBottom);
end;

procedure TForm1.DockTabSet1DockDrop(Sender: TObject; Source: TDragDockObject;
  X, Y: Integer);
begin
  DockTabSet1.Visible := True;
  // 次の処理をしないとPanel1の左側に表示される
  DockTabSet1.Left := Form1.Width;
end;

procedure TForm1.DockTabSet1TabRemoved(Sender: TObject);
begin
  DockTabSet1.Visible := DockTabSet1.Tabs.Count > 0;
end;

procedure TForm1.Panel1DockDrop(Sender: TObject; Source: TDragDockObject; X,
  Y: Integer);
begin
  if Panel1.Width = 0 then
    Panel1.Width := FormWidth;
  Splitter1.Visible := True;
  Splitter1.Left :=  Self.Width -(Panel1.Width + DockTabSet1.Width)-1;
  DockTabSet1.Left := Form1.Width;
end;

procedure TForm1.Panel1DockOver(Sender: TObject; Source: TDragDockObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
var
  Rect: TRect;
begin
  Accept := (Source.Control = Form2) or (Source.Control = Form3);
  if Accept then
  begin
    Rect.TopLeft := Panel1.ClientToScreen(Point(0, 0));
    Rect.BottomRight := Panel1.ClientToScreen(Point(FormWidth, Panel1.Height));
    Source.DockRect := Rect;
  end;
end;

procedure TForm1.Panel1UnDock(Sender: TObject; Client: TControl;
  NewTarget: TWinControl; var Allow: Boolean);
begin
  if Panel1.DockClientCount = 1 then
  begin
    Panel1.Width := 0;
    Splitter1.Visible := False;
  end;
end;

end.

Unit2には、前回作成したTCategoryButtonsを使ったフォーム、 Unit3には、ListBoxを一つ配置したものを使いました。
// Unit2, Unit3の設定
  BorderStyle := bsSizeToolWin;
  DragKind := dkDock;
  DragMode := dmAutomatic;


実行するとこんな感じです。

Tdocktabset3

Tdocktabset2


DockTabSet1のStyleをtsOwnerDrawにすれば、タブにアイコンを描画することができました。
しかしながら、フォームのキャプション部分にはできませんでした。DelphiのIDEでは、 表示されているので何か方法があると思うのですけどね。


参考にしたサイト

CodeGear
Using the TDockTabSet component by Jeremy North

|

« ☆TCategoryButtonsを使ってみる。 | トップページ | ■TMS Advanced ToolBars & Menusアップデート »