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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
DelphiXE3 [FMX] ヘッダー(Header)2013/11/03
 
前回は [Grids]内の文字列グリッド(StringGrid)について見てみました。次は同じく[Grids]内のヘッダー(Header)について見ていきます。
 
Delphi2010・VCLアプリケーションでは「HeaderControl」(ヘッダーコントロール)というコンポーネントはありますが、機能内容は多少異なるかもしれません。
   【Delphi2010の記事はこちら】
   【DelphiXE3[VCLアプリケーション]の記事はこちら】
 
[Grids]内
FMX
 
ヘルプより。
THeader は、グリッドで使用されるヘッダー コントロールを表します。
 
THeader オブジェクトはグリッドに付加され、グリッド内の各列のタイトル(キャプション)を表示します。THeader には、列のサイズ変更と列間の切り替えの機能が実装されています。THeader オブジェクトには、THeaderItem として実装された項目が含まれています。
 


 
Radius
現在のヘッダーの左上や右上の角に適用する、角の丸みの量を示します。
 
Radius プロパティを使用すると、現在のヘッダーの左上や右上の角の丸みを指定できます。Radius が 0 に設定されている場合、角は完全に四角になります。そうでなければ、正の値が設定されていれば、新しい半径が計算され、それが角の丸みに使用されます。
Sides
現在のヘッダーに対して、上下左右のボーダーを表示するかどうかを示します。
 
Sides プロパティを使用すると、上下左右のボーダーが、現在のヘッダー コントロールに対してどのように表示されるかを、指定することができます。サブプロパティ Sides.sdTop、Sides.sdLeft、Sides.sdRight、Sides.sdBottom それぞれは、True または False に設定でき、該当するボーダーを表示するかどうかを指定します。
 
OnRealignItem
現在のヘッダー内の項目の 1 つが、他の項目と位置をスワップした後に、直ちに発生します。
 
OnRealignItem イベント ハンドラを記述すると、現在のヘッダー内の項目の 1 つを再配置、つまり、他の項目と位置をスワップした際に、特定のアクションを起こさせることができます。
OnResizeItem
このヘッダー内の項目の 1 つがサイズ変更されている間に発生します。
 
OnResizeItem イベント ハンドラを記述すると、現在のヘッダーに保有されている項目の 1 つがサイズ変更された際に、特定のアクションを起こさせることができます。
 
配置したヘッダーを右クリックし、表示されるコンテキストメニューの「項目エディタ」を選択指定、あるいは、ダブルクリックをすると、「項目デザイナ」画面が表示されます。
 

列(カラム)項目の種類はグリッド(Grid)・文字列グリッド(StringGrid)とは異なり、「THeaderItem」のみ選択出来る状態となっています。
 
 
試しに、THeaderItem を3つ追加してみます。



 

 
Header1のTextAlignを左寄せ「taLeading」
Header2のTextAlignを中央寄せ「taCenter」
Header3のTextAlignを右寄せ「taTrailing」にしておき、
フォーム表示時のイベントハンドラを下記のようにします。
procedure TForm1.FormShow(Sender: TObject);
begin
 HeaderItem1.Text := '文字1';
 Header1.Items[1].Text := '文字2';
 HeaderItem3.Text := '文字3';
end;
保存・コンパイル・実行を行うと下図のようになります。

 
さて、具体的にはどのような使い方を想定しているのでしょうか?
グリッドとの関連、となれば、上下にグリッド・文字列グリッドを配置して、カラムのコントロール? 例えば下図のように文字列グリッドを配置して

procedure TForm1.Header1ResizeItem(Sender: TObject; var NewSize: Single);
var
 i: Integer;
begin
 for i := 0 to 2 do
  StringGrid1.Columns[i].Width := Header1.Items[i].Width ;
end;
「2」のように数値を直接入れていますが、ここを Header1.Count-1 のようにすると何故か例外が発生しますね。こういう事こそ LiveBindingできればいいのにとも思いますが。 保存・コンパイル・実行を行います。

文字列グリッドの方の列幅変更や 列のスワップには対応していませんが、しかし、文字列グリッドには元々ヘッダーがありますので、わざわざこのような事をする必然性は無いように思えます。
 
パネルのように、子としてリストボックスを配置しようとしても、ヘッダー文字が垂直方向で中央合せ状態になっているため、そういう使い方はできそうにありません。そもそも、そういう使い方ではないのでしょう。

また、ヘッダーのすぐ下にリストボックスを配置するとしても、リストボックスを横に複数並べる事を想定した場合、列幅変更時、各リストボックスの位置の計算をせねばならず手間です。それを避けるのなら、パネルを配置し、パネル上にリストボックスを Align=alLeftで配置していく、というような事になりそうですが、そういった事が必要になるのかどうかは、まぁプログラマ次第ではあるにせよ、よく分かりません。

procedure TForm1.Header1ResizeItem(Sender: TObject; var NewSize: Single);
begin
 ListBox1.Width := HeaderItem1.Width ;
 ListBox2.Width := HeaderItem2.Width ;
 ListBox3.Width := HeaderItem3.Width ;
end;
 
パネルとの違いは、パネルだと複数配置しないといけない・列スワップは標準実装ではない、ヘッダーだと Itemプロパティでループ化出来るからプログラミングしやすいかも? 逆にヘッダーの列スワップが邪魔なので、出来ないように設定出来ないだろうか?等とも思ってしまいますけれども(それこそパネルを使うって事になりそうですが)。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
>DelphiXE3
▲2013/11/02
 2013/11/03
▼2013/11/04
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.