我們正在開始將我們現有的iOS(XCode)應用程序中的一個移植到Delphi FireMonkey(XE4)。到目前爲止,這是一個令人驚訝的平穩過程。然而,我們已經陷入死衚衕,我們不知道如何解決。基於iOS控件的FireMonkey控件行爲不正確
我們現有的應用類似於新的Google Maps應用。我們有一個webbrowser控件,顯示包含多個引腳的Google地圖。我們還有一個設置按鈕和一個信息面板,當一個引腳被連接時會出現。當按下相應的按鈕/引腳時,設置和信息面板從地圖上的左側和右側滑入。這在XCode應用程序中可以正常工作。
這是我們與FireMonkey端口遇到的問題:
- 我們無法顯示在網頁瀏覽器 控制的頂部FireMonkey控制。我知道這是因爲webbroswer是一個原生的 iOS控件。
- 一旦網頁瀏覽器控件出現,它就不能移動,例如如果我們 更改
position.x
財產,網頁瀏覽器保持它的位置。 如果我們使用內置的 動畫更改爲x屬性,這也是一樣的。似乎正常工作的唯一財產是visible
。
使用TMS iCL組件,我們可以糾正第一個問題。然而,對我們來說最令人擔憂的問題是第二個問題。如果不能移動webbrowser組件,就不可能實現使用webbrowser(或任何本地iOS控件)的現代外觀(滑動)UI。
有沒有人遇到過克服這些FireMonkey限制的方法?
UPDATE 1
作爲每雅羅的建議我嘗試以下:
1)創建第二形式與一個按鈕和一個web瀏覽器。
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)將Form2創建爲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;
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在父窗體發生鼠標左鍵事件後立即關閉彈出窗口(銷燬彈出窗體)。更令人感到奇怪的是,即使瀏覽器在點擊時沒有反應,仍然可以看到瀏覽器彈出窗口仍然可見。
將代碼更改爲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;
+ Yaroslav Brown - 我試過了你的建議。查看上面的更新以瞭解我的發現。 – norgepaul
好的。我懂了。 1.在窗體 上添加TPopup 2.在TPopup中添加任何控件 3.調用Popup1.Popup; 對我來說彈出窗口出現在WebBrowser的上面 –
我現在不能嘗試這個,但是......你是說a)將控件添加到彈出窗口將允許它們在本地iOS控件上顯示,並且b)彈出窗口包含一個本機控件,可以像FireMonkey控件一樣移動。 Popup是不是在iOS中以模態方式顯示? – norgepaul