類別繼承後在父類填入字串的內容,在子類無法保留! |
答題得分者是:aftcast
|
jimmychn
一般會員 發表:3 回覆:21 積分:19 註冊:2002-09-09 發送簡訊給我 |
又遇到繼承問題,父類有一字串,父類會填入資料,子類繼承父類,也會執行到填入該資料,
可是下次來看該資料卻變成空的! 測試程式:父類TfmBase與子類TfmChild,在MDI子視窗建立時會填入字串 換成 char cPower[20]; 就沒問題! 難道是vcl元件才會有此問題?? 希望先進能幫忙找到問題!感謝囉! 父類程式 [code cpp] //--------------------------------------------------------------------------- class TfmBase : public TForm { __published: // IDE-managed Components TTimer *Timer1; TMemo *Memo1; void __fastcall FormCreate(TObject *Sender); void __fastcall Timer1Timer(TObject *Sender); void __fastcall FormClose(TObject *Sender, TCloseAction &Action); private: // User declarations public: // User declarations AnsiString sPower,sStartCompanyID,sEndCompanyID; __fastcall TfmBase(TComponent* Owner); }; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TfmBase::TfmBase(TComponent* Owner) : TForm(Owner) { Caption=Name; } //--------------------------------------------------------------------------- void __fastcall TfmBase::FormCreate(TObject *Sender) { sPower="1234567890"; if (sPower.IsEmpty()) { Memo1->Lines->Add("空白!"); } else { Memo1->Lines->Add(sPower); } } //--------------------------------------------------------------------------- void __fastcall TfmBase::Timer1Timer(TObject *Sender) { if (sPower.IsEmpty()) { Memo1->Lines->Add("空白!"); } else { Memo1->Lines->Add(sPower); } } //--------------------------------------------------------------------------- void __fastcall TfmBase::FormClose(TObject *Sender, TCloseAction &Action) { Action=caFree; } //--------------------------------------------------------------------------- [/code] 子類程式 [code cpp] //--------------------------------------------------------------------------- class TfmChild : public TfmBase { __published: // IDE-managed Components private: // User declarations public: // User declarations __fastcall TfmChild(TComponent* Owner); }; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TfmChild::TfmChild(TComponent* Owner) : TfmBase(Owner) { } //--------------------------------------------------------------------------- [/code] 主程式 [code cpp] //--------------------------------------------------------------------------- class TfmMain : public TForm { __published: // IDE-managed Components TPanel *Panel1; TButton *btStart; void __fastcall btStartClick(TObject *Sender); private: // User declarations public: // User declarations __fastcall TfmMain(TComponent* Owner); }; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TfmMain::TfmMain(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TfmMain::btStartClick(TObject *Sender) { if (dynamic_cast if (dynamic_cast TileMode=tbVertical; Tile(); } //--------------------------------------------------------------------------- [/code]
------
>>>好心有好報 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
根據我的了解與trace debug發現,在bcb中的物件初始化的順序與一般的c++不同。
vcl因為是delphi寫的,所以他的建構方式是由子到父的方向。而c 是由父到子。 而create的這個event也因為是配合delphi而用,故在bcb中要特別注意。看help檔中的一段話: Use of the OnCreate event is discouraged in C Builder because it can interact badly with the form constructor (see OldCreateOrder). It is recommended that you override the form constructor instead. (ps事實上改order也是無效的) 經過實際的追蹤,建構順序如下。TfmChild( ) --> TfmBase( ) -->TForm( ) -->TCustomForm( ) --> .......-->TfmBase::FormCreate( ) -->三個你的自定AnsiString被建構-->Caption=Name; 注意最後面的那三個過程! 在oncreate時sPower被建構且給值了,但之後sPower,sStartCompanyID,sEndCompanyID;三個值被建構。於是sPower的Data又空了。 建議你把sPower="1234567890";放於TfmBase::TfmBase( )建構式裡就不會有問題。因為它比oncreate還要更後面才執行。 當然,若你用的是char[ ] ,則沒有建構的問題,故值會一直被保持著。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-09-25 04:14:41, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |