|
Delphi2010 ボタングループ(ButtonGroup) 2010/09/19 |
前回は[Additional]内の「CategoryButtons」(分類ボタン)について見ましたので、今回は同じく[Additional]内の「ButtonGroup」(ボタングループ)について見てみます。ボタングループは Delphi6 にはありません。
ボタングループは、分類ボタンと同様、ツールボタンを1まとめにしたような感じのものですが、分類ボタンのような分類項目はありませんので、分類ボタンよりも簡単なものとなっています。取り合えず、配置してみます。1つ目ですので Nameプロパティは「ButtonGroup1」となります。
外観は、何だか凹んだパネルか、一見スクロールボックスかのように見えますが、上にコンポーネントを配置するタイプのものではなく、このコンポーネントのプロパティ内に含めていくようなタイプの様子です。<オブジェクトプロパティ>を見ると、よくあるパターンな Alignプロパティの指定などはありますが、Colorプロパティや分類ボタンにあったようなグラデーションの指定などはありません。ちょっと残念な感じです。Itemsプロパティというものがあります。これを選択すると右端に[…]ボタンが表示され、それをクリックすると「項目の設定」画面が表示されます。<フォームデザイナ>でのボタングループ「ButtonGroup1」をダブルクリック、でも表示されますし、右クリックメニューの「項目の設定」でも表示されます。
又は ダブルクリック 又は
↓
↓
「項目の設定」画面
左上のアイコンへマウスを移動すると「新規追加」と表示されますので、これをクリックします。
すると、ボタンが1つ増えます。ButtonGroup プロパティには親クラスの名前の「ButtonGroup1」が表示されています。
<構造>の「ButtonGroup1」→「Items」での右クリックメニュー「項目を追加」を行うと「項目の設定」画面は表示されず直接ボタンが1つ追加されます。
ボタンの枠には何も表示されていない状態なので、Captionプロパティにボタン上の文字を記入します。ここでは「A」と書いてみます。
1つだけだとさびしいので、もう1つ作成します。Captionプロパティには「ABCDE」と書いてみます。
<カテゴリエディタ>を閉じてフォームの画面を見てみると…
という感じになっています。「ABCDE」が表示しきれず「A..」という省略表記になってしまいました。「ButtonGroup1」の ButtonWidthプロパティを「24」から「48」にしてみます。
ボタンの文字は表示されるようになりましたが・・・
全てのボタンの横幅が変わってしまうので、余り触らないほうがいいかもしれませんので、ボタン上の文字もほどほどにした方がいいのかも・・・
取り合えず、保存・コンパイル(再構築)・実行してみます。
さて次に、文字のボタンではなく、画像のボタンを使えるようにしてみます。そのためには、例によって例のごとく、イメージリストを利用します。[Win32]内の「ImageList」から配置しますが前回既に配置していますのでこれを利用します。画像/アイコンも既に追加しているものをそのまま使います。
<オブジェクトインスペクタ>にて「ButtonGroup1」の Imagesプロパティに「ImageList1」を指定します。
上記と同様にしてボタンを1つ追加します。
上記では Captionプロパティを指定していましたが、ここでは、ImageIndexプロパティを指定します。イメージリスト「ImageList1」で登録してある画像/アイコンの番号を入力・指定する訳です。右横の[▼]をクリックすると、登録されてあるものが表示されますので選択することも出来ます。「1」を指定してみます。
各ボタンをクリックした時には・・・というイベントハンドラは、各ボタンに OnClickイベントがありますので、そこでコーディングをすれば可能です。また、「ButtonGroup1」にもOnClickイベントがあります。このイベントハンドラを記述することも出来ますが、その場合、
ボタンをクリック
→そのボタンのOnClickイベントハンドラ実行
→ButtonGroup1のOnClickイベントハンドラ実行
という順序で実行されるようです。
また、「ButtonGroup1」にはOnButtonClickedイベントというものがあります。このイベントハンドラを記述しておくと、各ボタンのOnClickイベントハンドラが記述されていない場合に、これが実行されるようです。この場合、
ボタンをクリック
→ButtonGroup1のOnButtonClickedイベントハンドラ実行
→ButtonGroup1のOnClickイベントハンドラ実行
という順序で実行されるようです。
これを合わせると、
ボタンをクリック
↓
そのボタンのOnClickイベントハンドラが記述されている場合
→そのボタンのOnClickイベントハンドラ実行
そのボタンのOnClickイベントハンドラが記述されていない場合
→ButtonGroup1のOnButtonClickedイベントハンドラ実行
↓
ButtonGroup1のOnClickイベントハンドラ実行
という順序で実行されるようです。
また、ボタングループの各ボタンは、上記で記述したように Itemsプロパティとなっていますが、コンボボックスやリストボックス等と同じように、簡単にボタンを追加したり削除したりすることが出来るようになります。例えば、ボタンを追加したい場合は、
var
btn : TGrpButtonItem;
・・・
btn := ButtonGroup1.Items.Add ;
btn.Caption := '〜'; |
のようにすればボタンを追加できます。しかし、どのボタンを押したのかを取得するのに、これまでの感覚であれば ButtonGroup1 の ItemIndex プロパティを、と考えてしまいますが、残念ながら、どうもこれは使えない様子です。<オブジェクトインスペクタ>でも表示はありますが数値を入力する事は出来ません。また、
var
btn : TGrpButtonItem;
・・・
btn := ButtonGroup1.Items.Add ;
btn.Caption := '〜';
btn.OnClick := (ハンドラ/手続き) ; |
のようにして、そのハンドラ/手続きの方でどうにか出来ないか、と考えて、ボタンのCaptionプロパティやImageIndexプロパティの値を参照出来ないだろうか?と思ってみても、Sender には ButtonGroup1 が入ってしまうため、その手法は使えません。ヘルプも記載の無い箇所が多く、サンプルもありませんので、現段階では実際のところ良く分かりません。ですので、このボタングループで、ボタンを自動生成するようなアプリケーションを作るのはどうも難しいようです。
使えるようで使えないのか、いまいちよく分かりませんが、色々な手段があるほうが良いと思いますので、これはこれでアリかなという気はします。
|
|
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
▲2010/09/18
2010/09/19
▼2010/09/20
シェアウェア
Script!World
データベース
|