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

overload問題?

答題得分者是:channel
vivi666666
初階會員


發表:83
回覆:94
積分:35
註冊:2003-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-21 11:32:54 IP:203.69.xxx.xxx 未訂閱
1:以下 procedure 呼叫 editpick時,傳入參數只有4個參數,可是實際有9個參數 (function EditPick),為什麼可以如此做不是參數一樣?是因為overload,所以可以嗎?如果可以如何對應參數? 2:傳回值variant是什麼意思? procedure TFmG311.Edit1DblClick(Sender: TObject); begin EditPick('select * from AC_ACNTID_PICK', Sender, 'ACNTID', 'ACNTNM'); end; function EditPick(vsql:string;Sender:TObject;sLookupResultFields:string=''; sDescptField:string=''; sTBLNames:string=''; doFilter:boolean=True; lUseCDS:boolean=False; sCDSName:string=''; sFilterFields:string=''): variant; overload;
william
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-21 11:40:43 IP:147.8.xxx.xxx 未訂閱
It is not due to overload. It is becasue of the default parameters, e.g.    function f(x: integer; c: integer = 1);    f(1) = f(1,1)    BTW, you should better avoid overloading function/procedure with default parameters. Quoted from Delphi help:    If you use default parameter values in an overloaded routine, avoid ambiguous parameter signatures. Consider, for example, the following. procedure Confused(I: Integer); overload; ... procedure Confused(I: Integer; J: Integer = 0); overload; ... Confused(X); // Which procedure is called? In fact, neither procedure is called. This code generates a compilation error. 發表人 - william 於 2003/03/21 11:41:36
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-21 12:00:54 IP:211.21.xxx.xxx 未訂閱
引言: 1:以下 procedure 呼叫 editpick時,傳入參數只有4個參數,可是實際有9個參數 (function EditPick),為什麼可以如此做不是參數一樣?是因為overload,所以可以嗎?如果可以如何對應參數?
沒有錯就是overload。 overload是什麼呢?字面上的解釋就是負載的意思。 實際上overload就是可以讓您有許多相同名稱的function、procedure,但是所傳入的參數皆不同。這麼的設計方式就是要讓傳入不同參數、相同功能的function、procedure,能夠取相同的名稱,避免取太多的名稱。當然您也可以不要使用overload,只是您的function、procedure的名稱不同就可以了。 如何對應參數? 這一點您可以不用擔心,Delphi會自動幫您對應參數,就是依您所下的參數去做對應。 例如: function Test(a:Integer,b:String): Variant; function Test(a:Integer): Variant; 在呼叫時: Test(1,'a');Delphi幫您對應到function Test(a:Integer,b:String): Variant; Test(1);Delphi幫您對應到function Test(a:Integer): Variant;
引言: 2:傳回值variant是什麼意思?
variant:就是可變的型態。包含Integer、String…甚至是Array皆可。
var
  V: Variant;
begin
  V := 1;
  V := 1.0;
  V := 'String';
  V := VarArrayOf(['a','b']);
end;
~小弟淺見,參考看看~ 發表人 - channel 於 2003/03/21 12:07:25
------
~小弟淺見,參考看看~
vivi666666
初階會員


發表:83
回覆:94
積分:35
註冊:2003-03-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-21 13:45:40 IP:203.69.xxx.xxx 未訂閱
引言:
引言: 1:以下 procedure 呼叫 editpick時,傳入參數只有4個參數,可是實際有9個參數 (function EditPick),為什麼可以如此做不是參數一樣?是因為overload,所以可以嗎?如果可以如何對應參數?
沒有錯就是overload。 overload是什麼呢?字面上的解釋就是負載的意思。 實際上overload就是可以讓您有許多相同名稱的function、procedure,但是所傳入的參數皆不同。這麼的設計方式就是要讓傳入不同參數、相同功能的function、procedure,能夠取相同的名稱,避免取太多的名稱。當然您也可以不要使用overload,只是您的function、procedure的名稱不同就可以了。 如何對應參數? 這一點您可以不用擔心,Delphi會自動幫您對應參數,就是依您所下的參數去做對應。 例如: function Test(a:Integer,b:String): Variant; function Test(a:Integer): Variant; 在呼叫時: Test(1,'a');Delphi幫您對應到function Test(a:Integer,b:String): Variant; Test(1);Delphi幫您對應到function Test(a:Integer): Variant;
引言: 2:傳回值variant是什麼意思?
variant:就是可變的型態。包含Integer、String…甚至是Array皆可。
var
  V: Variant;
begin
  V := 1;
  V := 1.0;
  V := 'String';
  V := VarArrayOf(['a','b']);
end;
~小弟淺見,參考看看~ 發表人 - channel 於 2003/03/21 12:07:25
如何對應參數?傳入參數只有4個參數與9個參數 (function EditPick),後面5參數是傳空的嗎?
vivi666666
初階會員


