2017-04-17 45 views
-1

在動態創建表單之前,Delphi中是否有任何方法可以從現有表單繼承? 我知道如何使用tobjects.create()來動態創建一個新表單,但是我需要通過在創建新表單時繼承該表單來創建一個完全像已經創建的表單一樣的表單。如何在Delphi中動態創建新表單並從現有表單繼承表單

+0

這不是*繼承*。它只是*創建一個新實例*,並且每次運行應用程序時都會執行該操作。 'Application.CreateForm'可以在你的項目中完成它,你可以在你的代碼中使用'NewForm:= TForm1.Create()'來代替'TForm1',用你想要使用的表單類的名字來代替'TForm1'。 –

回答

1
var 
     Form2: TForm1; 
    begin 
     Form2 := TForm1.create(nil); 
     try 
      // now form2 is exactly "like" form1 when it was created 
      Form2.Top := Form1.Top; 
      Form2.Left := Form1.Left; 
      // now some of Form2's properties are like Form1's are now            
      Form2.ShowModal; 
     finally 
      Form2.Free; 
     end; 

所以問題是,「like」是什麼意思?如果Form1自創建以來發生了運行時更改,則需要在創建後將相同的運行時更改應用於form2。繼承無法爲你做到這一點。繼承是「容器」,而不是數據。要複製表單的「數據」,您需要編寫一個過程,該過程需要將form2的所有屬性值設置爲form1的屬性值。或者,也許只是複製你關心的屬性。

+0

感謝您的回覆先生。我問這個問題,知道我是否可以切換到指定的形式。例如: –

+0

:在某些事件中,我需要切換到我在編輯框中指定的窗體 –

+0

問另一個問題! – nolaspeaker

0

試試這個

interface 
uses Forms, SysUtils, Classes, Controls; 

type 
    TCommonFormClass = class of TCommonForm; 
    TCommonForm = class(TForm) 
    private 
     // Private declaration 
    public 
     // Public declaration 
     constructor Create(Sender: TComponent); virtual; 
    end; 

implementation 

constructor TCommonForm.Create(Sender: TComponent); 
begin 
    inherited Create(Sender); 
    // do other 
end; 

和你的孩子的形式會是這樣

type 
    TMyForm = class(TCommonForm) 
    private 
     // Private declaration 
    public 
     // Public declaration 
    end; 

implementation 

{$R *.dfm} 

end. 

創建一個子使用:

procedure CallChild; 
var MyForm: TMyForm; 
begin 
    MyForm:= TMyForm.Create(nil); 
    try  
    MyForm.ShowModal; 
    finally 
    MyForm.Free; 
    end; 
end;