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

類別繼承後在父類填入字串的內容,在子類無法保留!

答題得分者是:aftcast
jimmychn
一般會員


發表:3
回覆:21
積分:19
註冊:2002-09-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-24 01:50:19 IP:61.230.xxx.xxx 訂閱
又遇到繼承問題,父類有一字串,父類會填入資料,子類繼承父類,也會執行到填入該資料,
可是下次來看該資料卻變成空的!

測試程式:父類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(fmChild)==0) fmChild=new TfmChild(Application);
if (dynamic_cast(fmBase)==0) fmBase=new TfmBase(Application);
TileMode=tbVertical;
Tile();
}
//---------------------------------------------------------------------------
[/code]
------
>>>好心有好報
附加檔案:48d92c5b4be98_Test.jpg
編輯記錄
jimmychn 重新編輯於 2008-09-24 01:53:02, 註解 無‧
jimmychn 重新編輯於 2008-09-24 11:51:58, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-25 04:08:15 IP:59.115.xxx.xxx 訂閱
根據我的了解與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, 註解 無‧
系統時間:2024-04-25 22:57:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!