LimitSize ライブラリを作ってみた


2021/09/25 Update

Delphi 11 Alexandria から FireMonkey の TForm で Constraints が実装されました!
もう LimitSize ライブラリは必要ありません!

LimitSize とは

FireMonkey の TForm は無限に小さく、または無限に大きくできます。
レイアウトの問題などもあり無限に小さくされても困る時も多いと思います。

一方、VCL には Constraints というプロパティがあり、フォーム(コントロール)のサイズを制限できます。

この VCL Constraints とほぼ同じ仕組みを提供するのが LimitSize ライブラリです。

LimitSize ライブラリの歴史

FireMonkey が発表された当初からこの動作に不満を持っていたため、個人的に作って使っていましたが、

というツイートを見たため、これは公開せねば、と公開しました。
とはいえ、実は以前に 第2回 RAD Studio勉強会@Nagoya (Delphi / C++Builder)で公開する予定のものでした。
ソースは送ったのですが公開されなかったため、今回が初公開になりました。

なお、名古屋勉強会のスライドはコレです。

ソースコードの共通化

Delphi でどのような時に依存性が出てきて、どのような依存性排除の仕組みがあるのか、を解説したスライドです。
この中でサンプルとして TLimitSize が出てきます。

LimitSize を使ってみる

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;

と、最小・最大の幅と高さを設定するだけです。
設定すると、下記のツイートの動画のように大きさが制限されます。

LimitSize の問題点

公開後、神楽坂@Souryu工房さんが使ってくださり、問題点を教えていただきました。

どうやら FireMonkey のプレミアムスタイルと TSizeGrip を同時に使うとサイズが限定できないようでした。
FireMonkey プレミアムスタイルは少々特殊な作りになっていて TSizeGrip を使うとフォームの大きさではなく、フォームの上に乗っているパネルの大きさが変わってしまうようです。
なおかつ、フォームの Transparency が True になっていてフォームが見えなくなっているためたちが悪く原因が判明するまでに時間がかかりました。
何度か対策を打ったのですが、やはり TSizeGrip のバグなため、TLimitSize 側では特に何もしないようにしました。
通常のフォームや通常のスタイル、またプレミアムスタイルでも TSizeGrip を使わなければ問題は起きないので良しとしました。

まとめ

FireMonkey に実装されていない機能を自分で実装するのも楽しいものです。
また、各 OS への理解も深まるのでおすすめです。