全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1030
推到 Plurk!
推到 Facebook!

元件Field Create及Free問題

尚未結案
VictorYu
一般會員


發表:1
回覆:2
積分:0
註冊:2004-05-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-28 09:35:26 IP:61.30.xxx.xxx 未訂閱
請問當在撰寫元件時,若基本繼承於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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-28 14:19:15 IP:211.76.xxx.xxx 未訂閱
VictorYu你好:     試試把
 
FListView:= TListView.Create(Self);
改成
 
FListView:= TListView.Create(Self.Owner);
Parent也設定為Self.Owner。 這樣還會不會有Access Violation???
VictorYu
一般會員


發表:1
回覆:2
積分:0
註冊:2004-05-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-28 16:59:05 IP:61.30.xxx.xxx 未訂閱
pwipwi你好: 其實我之前就試過了,結果會更慘,一直Access Violation到關不了程式,若照我原本寫法,Form開啟時運作都正常,一但關掉Form就會出現Access Violation,有沒有可能是我Form的建立方式不對: MyForm:= TMyForm.Create(MainWindow); MyForm.ShowModal; MyForm.Free;
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-29 10:59:21 IP:61.30.xxx.xxx 未訂閱
你好: 下面的程式碼是依你的描述所寫,請注意紅色的宣告,當 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-29 23:04:51 IP:218.175.xxx.xxx 未訂閱
感謝ha0009大大精闢的見解,原來是這麼一回事,多謝指導
系統時間:2024-05-18 7:08:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!