2016-04-12 50 views
0

我使用TFireMonkeyContainer控件在VCL應用程序中嵌入Firemonkey表單。最初,一切正常。然而,每當我做一些觸發TChangeTabAction(在TTabControl中的標籤之間來回滑動)時,整個應用程序凍結並停止響應。即使Windows無法檢測到它沒有響應 - 標題欄甚至被凍結,我必須從IDE或任務管理器終止進程。當在Firemonkey應用程序中純粹運行時,相同的表單完美工作。通過TFireMonkeyContainer在VCL應用程序中創建FMX表單 - 應用程序凍結

重現問題並沒有太多,沒有代碼,只是表單設計。

  1. 安裝TFireMonkeyContainer控制到IDE(或動態地使用)
  2. 創建新VCL窗體應用程序
  3. 掉落只有一個TFireMonkeyContainer VCL主窗體上控制
  4. 同一應用程序中創建新的FMX表格
  5. 分配FMX表格到容器
  6. 在FMX表格中,刪除一個TTabControl並添加幾個標籤
  7. 在FMX形式,落個新TActionList
  8. 新增多個TChangeTabAction S插入動作列表,每個選項卡
  9. 分配每個選項卡到相應的行動
  10. 在FMX形式之一,落一個新的按鈕
  11. 分配TChangeTabAction s到按鈕
  12. 運行應用程序的一個
  13. 注意如何當你在按鈕上移動鼠標時,UI很好地響應
  14. 注意你如何的sw標籤之間癢沒問題
  15. 手動點擊FMX窗體上的按鈕
  16. 注意如何在UI不再響應和應用程序搶佔繼續

我怎樣才能讓FMX TChangeTabAction按預期方式工作,而將我的表單嵌入此容器中?

編輯

正因爲上述解釋可能是不夠的部分,這裏有兩種形式的表單設計:

VCL形式:

object frmVcl: TfrmVcl 
    Left = 0 
    Top = 0 
    Caption = 'frmVcl' 
    ClientHeight = 405 
    ClientWidth = 666 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object FireMonkeyContainer1: TFireMonkeyContainer 
    Left = 40 
    Top = 40 
    Width = 577 
    Height = 305 
    FireMonkeyForm = frmFiremonkey.Owner 
    end 
end 

FMX形式:

object frmFiremonkey: TfrmFiremonkey 
    Left = 0 
    Top = 0 
    Caption = 'Form1' 
    ClientHeight = 480 
    ClientWidth = 640 
    FormFactor.Width = 320 
    FormFactor.Height = 480 
    FormFactor.Devices = [Desktop] 
    DesignerMasterStyle = 0 
    object TabControl1: TTabControl 
    Position.X = 24.000000000000000000 
    Position.Y = 72.000000000000000000 
    Size.Width = 585.000000000000000000 
    Size.Height = 289.000000000000000000 
    Size.PlatformDefault = False 
    TabIndex = 0 
    TabOrder = 0 
    TabPosition = PlatformDefault 
    object TabItem1: TTabItem 
     CustomIcon = < 
     item 
     end> 
     IsSelected = True 
     Size.Width = 67.000000000000000000 
     Size.Height = 26.000000000000000000 
     Size.PlatformDefault = False 
     StyleLookup = '' 
     TabOrder = 0 
     Text = 'TabItem1' 
    end 
    object TabItem2: TTabItem 
     CustomIcon = < 
     item 
     end> 
     IsSelected = False 
     Size.Width = 68.000000000000000000 
     Size.Height = 26.000000000000000000 
     Size.PlatformDefault = False 
     StyleLookup = '' 
     TabOrder = 0 
     Text = 'TabItem2' 
    end 
    object TabItem3: TTabItem 
     CustomIcon = < 
     item 
     end> 
     IsSelected = False 
     Size.Width = 68.000000000000000000 
     Size.Height = 26.000000000000000000 
     Size.PlatformDefault = False 
     StyleLookup = '' 
     TabOrder = 0 
     Text = 'TabItem3' 
    end 
    end 
    object Button1: TButton 
    Position.X = 32.000000000000000000 
    Position.Y = 16.000000000000000000 
    Size.Width = 105.000000000000000000 
    Size.Height = 41.000000000000000000 
    Size.PlatformDefault = False 
    TabOrder = 2 
    Text = 'Button1' 
    OnClick = Button1Click 
    end 
    object ActionList1: TActionList 
    Left = 512 
    Top = 24 
    object ChangeTabAction1: TChangeTabAction 
     Category = 'Tab' 
     Tab = TabItem1 
    end 
    object ChangeTabAction2: TChangeTabAction 
     Category = 'Tab' 
     Tab = TabItem2 
    end 
    object ChangeTabAction3: TChangeTabAction 
     Category = 'Tab' 
     Tab = TabItem3 
    end 
    end 
end 
+1

我想知道這個問題「不顯示任何研究工作」,「不明確」或「沒有用處」,因爲一個downvoter似乎認爲? –

+0

嗨傑裏 - TFireMonkeyContainer的作者在這裏。我會研究它。請隨時通過https://parnassus.co/support/file-bug-report/向我發送錯誤報告/示例應用程序。 –

+0

@DavidM完成並完成。它有點吸引人,因爲滑動效果是我在Firemonkey中設計我的應用程序的全部原因,但由於某些原因,外殼需要保持VCL。 –

回答

1

TFireMonkeyContainer阻止FMX應用程序消息循環運行,並推遲到VCL應用程序消息循環。替換的Windows應用程序服務對於方法HandleMessage(並返回false)或WaitMessage沒有做任何處理,錯誤地假定由於FMX消息循環從未運行,它們將永遠不會被調用。

但是,FMX的Application.ProcessMessages方法可以手動調用,當然,這將調用Windows應用服務方法,運行一個while循環,並立即結束。標籤轉換代碼調用ProcessMessages,直到轉換完成,並且因爲HandleMessage什麼也沒做,但也沒有處理任何消息,轉換從未繼續,導致無限循環,直到它完成。

latest commit in Github解決了這個問題,並修復了一些相關的應用程序服務方法,使其更像默認的FMX應用程序服務。

+1

謝謝,那確實解決了它。 –