既存の 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
いくつかの問題が見つかりましたが、それらを修正しても機能が改善されるわけではありません。
- なんらかの (不可解な) 理由で、コントロールを切り取り (CTRL-X)、別のコントロールを選択して貼り付け (CTRL-V) すると、選択したコントロールではなく、切り取ったコントロールがメイン フォームに貼り付けられるようです。コントロールの親を変更する唯一の方法は、ストラクチャー ツリーにドラッグ アンド ドロップすることです。
- コントロールの親を PopUp に変更した後、Popup1.Popup(FALSE) を呼び出すとすぐに例外が発生します。これは、Create イベントでポップアップが表示されていることが原因であると考えられます。OnClick イベントに移動すると、例外が取り除かれます。
- メイン フォームがクリックされたときにポップアップが閉じないようにするには、.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;