AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
Delphi2010 ドッキングタブセット(DockTabSet) 2010/09/20
 
前回は[Additional]内の「ButtonGroup」(ボタングループ)について見ましたので、今回は同じく[Additional]内の「DockTabSet」(ドッキングタブセット)について見てみます。ドッキングタブセットは Delphi6 にはありません。

 
ドッキングタブセットは、ヘルプによると
ノートの仕切りに似た外観を持つドッキングタブセットです。
TTabSet を継承しています。TDockTabSet を使用すると、複数のタブ設定を持つコントロールをフォームに追加することができます。TDockTabSet は、ページコントロールとは違って、別々のコントロールを含む複数のページから構成されるわけではありません。そうではなく、TDockTabSetは1つのオブジェクトです。現在のタブが変化すると、タブコントロールは、OnChangeイベントハンドラの中で、変更に合わせて自身の内容を直接更新しなければなりません。TDockTabSetオブジェクトは1つのコントロールなので、このオブジェクトを無効にするとすべてのタブが無効になります。
とありますので、[Win32]内にある「TabControl」(タブコントロール)のようなものだろうか?と想像できます。けれども「ドッキング」とは一体何のことなのだろうか?ドッキングという事はコントロールバー/ツールバーにあったようなドラッグ&ドロップによるフロート/ドッキングの事だろうか?などと思うのですがそれがタブセットとどう関係あるのか想像しにくいのですが、取り合えず配置してみます、とその前に、テスト8の画面は一杯になってしまったので、テスト9(フォルダ009)を用意して配置します。1つ目ですので Nameプロパティは「DockTabSet1」となります。

 
[Win32]内にある「TabControl」(タブコントロール)は、切り替えるコンテナ画面も持っていますが、このドッキングタブセットは、切り替えるタブだけを表示していてコンテナ画面はありません。切り替え対象の画面などは自分でパネル等を用意して、タブを切り替えたときに発生するOnChangeイベントハンドラ(※新しいタブが選択される直前に発生します)でその切り替えのコードを自分で記述するという感じでしょう。例えば、下記のようにパネルとラベル・エディットを用意するとか…

切り替えを行うためのタブは、Tabsプロパティで作成することが出来ます。



 
タブの切替を行って、それぞれの内容を入力させる、という単純なものです。入力内容はコンポーネントを利用する事も出来ますが、ここでは静的配列を用意して利用します。
type
 TForm1 = class(TForm)
  DockTabSet1: TDockTabSet;
  Panel1: TPanel;
  Label1: TLabel;
  Edit1: TEdit;
 private
  { Private 宣言 }
  InpDat : array[0..3] of string ;
 public
  { Public 宣言 }
 end;
この静的配列の初期化は、フォームを開いた時=起動した時=フォームのOnShowイベントで行います。
procedure TForm1.FormShow(Sender: TObject);
var
 i : integer ;
begin
 for i:=0 to 3 do
  InpDat[i] := '' ;
 DockTabSet1.TabIndex := 0 ;
 Label1.Caption := DockTabSet1.Tabs[0] ;
 Edit1.Text := '' ;
end;
タブを切り替えた時のイベントハンドラを記述します。

procedure TForm1.DockTabSet1Change(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean);
var
 i : integer ;
begin
 if (NewTab = -1) then exit ;
 // 以前の値を格納
 i := DockTabSet1.TabIndex ;
 InpDat[i] := Edit1.Text ;
 // 新しいタブへ切替
 Label1.Caption := DockTabSet1.Tabs[NewTab] ;
 Edit1.Text := InpDat[NewTab] ;
end;
 
それでは、保存・コンパイル(再構築)・実行をしてみます。

初期状態です ↓

CPUには「Pentium4」と入力し「メモリ」へ ↓

メモリには「8GB」と入力し「VGA」へ↓

VGAの内容を入力し「HDD」へ↓

HDDの内容を入力し「CPU」へ↓

先ほど入力した内容が表示されます
 
それでは<オブジェクトインスペクタ>を見ていきます。
 
まずは、AutoScrollプロパティです。これを True(デフォルト値)にしておくと、タブを沢山書いていくと横幅をオーバーしてしまう場合、自動的にスクロールスイッチが表示されるようになります。
 
次に、AutoSelectプロパティですが、これを True にすると、マウスを合わせただけで自動的にタブ切替を行います。勝手に切り替わってくれるのでよほどの場合以外はデフォルトの False のままにしておいた方がいいと思います。
 
