Delphi UCL の紹介

# はじめに
**Delphi UCL** (旧 **UniversalCL**) は Delphi 用 UWP コントロール VCL です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/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)](https://qiita.com/ht_deko/items/d5a5fbd37cca097cf186)
 - [Windows 11 - DoubleBuffered Problem (Delphi-PRAXiS)](https://www.delphipraxis.net/209098-windows-11-doublebuffered-problem-2.html)

## 2. ボタン透過の一貫性
<font color="Crimson">Windows 11 のボタンは恐らく半透明です。</font>このため、ボタンの下にコントロールがあるとそれが透けて描画されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/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` プロパティをいじってあると修正が大変だと思います。