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

constructor的使用方法

答題得分者是:danny
daniel710624
一般會員


發表:11
回覆:13
積分:4
註冊:2003-04-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-07 16:36:48 IP:202.105.xxx.xxx 訂閱
各位好! 我有一段程式,一直出現Warning, 不知該如何解? 可否請各位指點一下觀念上出了什麼錯誤?
我使用BDS 2006:

type
TFormQrySY132 =
class(TForm)
....................

private

{ Private declarations }

FMySQL: String;
public
{ Public declarations }
constructor
Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; sMySQL: String); overload; virtual;
property MySQL : String read FMySQL;
.......................
.......................

constructor
TFormQrySY132.Create(AOwner: TComponent);
begin

inherited
Create(AOwner);
end;

constructor TFormQrySY132.Create(AOwner: TComponent; sMySQL: String);
begin

FMySQL := sMySQL;
inherited Create(AOwner);
end
;

....................
當建立 FormQrySY132 的時候, 我可以有兩種Create方式:
FormQrySY132 := TFormQrySY132.Create(Self);

FormQrySY132 := TFormQrySY132.Create(Self, 'SELECT * FROM MYTABLE');

我的問題:
<basefont></basefont> 1.程式在編譯的時候會在這一行
constructor Create(AOwner: TComponent; sMySQL: String); overload; virtual;
出現Warning錯誤: Method 'Create' hides virtual method of base type 'TCustform'
是否我宣告錯誤?如何才是正確的使用方法?
2.下面這段程式有必要嗎?
constructor TFormQrySY132.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
它直接進行inherited Create(AOwner), 沒做其它事! 是否有必要在程式中寫上這麼一段?

感謝各位指導!
編輯記錄
daniel710624 重新編輯於 2007-08-07 16:40:01, 註解 無‧
daniel710624 重新編輯於 2007-08-07 16:42:41, 註解 無‧
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-07 16:46:35 IP:220.130.xxx.xxx 訂閱
不知道你有沒有查inherited是作什麼用的,
warning最主要告訴你,你宣告的這個函式已經有一個隱含的上層同名函式

inherited就form而言是必要的,因為你繼承的form,並不會直接繼承上一層constructor的內容,
這樣導致上一層在constructor處理的事你沒有繼承到,使用inherited就是指定使用上一層的函式
相對的,在constructor有inherited,在desctructor裡面也要inherited
通常我們會在construct時去初始化並處理記憶體,在destruct時去釋放記憶體,
所以在construct的慣例通常是先inherited上一層再處理自己這一層的事,
在destruct的慣例則是先把自己的釋放掉再inherited上一層

所以並不是沒作其它事,但是我想這個好像是基本(?)
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-07 16:50:19, 註解 無‧
daniel710624
一般會員


發表:11
回覆:13
積分:4
註冊:2003-04-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-07 18:30:20 IP:202.105.xxx.xxx 訂閱
感謝您的協助!
我了解inherited的意函, 也知道出現Warning的原因!
但如果我須要兩種Create函式, 做到下面的需求, 該如何修改我的程式?
FormQrySY132 := TFormQrySY132.Create(Self);

FormQrySY132 := TFormQrySY132.Create(Self, 'SELECT * FROM MYTABLE');

望您再指點一下! 謝謝!

另外! 在constructor , 依我的習慣,除非是TForm本身的Properties/Methods或者是
其他元件的Properties/Methods , 否則, 我都會寫在inherited Create前面!
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-07 18:46:10 IP:220.130.xxx.xxx 訂閱
我不太懂你的需求需要怎樣的協助,如果你只是為了那個warning,那就將inherited加上去就可以
我比較偷懶,如果self的那個跟多sql的那個作的事只差在sql相關的init,
那就將inherited寫在self,sql的去引用它,如果compiler持續的complain,那就將inherited獨立在兩個函式中

