2012-12-22 80 views
1

有沒有辦法只根據名稱來動態地創建表格; 這個概念是這樣的。我有一個主窗體,並且通過一些用戶選擇,必須創建一些預定義窗體並停靠在主窗體上的頁面控件上的Tabitems上。 我知道的形式的名字,我知道什麼時候創建這些每個人,但我想知道如果一個過程調用創建這些形式,並沒有在所有的這些信息的更好的方式我碼。按名稱動態創建表單?

其德爾福XE3 firemonkey,在Win 7

提前感謝所有幫助

回答

5

顯然對Firemonkey德爾福不會自動註冊表單類是可用的名字,所以你首先需要像這樣添加一些能夠改變你的窗體類單位的末尾:

unit Form10; 
[ ... ] 
// Right before the final "end." 
initialization 
    RegisterFmxClasses([TForm10]); 
end. 

這會自動註冊TForm10所以它可以通過名稱。接下來,您可以使用這種代碼通過它的類名在運行時創建的一種形式:

procedure TForm10.Button1Click(Sender: TObject); 
var ObjClass: TFmxObjectClass; 
    NewForm: TCustomForm; 
begin 
    ObjClass := TFmxObjectClass(GetClass(ClassName)); 
    if ObjClass <> nil then 
    begin 
    NewForm := ObjClass.Create(Self) as TCustomForm; 
    if Assigned(NewForm) then 
     NewForm.Show; 
    end 
end; 
1

,當你有這方面的類引用您只能創建對象。要獲得給定字符串名稱的類引用,請致電FindClass。在結果上調用構造函數。在編譯器允許您訪問所需的構造函數之前,您可能必須將結果鍵入到不同的元類中。在VCL,您可以使用TFormClass,但普通的老式​​會工作,也因爲所有FireMonkey對象是TComponent後裔;最重要的部分是你可以訪問正確的構造函數,這就是你需要的構造函數的介紹。

它僅適用於已類註冊。你的表單類應該由Delphi自動註冊,但如果他們沒有,你可以打電話RegisterClasses手動或RegisterFmxClasses如果你需要把你的班級羣。

Delphi.About.com has a VCL demonstration.

+0

謝謝你的幫助,但與firemonkey.There的一個問題是沒有TFormClass獲得類名,它在delph.about示例中。在findClass的程序,返回TPersistentClass類型,我不能強制轉換它TForm的,我無法通過新的形式owner.Any想法? – ManosM

+1

不要輸入到TForm;結果不是那種類型。類型轉換爲* metaclass *類型。 VCL和FMX之間的差異並不大。 –