高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

alCustomを使ってみる

 ほとんどのVCLのプロパティにあるAlignには、alClientなどのほかにalCustomというものが指定できますが、あれはどういうものなのか?ヘルプによると、親コントロールのCustomAlignPosition呼び出しによって動作が決まるとか(もう一つのは試してない)。
 で、そのCustomAlignPositionですが、"呼び出し"と言ってるだけあってイベントなんかじゃありません。プロテクトメソッドです。故に、TPanelの中においたコントロールなんかでは、alCustomを指定することには何の意味もありません。フォームの直下においたりしたコントロールにだけ、効果があります。

 で、どう使うかというと、コントロールの数だけCustomAlignPositionというメソッドが呼ばれてくるので、それに従ってポジションを決めろと言うことです。たとえば下記のように

procedure TTWatchDisplayForm.CustomAlignPosition(Control: TControl;
  var NewLeft, NewTop, NewWidth, NewHeight: Integer; var AlignRect: TRect;
  AlignInfo: TAlignInfo);
const FRAME_SIZE = 2;
begin
  inherited;
  NewLeft   := FRAME_SIZE;
  NewTop    := FRAME_SIZE;
  NewHeight := ClientHeight - FRAME_SIZE * 2;
  NewWidth  := ClientWidth - FRAME_SIZE * 2;
end;

 C#なんかで言う、DockPaddingなどと同じようなことができます。
まあ、この程度だとあっちはIDE上で同じことができる分、あっちの方に部がありますが、OnResizeイベント内で、一個ずつコントロールを配置するなどに比べると、コードはすっきりするかも知れません。

 しかし、よほどのことがない限り、Anchorを使った方が早いとは思いますが。