そして、DestinationDockSiteプロパティですが、ヘルプによれば
コントロールのドッキング先を指定します。
たとえば,タブ付きコントロールのドッキング先のサイトをフォームのインスタンスにします。
とありますが、いまいちよく分かりません。仮に、ドッキングタブセットがドラッグ&ドロップを受け入れたとして、その受け入れたコントロールが表示される場所なのでしょうか?それではパネル等を指定したら、そのパネル上にコントロールが表示されるのでしょうか? ・・・ 違うようです。よく分かりませんのでパスします。
 
ShrinkToFitプロパティは、True にすると(デフォルトは False)、タブが増えたり長い名前だったりする場合に、なるべく沢山のタブを表示すべく、タブ内容を省略表記します。

 
SoftTopプロパティは、タブセットの上端に線を表示するかどうかを指定します。False(デフォルト)の場合には表示を行い、True の場合は表示しません。
False選択タブが目立つ感じ(デフォルト)
True目立たない(ソフトな)感じ
 
Styleプロパティはタブセットのスタイルを指定します。デフォルトは「tsStandard」です。
tsModernPopout
tsModernTabs
tsOwnerDraw
tsSoftTabs
tsStandard
 
TabIndexプロパティは、現在選択しているタブの番号(0〜)を示します。-1値は選択していない事を示します。
 
TabPositionプロパティは、タブセットが切替画面のどの位置にあるのかを指定します。「tpBottom」(下側;デフォルト)、「tpLeft」(左側)、「tpRight」(右側)、「tpTop」(上側)のうちのいずれかを指定します。
 
 
さて、それではドッキングについてみて行きます。
 
まずはボタンを4つ追加し、ボタン Button1からCaptionプロパティを「CD/DVD」「FDD」「Mouse」「表示」とします。

 
ボタン Button1〜Button3を選択し、<オブジェクトインスペクタ>でドラッグ&ドロップでドッキングできるよう、DragKindプロパティを「dkDock」に、DragModeプロパティを「dmAutomatic」にします。

 
タブを3つ増やせるようにしますので、配列の範囲を3つ分増やします。
type
 TForm1 = class(TForm)
  ・・・
 private
  { Private 宣言 }
  InpDat : array[0..6] of string ;
 public
・・・
procedure TForm1.FormShow(Sender: TObject);
var
 i : integer ;
begin
 for i:=0 to 6 do
  InpDat[i] := '' ;
 
ドッキングサブセット DockTabSet1 にドッキング・ドロップしたときの OnDockDropイベントハンドラを記述します。ドッキングするとタブが自動的に追加されますがタブ内容が何も入っていませんので自分でボタンのCaptionプロパティ内容を入れるようにしています。

procedure TForm1.DockTabSet1DockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer);
var
 s : string ;
begin
 s := TButton(Source.Control).Caption ;
 DockTabSet1.Tabs[DockTabSet1.Tabs.Count-1] := s ;
end;
 
確認のため、ボタン Button4 をクリックした時に内容を表示するよう行います。
procedure TForm1.Button4Click(Sender: TObject);
var
 i,j : integer ;
 s : string ;
begin
 j := DockTabSet1.Tabs.Count ;
 s := IntToStr(j) + ': ' ;
 for i:=0 to j-1 do
  s := s + DockTabSet1.Tabs[i] + '=' + InpDat[i] + '、';
 ShowMessage(s);
end;
 
保存・コンパイル(再構築)・実行します。

↓ ボタン Button1 をマウスでドラッグします



↓ ドッキングタブセットへドロップします

↓ タブが増えました 同様に・・・



↓ 適当に入力したあと[表示]ボタンをクリック

 
タブ切替のタイミングによっては、NewTabの値が「-1」になる場合がありますので注意が必要です。この例では、タブ切替時に静的配列へ内容を入れていますので、タイミングによっては内容がセットされない場合があります。この辺りは少し工夫が必要だと思われます。
 
 
さて、問題の DestinationDockSiteプロパティですが、ドッキングさせた内容を例えばリストボックスに入れたい、というような場合、リストボックス ListBox1 を追加し、この DestinationDockSiteプロパティに ListBox1 を指定し、
procedure TForm1.DockTabSet1DockDrop(Sender: TObject; Source: TDragDockObject; X, Y: Integer);
var
 s : string ;
begin
 s := TButton(Source.Control).Caption ;
 DockTabSet1.Tabs[DockTabSet1.Tabs.Count-1] := s ;
 TListBox(DockTabSet1.DestinationDockSite).Items.Add(s);
end;
のように追記すると、以下のようになります。

↓ ドラッグしてドッキング

 
 
これも、使えるようで使えないのか、使えないようで使えそうなのか、いまいちよく分かりませんが・・・。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
▲2010/09/19
 2010/09/20
▼2010/09/21
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.