FireMonkey でのポップアップ フォームの使用
目次
ポップアップ フォームについて
FireMonkey ではポップアップ フォームをサポートしています。ポップアップ フォームは TCommonCustomForm クラスで定義されます。ポップアップ フォームの最も重要なプロパティは FormStyle と ParentForm です。
TCommonCustomForm.FormStyle プロパティ
FormStyle プロパティはフォームの動作を定義します。FormStyle の取り得る値は Normal
、StayOnTop
、Popup
のいずれかです。Normal
値と StayOnTop
値の意味はかなり自明です。Normal
は通常のフォームを定義し、StayOnTop
は、常にデスクトップの最前面やアプリケーション内の他のすべてのフォームより手前に表示される通常のフォームを定義しています。
-
- VCL には、
fsMDIChild
とfsMDIForm
の 2 つの値をさらに持つ同様の TCustomForm.FormStyle プロパティがあることに注意してください。なお、これらの値は、Windows プラットフォームでのみ意味を持つので、FireMonkey では定義されていません。
- VCL には、
Popup
オプションは、コンボ リスト コントロールやメニューで使用される特別なポップアップ フォームを定義しています。ポップアップ フォームに特有の動作は次のとおりです。
- ポップアップ フォームはアクティブになることはできません。この種類のフォームはすべて、TScreen クラス内の特別な PopupForms リストに含まれています。PopupFormCount では、アプリケーションに現在作成されているポップアップ フォームの数を定義しています。
- モバイル プラットフォームでは、通常のフォームは常にフルスクリーン モードで表示されますが、ポップアップ フォームはデスクトップの一部のみを占めることができます。
- ポップアップ フォームは、長時間表示されたままになることはありません。ポップアップ フォームの外部でマウスをクリック(または指でタッチパッドをタップ)すると、通常、ポップアップ フォームは閉じます。いくつかのポップアップ フォームを同時に表示することができます。これらのポップアップ フォームは同類関係を持つことができます。
通常、ポップアップ フォームには次のプロパティがあります。
BorderStyle := None; // No visible border (not resizable) Transparency := True; // pop-up form is transparent
TCommonCustomForm.ParentForm プロパティ
ParentForm プロパティでは、フォーム間の同類関係を定義します。ParentForm の値は、Parent プロパティの変更時に設定されます。Parent がフォームであれば、ParentForm は Parent と同じ値に設定されます。そうでなければ、ParentForm は、Parent の所属先のフォームと同じ値に設定されます。
ParentForm フォームが変更されるたびに、システムは仮想メソッド DoParentFormChanged を実行します。
FormStyle、BorderStyle、ParentForm のいずれかのプロパティを変更すると、現在のフォーム、フォーム上のすべてのコントロール、現在のフォームのすべての子フォームが強制的に再作成されることに注意してください。そのため、実行時にフォームが画面に既に表示された後でこれらのプロパティのいずれかを変更することはお勧めしません。
TCustomPopupForm クラスの使用
ポップアップ フォームの作成を簡単に行えるように、FireMonkey には特別な TCustomPopupForm クラスが定義されています。TPopup(特に CreatePopupForm)、TComboEdit、TPopupBox、TMenuBar、その他の類似クラスでは TCustomPopupForm を使用しています。
デフォルトでは、TCustomPopupForm フォームは、背景が透明で(Transparency := True
)、フレームがありません(BorderStyle := None
)。TCustomPopupForm フォームを閉じると、それは自動的に破棄されます。TCustomPopupForm フォームの作成時に、システムでは、そのフォームを保存した FMX ファイルを検索しません。つまり、TCustomPopupForm クラスは、実行時に使用することを目的とするものです。
TCustomPopupForm フォームでは次のコンストラクタを使用します。
constructor Create(AOwner: TComponent; AStyleBook: TStyleBook = nil; APlacementTarget: TControl = nil); reintroduce;
ここで、AStyleBook
では、フォームで使用されるスタイルを指定し、APlacementTarget
では、フォームの表示位置に近いコントロールを指定します。
TCustomPopupForm フォームの重要なプロパティ
TCustomPopupForm フォームは、フレームが表示されず、背景が透明であるため、画面の境界からはみ出しません。フォームの物理座標(Position、Height、Width)は位置決めには使用されません。TCustomPopupForm フォームの位置決めは、他のプロパティを使って行われます。つまり、Placement、PlacementTarget、PlacementRectangle、ScreenPlacementRect、Size です。Position、Height、Width の各プロパティを明示的に変更してはいけません。
PlacementTarget は、TCustomPopupForm フォームの表示位置の基準となるターゲット コントロールを指します。以後、このようにポップアップ フォームの相対的な位置をターゲット コントロールの近くに決定することを明示するために "接着" という用語を使用します。PlacementTarget が指定された場合、フォームの画面座標は、この PlacementTarget コントロールを基準として相対的に計算されます。
TCustomPopupForm フォームに ParentForm があり、PlacementTarget が設定されていない場合は、親を基準として、TCustomPopupForm フォームの相対的な位置が決定されます。PlacementTarget と ParentForm がどちらも設定されていない場合は、画面(メイン ウィンドウ)の左上隅を基準として、TCustomPopupForm フォームの相対的な位置が決定されます。
PlacementRectangle では、フォームの接着先となる四角形の座標を定義します。PlacementRectangle の画面座標は、PlacementTarget が指定されている場合は、それを基準として相対的に計算されます。そうでない場合、その画面座標は画面の左上隅を基準として相対的に計算されます。使用されるルールは次のとおりです。
- PlacementRectangle が指定されておらず(幅または高さが
0
に等しい)、PlacementTarget が指定されている場合は、PlacementTarget の座標とサイズが使用されます。 - PlacementRectangle も PlacementTarget も指定されていない場合は、ポップアップ フォームの左上隅がマウス カーソルの位置に接着します。
ScreenPlacementRect では、PlacementRectangle プロパティと PlacementTarget プロパティの両方を考慮に入れてポップアップ フォームの接着先となる四角形の画面座標を定義します。
Placement では、ScreenPlacementRect などのプロパティで指定された四角形、画面、マウス(ポインティング デバイス)位置のいずれかを基準として、ポップアップ フォームの相対的な位置がどのように決定されるかを定義します。TPlacement には、Placement の取り得る値が定義されています。通常のデフォルト値は Bottom
で、ポップアップ フォームがターゲット四角形の下辺に接着することを指定します。次の図は、TopCenter
値の場合のデモです。
この図で、ScreenPlacementRect は[Show popup]ボタンの明るい赤紫色の四角形です。
Padding では、通常のフォームの場合と同様に、フォームのクライアント四角形の境界からのインデントを定義します。フォーム内のすべての子コントロールは、これらのインデントに従って配置されます。デフォルト値は 8
です。これは、(影などの)効果がウィンドウの物理的な境界を横切らないことを指定するのに使用されます。
Size では、現在のポップアップ フォームの作業領域のサイズを定義します。ウィンドウの物理的なサイズを表す四角形(図に赤色の破線の枠で示されているもの)は重要ではありません。Size 四角形は図に緑色の破線の枠で示されているもので、すべてのコントロールの配置の基準となるサイズを指定します。フォームの寸法(ClientWidth と ClientHeight)は、Size と Padding に基づいて自動的に定義されます。PlacementRectangle が定義されていて、Placement が Absolute
である場合、Size は無視されます。
ContentPadding では、ポップアップ フォームのクライアント領域からのインデントを定義します。ポップアップ フォームの接着は、このインデントされた "パディング四角形" の境界に対して行われます。
ScreenContentRect では、ポップアップ フォームの接着先となる "パディング四角形" の画面座標を定義します。
ポップアップ フォームの有用な内容はすべて、この "パディング四角形" の内側に配置されます。いくつかの "装飾的要素"(たとえば、吹き出しパネルの 1 辺に表示される "三角形の突起" など)は、パディング四角形の外側に配置できることに注意してください。これの例を次の図に示します。
Offset では、ポップアップ フォームのクライアント四角形を基準とする、"パディング四角形" の相対的なオフセットを定義します。フォームの位置を基準とするポップアップ フォームの相対的なずれをピクセル数で定義します。これは、上記で解説したすべての位置決めプロパティを考慮に入れて取得されます。Offset の方向は、Placement の値によって決まります。Offset プロパティは、たとえば、マルチレベル メニューでサブメニューのポップアップ フォームが前のレベルのフォームと重なって配置される場合に使用されます。
DragWithParent は、現在の TCustomPopupForm を表示後にドラッグできるかどうかを指定します。たとえば、DragWithParent が True
であれば、TCustomPopupForm は、自分の親フォームがドラッグ アンド ドロップ操作の対象となる場合、親フォームと一緒にドラッグされます。Placement が Mouse
または MouseCenter
の場合、ポップアップ フォームはマウス カーソルの後について移動します。モバイル デバイスでは、向き(縦/横)を変更した後、ポップアップ フォームは、画面の境界で部分的に見えにくくならないように位置を変更できます。