線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1182
推到 Plurk!
推到 Facebook!

關於 TStatusBar 的元件設計問題?

答題得分者是:danny
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-23 17:32:04 IP:61.219.xxx.xxx 未訂閱
請問: 目前季想繼承TStatusBar,在上面有三個TStatusPanel, 也就是我新的元件一拉到Form上就已經拉好三個TStatusPanel。 我的程式如下: unit SBTest; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls; type TSBTest = class(TStatusBar) private Panel1 : TStatusPanel; Panel2 : TStatusPanel; Panel3 : TStatusPanel; { Private declarations } protected { Protected declarations } public constructor Create(AOwner: TComponent); override; destructor Destroy; override; { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('YoungNet VCL V3', [TSBTest]); end; { TSBTest } constructor TSBTest.Create(AOwner: TComponent); begin inherited Create(AOwner); Panel1 := self.Panels.add; panel1.text := 'Panel1'; Panel1.Index := 0; panel1.width := (AOwner as TForm).width div 3; Panel2 := self.Panels.add; panel2.text := 'Panel2'; Panel2.Index := 1; panel2.width := (AOwner as TForm).width div 3; Panel3 := self.Panels.add; panel3.text := 'Panel3'; Panel3.Index := 2; panel3.width := (AOwner as TForm).width div 3; end; destructor TSBTest.Destroy; begin Panel1.free; panel2.free; panel3.free; inherited Destroy; end; end. 則正常,但是如果加上Panel3時, 尚關閉表單時,則會出現記憶體錯誤, 但如果變回二個panel時,則正常。 但是我用標準元件時,設定成三個panel就不會有問題 請問是否是在我Add時出了什麼問題? ---------------- 初出芧房程設師, 左鍵右鼠寫程式, 日扣夜寫眼框溼, 望能早成系分師。 ----------------
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-23 17:51:39 IP:147.8.xxx.xxx 未訂閱
I have no problem in using TSBTest on Delphi 7... although I have not install it. Anyway I guess it is your as causing problem. Using Delphi 6? Try TForm(AOwner).Width instead of the as statement.
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-23 17:54:22 IP:211.76.xxx.xxx 未訂閱
引言: 請問: 目前季想繼承TStatusBar,在上面有三個TStatusPanel, 也就是我新的元件一拉到Form上就已經拉好三個TStatusPanel。 我的程式如下:

destructor TSBTest.Destroy;
begin
  Panel1.free;
  panel2.free;
  panel3.free;
  inherited Destroy;
end;
則正常,但是如果加上Panel3時, 尚關閉表單時,則會出現記憶體錯誤, 但如果變回二個panel時,則正常。 但是我用標準元件時,設定成三個panel就不會有問題 請問是否是在我Add時出了什麼問題?
是您 Free StatusPanel 的順序不對, 要反過來 Free (3,2,1 ...) 不過您這個例子 StatusPanel 是不用 Free 的, 它會由 Owner 負責 Free 掉.
------
將問題盡快結案也是一種禮貌!
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-23 18:12:43 IP:61.219.xxx.xxx 未訂閱
嗯, 我改成 Panel3.free; panel2.free; panel1.free; 還是會Error 不過如果不Free的話就正常了, 所以還是交給StatusBar來釋放好了~~ ---------------- 初出芧房程設師, 左鍵右鼠寫程式, 日扣夜寫眼框溼, 望能早成系分師。 ----------------
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-23 18:24:56 IP:218.16.xxx.xxx 未訂閱
應不是次序問題而是你手動 free 了後執行 inherited destroy 時 TStatusBar 去 free 它的 panels[2] 時出錯。我沒去看源程式但你說的現像似乎是對於頭兩個 TStatusBar 預定會有的 Panel Free 時是會檢查是否存在真的存在才 Free, 但對第三個起 TStatus Bar 會認為一定是後加的所以一定存在便沒先檢查。 總之,照 Danny 版主說的不用Free就應沒問題了。
系統時間:2024-04-29 18:29:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!