發表:83
回覆:94
積分:35
註冊:2003-03-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-21 13:52:45 IP:203.69.xxx.xxx 未訂閱
引言:
引言: 1:以下 procedure 呼叫 editpick時,傳入參數只有4個參數,可是實際有9個參數 (function EditPick),為什麼可以如此做不是參數一樣?是因為overload,所以可以嗎?如果可以如何對應參數?
沒有錯就是overload。 overload是什麼呢?字面上的解釋就是負載的意思。 實際上overload就是可以讓您有許多相同名稱的function、procedure,但是所傳入的參數皆不同。這麼的設計方式就是要讓傳入不同參數、相同功能的function、procedure,能夠取相同的名稱,避免取太多的名稱。當然您也可以不要使用overload,只是您的function、procedure的名稱不同就可以了。 如何對應參數? 這一點您可以不用擔心,Delphi會自動幫您對應參數,就是依您所下的參數去做對應。 例如: function Test(a:Integer,b:String): Variant; function Test(a:Integer): Variant; 在呼叫時: Test(1,'a');Delphi幫您對應到function Test(a:Integer,b:String): Variant; Test(1);Delphi幫您對應到function Test(a:Integer): Variant;
引言: 2:傳回值variant是什麼意思?
variant:就是可變的型態。包含Integer、String…甚至是Array皆可。
var
  V: Variant;
begin
  V := 1;
  V := 1.0;
  V := 'String';
  V := VarArrayOf(['a','b']);
end;
~小弟淺見,參考看看~ 發表人 - channel 於 2003/03/21 12:07:25
如何對應參數?傳入參數只有4個參數與9個參數 (function EditPick),後面5參數是傳空的嗎?
william
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-21 14:01:53 IP:147.8.xxx.xxx 未訂閱
引言:function EditPick(vsql:string;Sender:TObject;sLookupResultFields:string=''; sDescptField:string=''; sTBLNames:string=''; doFilter:boolean=True; lUseCDS:boolean=False; sCDSName:string=''; sFilterFields:string=''): variant; overload;
EditPick('select * from AC_ACNTID_PICK', Sender, 'ACNTID', 'ACNTNM'); is probably NOT using overload. In order to make a confirmation, I think you would better list all overloaded function EditPick. I think in your case it is using [b]default parameters[b].
Justmade
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-21 14:09:38 IP:218.16.xxx.xxx 未訂閱
如 William 所說,九個參數你可以只傳四個,並不是 Overload 的原固,而是 Delphi 語言的另一語法所致 ── 參數預設值。 你看看你的 Function EditPick(...) 九個參數中,尾後七個不是比正常多了 =xxx 嗎,這就是預設值了。 在有預設值的參數來說,若使用者有傳參數,則以使用者所傳的為準,若沒有,則以預設值為參數值。所以 EditPick('select * from AC_ACNTID_PICK', Sender, 'ACNTID', 'ACNTNM'); 就等於 EditPick('select * from AC_ACNTID_PICK', Sender, 'ACNTID', 'ACNTNM', '', True, False, '', ''); Varient 的使用時機就是當你不知道該變數會是甚麼形態時,就可以用這個萬用形態。例如 Locate 第二個參數是要找尋的欄位值,有很多種不同形態的可能所以便用 Varient 了。 可以,由於 Varient 會非常沒效能的一種形態,可以不用時就不應使用。
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-21 14:20:23 IP:211.21.xxx.xxx 未訂閱
引言: 如何對應參數?傳入參數只有4個參數與9個參數 (function EditPick),後面5參數是傳空的嗎? function EditPick(vsql:string;Sender:TObject;sLookupResultFields:string=''; sDescptField:string=''; sTBLNames:string=''; doFilter:boolean=True; lUseCDS:boolean=False; sCDSName:string=''; sFilterFields:string=''): variant; overload;
除了第一、二個參數vsql:string; Sender:TObject之外其餘的參數皆有預設值,所以後面5參數是傳空的嗎?也可以這麼說,但應該說是傳預設值比較正確。 ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
vivi666666
初階會員


發表:83
回覆:94
積分:35
註冊:2003-03-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-21 16:25:44 IP:203.69.xxx.xxx 未訂閱
引言:
引言: 如何對應參數?傳入參數只有4個參數與9個參數 (function EditPick),後面5參數是傳空的嗎? function EditPick(vsql:string;Sender:TObject;sLookupResultFields:string=''; sDescptField:string=''; sTBLNames:string=''; doFilter:boolean=True; lUseCDS:boolean=False; sCDSName:string=''; sFilterFields:string=''): variant; overload;
除了第一、二個參數vsql:string; Sender:TObject之外其餘的參數皆有預設值,所以後面5參數是傳空的嗎?也可以這麼說,但應該說是傳預設值比較正確。 ~小弟淺見,參考看看~
Sender是傳入什麼?
Justmade
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-21 16:32:42 IP:218.16.xxx.xxx 未訂閱
procedure TFmG311.Edit1DblClick(Sender: TObject); begin EditPick('select * from AC_ACNTID_PICK', Sender, 'ACNTID', 'ACNTNM'); end; Sender 傳的就是原本傳入的也就是 Edit1 元件啦 (因你是雙擊 Edit1 元件進到這 procedure 的)。
系統時間:2024-06-02 19:24:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!