4

既存の iOS (XCode) アプリの 1 つを Delphi FireMonkey (XE4) に移植し始めています。これまでのところ、驚くほどスムーズなプロセスでした。しかし、解決方法がわからないという行き詰まりに陥っています。

既存のアプリは、新しいGoogle マップアプリに似ています。多数のピンを含む Google マップを表示する Web ブラウザー コントロールがありますピンをクリックすると表示される設定ボタンと情報パネルもあります。適切なボタン/ピンを押すと、設定パネルと情報パネルがマップの左右からスライドインします。これはすべて、XCode アプリで正常に機能します。

FireMonkey ポートで発生している問題は次のとおりです。

  • Webbrowser コントロールの上に FireMonkey コントロールを表示することはできません。これは、webbroswer がネイティブの iOS コントロールであるためだと理解しています。
  • Web ブラウザー コントロールが表示されると、移動できなくなります。たとえば、position.xプロパティを変更すると、Web ブラウザーはそのままの場所にとどまります。これは、組み込みのアニメーションを使用して x プロパティに変更した場合と同じです。正しく動作していると思われる唯一のプロパティはvisible.

TMS iCLコンポーネントを使用して、最初の問題を修正できます。しかし、私たちにとって最も気になる問題は 2 番目の問題です。Web ブラウザー コンポーネントを移動できなければ、Web ブラウザー (または任意のネイティブ iOS コントロール) を使用するモダンな (スライドする) UI を実装することはできません。

これらの FireMonkey の制限を克服する方法を見つけた人はいますか?

更新 1

Jaroslavの提案に従って、私は次のことを試しました:

1) ボタンと WebBrowser を持つ 2 番目のフォームを作成しました。

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
  FMX.StdCtrls, FMX.WebBrowser;

type
  TForm2 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

end.

2) Form1 の子として Form2 を作成しました。

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.WebBrowser,

  Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FForm2: TForm2;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Fform2.left := Fform2.left - 5;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Fform2.left := Fform2.left + 5;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FForm2 := TForm2.Create(Self);
  FForm2.Parent := Self;
  FForm2.Left := 10;
  FForm2.Show;
  FForm2.BringToFront;
  FForm2.WebBrowser1.URL := 'www.google.com';
  FForm2.WebBrowser1.Navigate;
end;

end.

アプリケーションを実行すると、次のように表示されます。

ここに画像の説明を入力

ここに私の観察があります:

  • ボタンをクリックしても何も起こりません。
  • Form2 のボタンは表示されません。
  • Form2 のLeftプロパティは、デザイナで 40 に設定されています。ただし、フォームは 0 で表示されます。

更新 2:

コメントの提案に従って、Form1 ソースを次のように変更しました。

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.WebBrowser,

  Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Popup1: TPopup;
    WebBrowser1: TWebBrowser;
    WebBrowser2: TWebBrowser;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FForm2: TForm2;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  TCustomForm(Popup1.Popupform).Left := TCustomForm(Popup1.Popupform).Left - 5;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TCustomForm(Popup1.Popupform).Left := TCustomForm(Popup1.Popupform).Left + 5;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WebBrowser1.URL := 'www.google.com';
  WebBrowser1.Navigate;
  Popup1.Popup(FALSE);
end;

end.

残念ながら、動きもオーバーレイも機能しません。現在のコードは、TCustomForm(Popup1.Popupform).Left を参照するときに例外をスローします。例外が発生する理由は、親フォームで左マウス ダウン イベントが発生するとすぐに、Delphi がポップアップを閉じる(ポップアップ フォームを破棄する)ためです。さらに奇妙なのは、クリックしても反応しないにもかかわらず、閉じたはずの Web ブラウザのポップアップがまだ表示されていることです。

コードを Popup1.Position.X に変更しても例外はスローされませんが、もちろんポップアップは移動しません。

さらに、ポップアップの親であるラベルは、メイン フォームが所有する Web ブラウザの下に表示されたままです。

アップデート 3

いくつかの問題が見つかりましたが、それらを修正しても機能が改善されるわけではありません。

  1. なんらかの (不可解な) 理由で、コントロールを切り取り (CTRL-X)、別のコントロールを選択して貼り付け (CTRL-V) すると、選択したコントロールではなく、切り取ったコントロールがメイン フォームに貼り付けられるようです。コントロールの親を変更する唯一の方法は、ストラクチャー ツリーにドラッグ アンド ドロップすることです。
  2. コントロールの親を PopUp に変更した後、Popup1.Popup(FALSE) を呼び出すとすぐに例外が発生します。これは、Create イベントでポップアップが表示されていることが原因であると考えられます。OnClick イベントに移動すると、例外が取り除かれます。
  3. メイン フォームがクリックされたときにポップアップが閉じないようにするには、.Popup を呼び出す前に StaysOpen プロパティを設定する必要があるようですが、実際には、このプロパティは正しく機能していないようです。たとえば、次のコードは TCustomForm(Popup1.PopupForm).Left 行に到達しますが、ポップアップ フォームが既に破棄されているため、例外がスローされます。

コード:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Popup1.StaysOpen := TRUE;
  Popup1.Popup(FALSE);

  if Popup1.HasPopupForm then
    TCustomForm(Popup1.PopupForm).Left := TCustomForm(Popup1.PopupForm).Left - 5;
end;
4

1 に答える 1

2

解決策については、次のことを知っておく必要があります。

  1. 各 Firemonkey フォームは、 Main UIViewControllerのルート ビューによるサブビューであるNative UIViewに基づいています。したがって、FireMonkey フォームにコントロールを挿入すると、そのコントロールは Form のUIViewにとどまります。
  2. すべての標準的な Firemonkey コントロールには、ネイティブ UIView がありません。FMX フォームには、すべての FMX コントロールがあり、それらを管理します。
  3. Firemonkey WebBrowser はUIWebViewに基づいており、Firemonkey フォームのUIViewのサブビューのように表示されます。
  4. すべてのポップアップ フォームは、透明な背景を持つ UIView に基づいています。ポップアップの位置とサイズは、プロパティ TForm.Position、TForm.Size で設定します。そこで、TWebBrowser で Form の上に背景が透明なフォームを作成し、サイズと位置を設定します。

問題を解決するには、次のことができます。

  1. 新しいフォームまたはポップアップ フォームを作成する
  2. サイズと位置を設定します。
  3. WebBrowser でフォームから表示します。この場合、新しいフォームはすべての UIView の上に別の UIView として表示されます
于 2013-08-02T13:23:09.763 に答える