至於為什麼是慣例,我想你可以參考跟物件有關的書籍,如Delphi programming & problem soving
建構先繼承是因為要先初始化上層,再初始化自己,因為你在初始化自己的過程中可能就會用到上層的資源,若是上層未初始化,就容易產生無預警錯誤,反之亦然。

當然,你有你的理由需要先初始自己,或者夾在中間都可以,這是Delphi授予的自由。

Sorry,我誤會了,你想要的是這個keyword:reintroduce,查一下help就有了
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-07 18:56:11, 註解 無‧
daniel710624
一般會員


發表:11
回覆:13
積分:4
註冊:2003-04-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-07 19:46:01 IP:202.105.xxx.xxx 訂閱
需要怎樣的協助?
這麼問吧! 我的程式在Public處做了以下宣告:
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; sMySQL: String); overload; virtual;
這樣是對還是錯? 如果是錯, 那該怎麼改?
我加上reintroduce
constructor Create(AOwner: TComponent); reintroduce; overload; override;
constructor Create(AOwner: TComponent; sMySQL: String); reintroduce; overload; virtual;

確實不會再出現Warning! 但是否這就正解?
在網路上找到類似的範例如下, 都沒有使用reintroduce, 只不過, 那是Delphi 4的範例,
不知是不是之後的版本才需要加?
...........
public
{ Public declarations }
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; MyCaption: string); overload; virtual;
published
{ Published declarations }
end;

implementation

constructor TMyButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Width := 185;
Height := 105;
end;

constructor TMyButton.Create(AOwner: TComponent; MyCaption: string);
begin
inherited Create(AOwner);
Width := 185;
Height := 105;
Caption := MyCaption;
end;

Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-07 22:04:34 IP:203.73.xxx.xxx 訂閱
我想如果你都能自己找code來看,那不妨考慮一下去trace VCL中那些有多個constructor的component,看他們怎麼寫最快
再或者,我認為你應該也了解那幾個identifer的意義,那麼自己實測一遍是不是你要的效果也OK。
嘗試去建一個從TObject繼承下來的class,然後再以這個為base去建你需要測試的class
將你認為可能有問題的部份從頭到尾徹底的測一遍就是了
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2007-08-07 22:05:15, 註解 無‧
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-07 22:16:07 IP:61.31.xxx.xxx 訂閱
constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; sMySQL: String); overload; virtual;

就可以了。 甚至
Create(AOwner: TComponent) 沒用到就不需在申告。減少 OverLoad
但必須在 Create 中,inherited Create(AOwner);

至於 Warning 不需理會。

這題目應是 VCL 區,至少讓我表現一下
。 o o


wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-07 22:20:55 IP:61.31.xxx.xxx 訂閱
有句話是這麼說地:「你爽就好 .... 」

開發一個專案,沒有十幾條 Warning。Delphi 是不會甘心地。
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-08-07 22:35:58 IP:203.73.xxx.xxx 訂閱
既然wameng大都這麼說,我就順手搬家了..:P
不過我還是不習慣看到有warning,如果有不需要看到的warning我會用compiler directive遮掉..XD
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
danny
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-08-07 23:34:08 IP:211.76.xxx.xxx 訂閱
這個問題只要改成這樣就可以了, inherited Create(AOwner) 的問題就解決了
請參考 TCustomForm 的作法

constructor Create(AOwner: TComponent); overload; override;
constructor CreateNew(AOwner: TComponent; sMySQL: String); overload; virtual;

------
將問題盡快結案也是一種禮貌!
daniel710624
一般會員


發表:11
回覆:13
積分:4
註冊:2003-04-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-08-08 00:49:40 IP:202.105.xxx.xxx 訂閱
感謝各位提供的議建與解答!
我較贊同COFFEE大的看法, 看到有Warning,總是會心裡毛毛的....
所以我應該會採用Danny大的議建.
再次感各位的幫忙!
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-08-08 01:20:07 IP:203.73.xxx.xxx 訂閱
啊,我只是關掉warning而已,我可沒說解決它..:P
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
系統時間:2024-05-03 5:37:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!