元件Field Create及Free問題 |
尚未結案
|
VictorYu
一般會員 發表:1 回覆:2 積分:0 註冊:2004-05-14 發送簡訊給我 |
請問當在撰寫元件時,若基本繼承於TPanel,而Panel上有一按鈕,當按了按鈕時,會在元件所在的Form上顯示一ListView,ListView是元件的一個Field,所以在元件建立時,建立ListView,在元件毀滅時Free掉ListView,可是這裡出現了一個問題,這樣做的話,會產生Access Violation,若把ListView的Parent設為元件本身就都一切正常,但是因為Parent是元件本身,ListView便無法顯示於元件Panel所在的範圍以外,故想請問是那方面有問題,還是這種實作方法不對,多謝指導.. 元件 Create
FListView:= TListView.Create(Self);
FListView.Parent:= Self.Owner as TWinControl;
^^^^^^^^^^^^^^^^^^^^^^^^^改為Self就正常 元件 Destroy
FListView.Free;
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
VictorYu
一般會員 發表:1 回覆:2 積分:0 註冊:2004-05-14 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
下面的程式碼是依你的描述所寫,請注意紅色的宣告,當 WINDOW 要釋放時,會對 WINDOW 上的子物件傳送
WM_DESTROY 訊息。我在這裡攔截訊息將 TreeView 的 Parent 設為 nil 如此可避免錯誤的產生。因為設定 Parent
的同時,會被 Parent 加入管理列表(與 Owner 管理列表相同,你可檢視 TControl.SetParent 的程式碼),所以當
程式結束時,如果你不將 TreeView 由 Parent 列表移除(FTreeView.Parent := nil),那 TreeView 被TCustPanel
釋放後還會被 Parent 釋放一次而造成存取錯誤。
TCustPanel = Class (TPanel) private FTreeView : TTreeView; FButton1 : TButton; procedure BtnClick (Sender : TObject); procedure WMDESTROY(var Msg : TWMDestroy); message WM_DESTROY; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; implementation { TCustPanel } procedure TCustPanel.BtnClick(Sender: TObject); begin if FTreeView.Parent = nil then FTreeView.Parent := self.Parent else FTreeView.Parent := nil; end; constructor TCustPanel.Create(AOwner: TComponent); begin inherited; FButton1 := TButton.Create (Self); FButton1.Parent := self; FButton1.Caption := '按我'; FButton1.OnClick := BtnClick; FTreeView := TTreeView.Create(self); end; destructor TCustPanel.Destroy; begin FTreeView.Parent := nil; FreeAndNil (FTreeView); inherited; end; procedure TCustPanel.WMDESTROY(var Msg : TWMDestroy); begin FTreeView.Parent := nil; end; |
VictorYu
一般會員 發表:1 回覆:2 積分:0 註冊:2004-05-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |