2013-07-29 34 views
4

我們正在開始將我們現有的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. 

當我運行該應用程序我看到這一點:

enter image description here

這裏是我的意見:

  • 點擊按鈕沒有任何效果。
  • 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

我已經發現了一些問題,但它們固定不使它工作更好。

  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; 

回答

2

對於解決方案,我們應該知道:

  1. 在本地的UIView,這是在主要UIViewController中根視圖子視圖每個Firemonkey形式基地。因此,當您在FireMonkey表單上插入控件時,該控件將停留在Form的UIView上。
  2. 所有標準的Firemonkey控件都沒有Native UIView。 FMX表格具有所有FMX控件並對其進行管理。
  3. Firemonkey WebBrowser基於UIWebView並且在Firemonkey窗體的UIView中顯示爲子視圖。
  4. 所有彈出窗體都基於具有透明背景的UIView。彈出和大小設置通過屬性的位置TForm.Position,TForm.Size。因此,您可以使用TWebBrowser,設置大小和設置位置在Form上創建透明背景的表單。

對於您的問題,您可以的解決方案:

  1. 創建新的形式或彈出的形式
  2. 集的大小和它的位置。
  3. 從WebBrowser的窗體中顯示。在這種情況下,新窗體將顯示爲所有UIView頂部的分離UIView
+0

+ Yaroslav Brown - 我試過了你的建議。查看上面的更新以瞭解我的發現。 – norgepaul

+0

好的。我懂了。 1.在窗體 上添加TPopup 2.在TPopup中添加任何控件 3.調用Popup1.Popup; 對我來說彈出窗口出現在WebBrowser的上面 –

+0

我現在不能嘗試這個,但是......你是說a)將控件添加到彈出窗口將允許它們在本地iOS控件上顯示,並且b)彈出窗口包含一個本機控件,可以像FireMonkey控件一樣移動。 Popup是不是在iOS中以模態方式顯示? – norgepaul