Delphi 10.1 BerlinのFireMonkeyによるベジェ曲線のサンプル

Delphi 10.1 BerlinのFireMonkeyによるベジェ曲線のサンプルです。

[ R190_単純なベジェ曲線の操作例 ] – Mr.XRAYを参考にしました。

Windowsの実行画面

Androidの実行画面

Delphiのフォーマッタ(コードの整形)でDataMoudleが壊れる

TDataMoudleにはClassGroupプロパティがあります。
このプロパティで、データモジュールがVCL用かFMX用かフレームワークに依存しないかを設定します。

たとえばTTimerコンポーネントはVCL用のVcl.ExtCtrls.TTimerとFMX用のFMX.Types.TTimerがあります。
使用するコンポーネントとClassGroupで設定したフレームワークを一致させる必要があります。

formatter01

オブジェクトインスペクタでClassGroupプロパティを設定すると、ユニットファイルには次のような指令が追加されます。

ClassGroupがFMX.Controls.TControlの場合:

{%CLASSGROUP 'FMX.Controls.TControl'}

フォーマッタのコメントスペースの設定の「{ および (* コメントスペースの設定」は初期値が「内側と外側」になっています。
この設定でコードを整形すると、ClassGroupプロパティによって追加された指令が次のようになります。

{ %CLASSGROUP 'FMX.Controls.TControl' }

「{」「}」の間に空白が追加されました。

このように空白が追加されると、ClassGroupプロパティの値は未設定の状態になります。

ClassGroupプロパティの値が設定されていない状態になると、コンポーネントとフレームワークに不一致が生じます。
その結果、IDEでデータモジュールを読み込むときにエラーが発生します。

エラーが発生した場合は、ClassGroupプロパティの指令を修正すれば、元の状態に戻ります。

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登録ユーザーのページからダウンロードしてください。

Delphi 10.1 BerlinでTGridを継承したクラスを作成するには

Delphi 10.1 BerlinでTGridを継承したクラスを作成するには

Delphi 10.1 BerlinでTGridを継承した次のようなクラスを作成しました。

type
  TMyGrid = class(TGrid)
  end;

ところが実行すると、次のようなメッセージが表示されます。

grid

クラス TMyGrid に対して TStyledPresentationProxy の下位クラスが登録されていません。
おそらく uses セクションに FMX.Grid.Style モジュールを追加する必要があります。

TMyGridと同じユニットに次のコードを追加することで解決しました。

uses
  FMX.Presentation.Factory,
  FMX.Presentation.Style;

initialization

TPresentationProxyFactory.Current.Register(
  TMyGrid,
  TControlType.Styled,
  TStyledPresentationProxy<TStyledGrid>);

finalization

TPresentationProxyFactory.Current.Unregister(
  TMyGrid,
  TControlType.Styled,
  TStyledPresentationProxy<TStyledGrid>);