# Delphi UCL の紹介 --- tags: Delphi プログラミング Pascal embarcadero objectpascal created_at: 2021-12-25 updated_at: 2024-01-30 --- # はじめに **Delphi UCL** (旧 **UniversalCL**) は Delphi 用 UWP コントロール VCL です。 ![image.png](./images/ba4a1d44-1fe9-e312-dd1b-f7324a1f8b8d.png) モダンな見た目ですが、描画は高速です。 # Delphi UCL **Delphi UCL** は GitHub で公開されています。 - [DelphiUCL (GitHub: VuioVuio)](https://github.com/VuioVuio/DelphiUCL) - [UniversalCL (GitHub: VuioVuio)](https://github.com/VuioVuio/UniversalCL) ## インストール 1. リポジトリをローカルに保存します。 2. `DelphiUCL.groupproj` を IDE で開きます。 3. `DelphiUCLPackage.bpl` を右クリックし、[インストール] を選びます。 4. `DelphiUCL\Source` をライブラリパスに追加します。 ## 使い方 既存の VCL と使い方はほぼ同じです。 :::note warn Windows 11 でデモを実行する場合には、フォームの DoubleBuffered プロパティを False に変更してください。 ::: # おわりに 折角なので、Windows 11 における `DoubleBuffered` プロパティの問題点について。 ## 1. 背景描画がおかしくなるコントロールがある コンボボックス系の背景にゴミが描画される事があります [^1]。 ![image.png](./images/235f8662-3099-9a66-988f-29ef740a36d9.png) インターポーザークラスを使って置き換える事も可能ですが、TCustomComboBox から派生しているコンボボックスがあれば、そちらにも同様のインターポーザークラスを作成しなくてはなりません。 ```pascal TComboBox = class(Vcl.StdCtrls.TComboBox) procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND; end; ... procedure TComboBox.WMEraseBkgnd(var Message: TWmEraseBkgnd); begin FillRect(Message.DC, ClientRect, Brush.Handle); inherited; end; ``` **See also:** - [【Delphi】インターポーザークラス (Qiita)](./d5a5fbd37cca097cf186.md) - [Windows 11 - DoubleBuffered Problem (Delphi-PRAXiS)](https://www.delphipraxis.net/209098-windows-11-doublebuffered-problem-2.html) ## 2. ボタン透過の一貫性 Windows 11 のボタンは恐らく半透明です。このため、ボタンの下にコントロールがあるとそれが透けて描画されます。 ![image.png](./images/bb08f3a7-1e8d-92cc-142e-9d6890306f58.png) それはいいのですが、親コントロールの `DoubleBuffered` が True の場合のみ、TButton の背景が透けなくなります。親コントロールの `DoubleBuffered` が False の場合には、TButton の `DoubleBuffered` を True にしても背景は透けたままです。つまり、`DoubleBuffered` の状態によってボタン透過の一貫性がない事になります。 ## 解決方法 とりあえずの解決方法は `DoubleBuffered` プロパティを False にする事です。「ボタンの下にあるコントロールを透過させたくない」というのは、 - ボタンの下に不要な物を置かない - パネルのようなコンテナの上に配置する という対処方法しかないと思います。いずれにせよ、**ソースコードがあれば**ですが。 この問題、別に最新版の Delphi だけで起こる現象ではなく、古い Delphi でも発生するのです。実行形式ファイルしか存在しない Delphi / C++Builder アプリケーションを Windows 11 で動作させるつもりなのであれば、ゴミ描画とボタン透過のチェックを入念に行ってください。 フォームの `DoubleBuffered` プロパティは False がデフォルトなので、`DoubleBuffered` プロパティをフォームだけでコントロールしているのであれば、リソースエディタでフォームを書き換えて回避する事ができます [^2]。 ![image.png](./images/8f07f0e3-4117-0eab-ac12-9b15ca88fb76.png) :::note info この問題は 11.1 Alexandria で解決されたようです。 ::: :::note info この問題は Windows 11 の KB5013943 で解決されたようです。 https://support.microsoft.com/en-us/topic/may-10-2022-kb5013943-os-build-22000-675-14aa767a-aa87-414e-8491-b6e845541755 ::: **See also:** - [RSP-36020: DoubleBuffered Bug on Windows 11 (Quality Portal)](https://quality.embarcadero.com/browse/RSP-36020) - [Resource Hacker (angusj.com)](http://www.angusj.com/resourcehacker/) - [Windows 11環境でフォーム上のTButtonなどのコンポーネントの色が透過する (Support Wiki)](https://docwiki.embarcadero.com/Support/ja/Windows_11%E7%92%B0%E5%A2%83%E3%81%A7%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E4%B8%8A%E3%81%AETButton%E3%81%AA%E3%81%A9%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E8%89%B2%E3%81%8C%E9%80%8F%E9%81%8E%E3%81%99%E3%82%8B) [^1]: Delphi UCL をいじっていて `DoubleBuffered` プロパティの[問題に気付きました](https://twitter.com/ht_deko/status/1457726444310724609)。 [^2]: 個別に `DoubleBuffered` プロパティをいじってあると修正が大変だと思います。