FireMonkey on WindowsではpoOwnerFormCenterが効かない

FireMonkey で poOwnerFormCenter – MASA Lab softlab」で、「Delphi XE5ではFireMonkey on WindowsではpoOwnerFormCenterが効かない」とありました。

Delphi XE7で試してみたらところ、上の記事と同じようにオーナーフォームの中央ではなく画面中央にフォームが表示されます。

var
  Form: TForm1;
begin
  Form := TForm1.Create(Self);
  Form.Position := TFormPosition.OwnerFormCenter;
  Form.ShowModal;
  Form.Free;
end;

ソースコードを追いかけてみたところ、FMX.Formsユニットの2843行目以降の部分で、

      LPosition := FPosition;
      // update position
      case LPosition of
        …
        TFormPosition.OwnerFormCenter:
          if not(Assigned(ParentForm)) then
            LPosition := TFormPosition.ScreenCenter;

となっていて、ParentFormがnilのためScreenCenterに変更されていました。

元記事の「なぜか ParentForm がアサインされていない場合は poScreenCenter に変えられてしまっている」というのは、このことを指摘していると思います。

試しにRTTIでFParentFormを設定してみます。

/// <summary>
///   AFormのFParentForm変数にParentFormを設定する
/// </summary>
procedure SetParentForm(AForm, ParentForm: TCommonCustomForm);
var
  RttiType: TRttiType;
  RttiField: TRttiField;
begin
  RttiType := SharedContext.GetType(AForm.ClassType);
  RttiField := RttiType.GetField('FParentForm');
  RttiField.SetValue(AForm, ParentForm);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Form: TForm1;
begin
  Form := TForm1.Create(Self);
  Form.Position := TFormPosition.OwnerFormCenter;
  SetParentForm(Form, Self); //ParentFormを設定する
  Form.ShowModal;
  Form.Free;
end;

オーナーフォームの中央に配置されるようになりました。
やはりParentForm変数が設定されていないことが原因のようです。

とりあえず、今回はここまで。

C++Builder XE5で、Application->ExeNameで正しいパスを取得するには

C++Builder XE5で、Application->ExeNameで実行ファイルのパスを取得すると、パスの中に「.\」という文字が入ります。

C:\Users\(ユーザー名)\Documents\RAD Studio\Projects\.\Win32\Debug\Project1.exe

最終出力ディレクトリの初期値は次のようになっています。

.\$(Platform)\$(Config)

次のように変更します。

$(Platform)\$(Config)

001

変更後にApplication->ExeNameの値を確認すると、正しい値になっています。

C:\Users\(ユーザー名)\Documents\RAD Studio\Projects\Win32\Debug\Project1.exe

Delphi XE5でAndroidアプリケーションのアプリケーション名を設定するには

Delphi XE5でAndroidアプリケーションは、初期値ではプロジェクト名がアプリケーションの名前になります。

003

プロジェクトオプションのバージョン情報ページでラベル欄にアプリケーション名を入力します。

002

アプリケーションを実行すると名前が変更されました。

001

FireMonkeyアプリケーションでApplication.Titleを設定する

ヘルプにはApplication.Titleを設定する方法として次のように書かれています。

実行時に Title を設定するか、プロジェクト > オプション からのダイアログ ボックスの、[アプリケーション] ページにて、Title プロアプリケーションティの値を入力します。

FMX.Forms.TApplication.Title – RAD Studio API Documentation」より

しかし、アプリケーションページにはTitleを入力する欄がありません。

001

QC 121607」に回避策がありました。

次のコードで設定できます。

uses Winapi.Windows, FMX.Platform.Win;

procedure TForm1.FormCreate(Sender: TObject);
var
  app: HWND;
begin
  //Application.Title := 'New Application Title';
  app := GetWindow(WindowHandleToPlatform(Self.Handle).Wnd, GW_OWNER);
  SetWindowText(app, 'New Application Title');
end;

002