リモートデスクトップ上で実行しているVCLアプリケーションのTLabelの背景色が無効になる
対象となるIDEのバージョン
- RAD Studio/C++Builder XE5 〜 10.3 Rio
問題
実行しているVCLアプリケーションのTLabelの背景色が無効になる症状が発生することがあります。
発生条件は、以下の通りです。
- VCLフォーム上にTLabelコンポーネントを配置
- TLabelのTransparentプロパティ=False
- TLabelのColorプロパティを変更(例えば、clLimeなど)
上記のプロパティ設定で、ビルドしたアプリケーションを以下の手順で実行します。
- リモートデスクトップ上でアプリケーションを実行する
- 一度リモートデスクトップを切断して、再接続する
あるいは
- 予めリモートデスクトップ上のアプリケーションを実行しておく
- リモートデスクトップ接続する
上記のいずれかの手順を実行すると、TLabelのTransparentプロパティ=Trueに再設定され、背景色が無効になる現象が発生いたします。
この症状は、Delphi/C++Builderの古いバージョンから潜在的な問題として抱えておりましたが、最近のテレワークの需要の増加によってリモート接続で開発する頻度が多くなったことにより、問題が顕在化いたしました。
なお、ビルドしたVCLアプリケーションのモジュール以外にも、Delphi/C++BuilderのIDEをリモートデスクトップ上で実行している場合も同様の問題が発生いたします。
解決
この問題は、10.4で修正済みです。
10.4よりも前のバージョンで、この問題を対処するには、リモートデスクトップ上で実行しているアプリケーション(IDEも含む)を一度終了し、再度実行してください。
なお、IDE自体には適用できませんが、ピルドしたVCLアプリケーションに対しては、
<製品のインストールフォルダ>¥source¥vcl¥Vcl.StdCtrls.pasを自身のプロジェクトフォルダへコピーして修正してください。
修正箇所は以下の通りです。
Vcl.StdCtrls.pas
修正前:
procedure TCustomLabel.CMStyleChanged(var Message: TMessage);
begin
inherited;
if StyleServices.Enabled and (seClient in StyleElements) then
ControlStyle := ControlStyle - [csOpaque]
else
if not Transparent then
ControlStyle := ControlStyle + [csOpaque];
UpdateDrawTextProc;
Invalidate;
end;
修正後:
procedure TCustomLabel.CMStyleChanged(var Message: TMessage);
begin
inherited;
if not Transparent then
ControlStyle := ControlStyle + [csOpaque]
else if StyleServices.Enabled and (seClient in StyleElements) then
ControlStyle := ControlStyle - [csOpaque];
UpdateDrawTextProc;
Invalidate;
end;
修正したVcl.StdCtrls.pasの適用方法は、以下のドキュメントを参照してください。