Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
問題如下:
type media=class(TObject) a:Integer; MyImage: TImage; MyMCI: TMediaPlayer; . . end; procedure xxx.Formcreate(...); var Mymedia : media; begin Mymedia := media.Create(self); . end;
只寫這樣, media class 中的 MyImage,MyMCI 有被create 嗎?
該物件還沒有建構
我實驗的方法是, 在子類別的建構程序中顯示一段測試文字, 以該測試文字是否出現來推論該物件是否建構
一般來說, 在 var 後面的定義只是在堆疊中配置一個指向某一特定類料型態的「指標」而已,在經過 Create 建構後, 該物件才真正存在
以我的實驗結果看來, 的確如此, 因此, 在類別中如果嵌入其他類別, 在建構程序必須同時畏建構這些嵌入的類別, 在解構程序中將這些嵌入的類別一併解構目前我僅知的例外是在 DELPHI IDE 中, Delphi 為我們自動加入的 TFromXXX 是個例外
不知道其他網友對這個題目的看法如何?
實驗的過程一併 post 如下:
![]() |
1. 新開一個 project |
![]() |
2. 在 form1 中安置一個 button, 並為該按鈕撰寫事件處理程序 |
![]() |
3. 實驗的原始程式碼:
unit Unit1; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; (* 一個子類別 *) TSubTest = Class(TObject) private iTest: integer; public constructor Create; end; (* 一個測試用的簡單類別 *) TTest = class(TObject) Circle: boolean; ASubTest: TSubTest; end; var Form1: TForm1; implementation {$R *.DFM} constructor TSubTest.Create; begin inherited Create; (* 在建構時顯示一段測試資料 *) (* 這樣子我們可以清楚知道它建構了沒 *) MessageDlg('A TSubTest object created', mtInformation, [mbOK], 0); end; (* Button1 的 OnClick 事件 *) procedure TForm1.Button1Click(Sender: TObject); var ATest: TTest; (* 一個指向 TTest 的參考 *) begin ATest := TTest.Create; (* 少了這列會產生 GP Error *) (* 並沒有出現 'A TSubTest object created' *) (* 因此, 可推論該子類別尚未建構 *) MessageDlg('Test Pause', mtInformation, [mbOK], 0); ATest.Circle := True; ATest.ASubTest := TSubTest.Create; (* 少了這列一樣會產生 GP Error *) ATest.ASubTest.iTest := 1; ATest.Free; end; end. |
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |