2021/09/25 Update
Delphi 11 Alexandria から FireMonkey の TForm で Constraints が実装されました!
もう LimitSize ライブラリは必要ありません!
LimitSize とは
FireMonkey の TForm は無限に小さく、または無限に大きくできます。
レイアウトの問題などもあり無限に小さくされても困る時も多いと思います。
一方、VCL には Constraints というプロパティがあり、フォーム(コントロール)のサイズを制限できます。
この VCL Constraints とほぼ同じ仕組みを提供するのが LimitSize ライブラリです。
LimitSize ライブラリの歴史
FireMonkey が発表された当初からこの動作に不満を持っていたため、個人的に作って使っていましたが、
Delphi 10.2のFireMonkeyで最小のフォームサイズを設定しようとしたけどプロパティとかから出来るのかどうかわからなかったからVCLで頑張ることにする( ゚∀゚)・∵. グハッ!!
— ありさん@Web関連かテスターで求職中 (@arigayas) 2017年11月3日
というツイートを見たため、これは公開せねば、と公開しました。
とはいえ、実は以前に 第2回 RAD Studio勉強会@Nagoya (Delphi / C++Builder)で公開する予定のものでした。
ソースは送ったのですが公開されなかったため、今回が初公開になりました。
なお、名古屋勉強会のスライドはコレです。
Delphi でどのような時に依存性が出てきて、どのような依存性排除の仕組みがあるのか、を解説したスライドです。
この中でサンプルとして TLimitSize が出てきます。
LimitSize を使ってみる
LimitSize をリポジトリからダウンロードしてください。
ライセンスは MIT License です。
使い方は簡単で FormCreate イベントなどで
procedure TForm1.FormCreate(Sender: TObject);
begin
FLimitSize := TLimitSize.Create(Self);
FLimitSize.SetLimit(
180, // Minimum Width
160, // Minimum Height
1024, // Maximum Width
768); // Maximum Height
end;
と、最小・最大の幅と高さを設定するだけです。
設定すると、下記のツイートの動画のように大きさが制限されます。
Delphi 用の TLimitSize ライブラリはフォームの大きさを制限します(VCL の Constraints プロパティと同様の動作です)
— HOSOKAWA Jun (@pik) 2017年11月17日
TLimitSize library for Delphi limits the size of the form (it is similar to the Constraints property of VCL)https://t.co/bvfLFvZ7k0 pic.twitter.com/cXnQse8IG0
LimitSize の問題点
公開後、神楽坂@Souryu工房さんが使ってくださり、問題点を教えていただきました。
TLimitSize使ってみましたが、スタイルが適用されている状況だと正しく動作しない様です。
— 神楽坂@Souryu工房 (@j_kagurazaka) 2017年11月7日
どうやら FireMonkey のプレミアムスタイルと TSizeGrip を同時に使うとサイズが限定できないようでした。
FireMonkey プレミアムスタイルは少々特殊な作りになっていて TSizeGrip を使うとフォームの大きさではなく、フォームの上に乗っているパネルの大きさが変わってしまうようです。
なおかつ、フォームの Transparency が True になっていてフォームが見えなくなっているためたちが悪く原因が判明するまでに時間がかかりました。
何度か対策を打ったのですが、やはり TSizeGrip のバグなため、TLimitSize 側では特に何もしないようにしました。
通常のフォームや通常のスタイル、またプレミアムスタイルでも TSizeGrip を使わなければ問題は起きないので良しとしました。
まとめ
FireMonkey に実装されていない機能を自分で実装するのも楽しいものです。
また、各 OS への理解も深まるのでおすすめです。