Delphi 10.1 BerlinのFireMonkeyアプリケーションでスタイルをリソースから読み込んで適用する

Delphi 10.1 BerlinのFireMonkeyアプリケーションでスタイルをリソースから読み込んで適用するサンプルアプリケーションです。

style001 style002 style003

FireMonkey Premium Styles Pack for RAD Studio 10.1 BerlinEmbarcaderoの登録ユーザーのページからダウンロードして、プロジェクトの下の「style」に配置します。

StyleSample
└style
  ├Android
  ├iOS
  ├MacOS
  │├Copper.style
  │├…
  │└Vapor.style
  └Win
    ├Copper.style
    ├CopperDark.style
    ├CoralCrystal.style
    ├CoralDark.style
    ├Diamond.style
    ├EmeraldCrystal.style
    ├EmeraldDark.style
    ├Jet.style
    ├Radiant.style
    ├Sterling.style
    └Vapor.style

プラットフォームごとにリソースファイルを作成します。
リソース識別子はスタイル名、リソースタイプはRCDATAにします。

Resource.win.rc

CopperStyle RCDATA "style\\Win\\Copper.style"
CopperDarkStyle RCDATA "style\\Win\\CopperDark.style"
CoralCrystalStyle RCDATA "style\\Win\\CoralCrystal.style"
…

Resource.mac.rc

CopperStyle RCDATA "style\\MacOS\\Copper.style"
CopperDarkStyle RCDATA "style\\MacOS\\CopperDark.style"
CoralCrystalStyle RCDATA "style\\MacOS\\CoralCrystal.style"
…

brcc32.exeを使って、rcファイルからresファイルを作成します。

"c:\program files (x86)\embarcadero\studio\18.0\bin\brcc32.exe" Resource.win.rc -foResource.win.res
"c:\program files (x86)\embarcadero\studio\18.0\bin\brcc32.exe" Resource.mac.rc -foResource.mac.res

条件付きコンパイルで、プラットフォーム用のリソースファイルを指定します。

{$IFDEF MACOS}
{$R Resource.mac.res}
{$ENDIF}
{$IFDEF MSWINDOWS}
{$R Resource.win.res}
{$ENDIF}

プラットフォームごとに分けない場合は、rcファイルをプロジェクトに追加します。
プロジェクトに追加したrcファイルは、プロジェクトをビルドしたときにresファイルが作成されます。
また「{$R ~}」を追加する必要もありません。

スタイルのリソース名を定数で定義します。

private const
  StyleNames: array [0 .. 10] of string = ('CopperStyle', 'CopperDarkStyle',
    'CoralCrystalStyle', 'CoralDarkStyle', 'DiamondStyle',
    'EmeraldCrystalStyle', 'EmeraldDarkStyle', 'JetStyle', 'RadiantStyle',
    'SterlingStyle', 'VaporStyle');

リソースからスタイルの名前を取得します。

function TForm1.LoadStyleNames: TArray<string>;
var
  StyleName: string;
  Style: TFmxObject;
  StyleDescription: TStyleDescription;
  List: TList<string>;
begin
  List := TList<string>.Create;

  for StyleName in StyleNames do
  begin
    Style := TStyleStreaming.LoadFromResource(
      HInstance,
      StyleName,
      RT_RCDATA);
    StyleDescription := TStyleManager.FindStyleDescriptor(Style);
    List.Add(StyleDescription.Title);

    StyleDescription.Free;
    Style.Free;
  end;

  Result := List.ToArray;
end;

スタイルによっては、StyleDescriptionが設定されていないものがあります。
その場合は「TStyleManager.FindStyleDescriptor」はnilを返します。

取得したスタイル名をリストボックスに登録します。

procedure TForm1.LoadListBoxItem;
begin
  ListBoxStyleNames.Items.AddStrings(LoadStyleNames);
end;

FormのOnCreateイベントで上の処理を呼び出します。

procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadListBoxItem;
end;

リストボックスの項目が選択されたら、選択されたスタイルをフォームに適用します。

procedure TForm1.ListBoxStyleNamesChange(Sender: TObject);
begin
  if ListBoxStyleNames.Selected <> nil then
    SetStyle(ListBoxStyleNames.Selected.Index);
end;

procedure TForm1.SetStyle(const AStyleIndex: Integer);
var
  Control: TFmxObject;
begin
  Control := TStyleStreaming.LoadFromResource(
    HInstance,
    StyleNames[AStyleIndex],
    RT_RCDATA);
  TStyleManager.SetStyle(Control);
end;

ボタンを押したら、デフォルトのスタイルを適用します。

procedure TForm1.ButtonDefaultClick(Sender: TObject);
begin
  TStyleManager.SetStyle(nil);
end;

サンプルプロジェクトはこちらからダウンロードできます。

スタイルのファイルはサイズが大きいので入れていません。
Embarcadero登録ユーザーのページからダウンロードしてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です