2009-10-23 67 views
0

使用我正在進行的基於TFrames的組件集項目,我遇到了各種實例,我想在運行時用一個TFrame的組件(通常是非可視的)替換其中一個這是在運行時動態生成的。參考或教程來澄清對象引用混淆

我想我可能已經找到了我的直接問題的答案here,但是在我發現它之前,我自己進行了深入的探索和實驗,現在已經很清楚,我已經瞭解了很多關於Delphi如何處理對象引用特別是關於表單/框架,以及(通常)作爲對象引用的類屬性而非非指針值。

一個實驗中的一個具體例子是在這裏:

(在三個TButtons形式)

procedure TForm1.Button3Click(Sender: TObject); 
var 
    MyButton : TButton; 

begin 
    MyButton := TButton.Create(Self); 
    MyButton.Caption := 'New Button'; 
    MyButton.Parent := Form1; 
    Form1.Button2 := MyButton; 
    Form1.Repaint; 
    ShowMessage('Button2 caption = ' + Form1.Button2.Caption); 
end; 

不與創建按鈕取代Button2的,但同時顯示在表格上。 ShowMessage結果表明Button2的標題仍然=「Button2」

我發現自己在問「這個'非替換'是獨特的形式,還是對其他類也是如此?等等。簡言之,我發現了另一個我自己無知的地方。 ;-)我發現在處理實例/對象引用/ derefencing /類定義/類屬性等時,事情的行爲通常與他們期望的完全一樣,但其他時候,完全沒有,甚至沒有關閉。

很明顯,我需要在這方面進行研究。而不是圍繞這一主題愚蠢的問題旋轉後交愚蠢的問題,我想我會問這個來代替:

什麼是獲得在微妙的區別更好地把握一個真的很好的參考或教程Re:怎麼德爾福手柄這樣的事情?

在此先感謝您的幫助!

+0

你想達到什麼目的?像所有的語言和環境一樣Delphi有自己的做事方式。在Delphi中創建動態表單確實很容易,所以如果你解釋它是什麼,你正試圖實現它們可能會有幫助 – 2009-10-26 07:59:06

回答

4

表單上的那些字段在編寫代碼時純粹是爲了您的方便。你可以從.pas文件中刪除它們,它們仍然會顯示出來。表單的佈局是在DFM中定義的,表單對象包含放置在其上的控件的引用的內部列表,就像任何其他可視化控件一樣。

我不知道關於這個主題的教程,但我知道如何替換一個按鈕。大部分情況都是正確的,但是在覆蓋引用之前,您還必須先釋放Form1.Button2。這將導致按鈕將其本身從表單的控制列表中刪除,作爲其銷燬過程的一部分。或者,如果您想將按鈕保存在某處而不是銷燬它,請撥打Form1.RemoveControl(Button2);