有關 FUNCTION 參數值定義的問題 |
答題得分者是:Coffee
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位
以下的 FUNCTION function Create_SourceNo(AOwner: TComponent; DS: boolean; indextype: integer; var aDS: TDataSource; var aTable: TkbmMemTable): boolean; 其中, var aDS 的參數, 是可下或可不下, 例如 Create_SourceNo(Form1, True, DataSource1, Table1) 或 Create_SourceNo(Form2, False, ???, Table2) 但上例的第二種, 其中 ??? 的地方, 我要如何下才能通過編譯, 因為 Create_SoruceNo(Form2, False, nil, Table2) 或 Create_SoruceNo(Form2, False, , Table2) 編譯都會引發 not DataSource 的型態識別錯誤 或者在 function 的定義上, 要如何定義 aDS, 才能接受可有可否的參數傳入 謝謝! |
Coffee
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
function Create_SourceNo(AOwner: TComponent; DS: boolean; indextype: integer;
var aDS: TDataSource; var aTable: TADOTable): boolean;overload; function Create_SourceNo(AOwner: TComponent; DS: boolean; indextype: integer; var aTable: TADOTable): boolean;overload;
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
carstyc
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
好樣的,用 overload 來解決,果然是高招。
to P.D 大大 其實你只要拿掉 var 就可以用傳 nil 了。 如果我沒記錯的話,function 參數傳遞只要是 object 的話,都是call by reference ,所以不用特別加 var 。 還是我記錯了,不是DELPHI,是別種程式。 有沒有大大釐清一下.. ===================引 用 Coffee 文 章=================== function Create_SourceNo(AOwner: TComponent; DS: boolean; indextype: integer; var aDS: TDataSource; var aTable: TADOTable): boolean;overload; function Create_SourceNo(AOwner: TComponent; DS: boolean; indextype: integer; var aTable: TADOTable): boolean;overload; |
Coffee
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
[code delphi] type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private DS_A : TDataSource; DS_B : TDataSource; procedure PassByValue(obj : TDataSource); procedure PassByRef(var obj : TDataSource); { Private declarations } public { Public declarations } end; procedure TForm1.Button1Click(Sender: TObject); var myObj : TDataSource; begin DS_A:=TDataSource.Create(self); DS_B:=TDataSource.Create(self); myObj := DS_B; if(myObj=DS_B) then ; myObj := DS_A; PassByValue(myObj); if(myObj=DS_B) then ShowMessage('obj changed 1'); myObj := DS_A; PassByRef(myObj); if(myObj=DS_B) then ShowMessage('obj changed 2'); end; [/code] Obj Ref本身也是個變數,只是它存的是位址,所以var一樣會生效。 對於call by value來說,上例在進入函式本體時,將會產生一個新的ref,複製參數的值(位址),因此myObj的值仍是持有DS_A。 而call by ref則不會複製,將參考本身帶入函式,所以當函式內容改變了參考的值,就會實際的影響myObj的值。 另外,建議本篇移往Object Pascal區。 ===================引 用 carstyc 文 章=================== (恕刪) 如果我沒記錯的話,function 參數傳遞只要是 object 的話,都是call by reference ,所以不用特別加 var 。 還是我記錯了,不是DELPHI,是別種程式。 有沒有大大釐清一下.. ===================引 用 Coffee 文 章=================== function Create_SourceNo(AOwner: TComponent; DS: boolean; indextype: integer; var aDS: TDataSource; var aTable: TADOTable): boolean;overload; function Create_SourceNo(AOwner: TComponent; DS: boolean; indextype: integer; var aTable: TADOTable): boolean;overload;
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
taishyang
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
carstyc
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:16 回覆:254 積分:329 註冊:2003-07-18 發送簡訊給我 |
如 Coffee 大大所說,那是不是傳 object 的話, 不論是否有用 var ,都能達到同樣效果。 就是在 function 內對該 object 做的動作,在function 外的 object 都會直被影響到。 所以加不加 var 都無所謂...... 是這樣說的嗎? ===================引 用 Coffee 文 章=================== [code delphi] type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private DS_A : TDataSource; DS_B : TDataSource; procedure PassByValue(obj : TDataSource); procedure PassByRef(var obj : TDataSource); { Private declarations } public { Public declarations } end; procedure TForm1.Button1Click(Sender: TObject); var myObj : TDataSource; begin DS_A:=TDataSource.Create(self); DS_B:=TDataSource.Create(self); myObj := DS_B; if(myObj=DS_B) then ; myObj := DS_A; PassByValue(myObj); if(myObj=DS_B) then ShowMessage('obj changed 1'); myObj := DS_A; PassByRef(myObj); if(myObj=DS_B) then ShowMessage('obj changed 2'); end; [/code] Obj Ref本身也是個變數,只是它存的是位址,所以var一樣會生效。 對於call by value來說,上例在進入函式本體時,將會產生一個新的ref,複製參數的值(位址),因此myObj的值仍是持有DS_A。 而call by ref則不會複製,將參考本身帶入函式,所以當函式內容改變了參考的值,就會實際的影響myObj的值。 另外,建議本篇移往Object Pascal區。 ===================引 用 carstyc 文 章=================== (恕刪) 如果我沒記錯的話,function 參數傳遞只要是 object 的話,都是call by reference ,所以不用特別加 var 。 還是我記錯了,不是DELPHI,是別種程式。 有沒有大大釐清一下.. ===================引 用 Coffee 文 章=================== function Create_SourceNo(AOwner: TComponent; DS: boolean; indextype: integer; var aDS: TDataSource; var aTable: TADOTable): boolean;overload; function Create_SourceNo(AOwner: TComponent; DS: boolean; indextype: integer; var aTable: TADOTable): boolean;overload; |
Coffee
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
如果就被操作的obj instance來看是沒錯,所以var通常會意謂著該參數的值會被攜出使用,如Delphi預設的TryStrToInt:function TryStrToInt(const S: string; out Value: Integer): Boolean;。
它的參數Value就是被用來輸出,因為它需要兩個以上的傳出值,所以使用了這樣的方式。 ===================引 用 carstyc 文 章=================== 如 Coffee 大大所說,那是不是傳 object 的話, 不論是否有用 var ,都能達到同樣效果。 就是在 function 內對該 object 做的動作,在function 外的 object 都會直被影響到。 所以加不加 var 都無所謂...... 是這樣說的嗎?
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
1.感謝coffee 兄的提點, 使用 overload 是比較簡單易懂的方法, 不過我這類的function 有近二十餘支, 換成 overload 就會備增兩倍, 對程式的負荷著實不小,
2.提到的 passbyvalue, passbyref , 由於之前未接觸這類的觀念, 所以提出的做法一時之間還無法完全理解及吸收 3, carstyc 兄提到 TObject 的屬性是否可以不用下 var , 就具有 reference 功能, 可能我要測測看, 4.至於放錯版面的問題, 實在是本人的電腦反應過慢, 畫面的點選一時不查, 以為點到 Object Pascal, 實際上卻是點到下一個 VCL區 看來目前設計的方向應該是明確的, 所以暫時先結案了, 感謝兩位提供的資料 ===================引 用 carstyc 文 章=================== 好樣的,用 overload 來解決,果然是高招。 to P.D 大大 其實你只要拿掉 var 就可以用傳 nil 了。 如果我沒記錯的話,function 參數傳遞只要是 object 的話,都是call by reference ,所以不用特別加 var 。 還是我記錯了,不是DELPHI,是別種程式。 有沒有大大釐清一下..
編輯記錄
P.D. 重新編輯於 2009-08-07 12:48:59, 註解 無‧
|
Coffee
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
其實不需要兩倍的code...只要將原本的code縮進private/protected,然後再另外開兩個public的prototype供呼叫,這樣使用到的都會是同一份code
[code delphi] type TDataProvider=class private: procedure _AppendData(SKey : String; SName : String; SValue1 : integer; SValue2 : String); public: procedure AppendData(SKey :String; SName : String); procedure AppendData(SKey : String; SName : String; SValue2 : String); end; //implementation; procedure TDataProvider._AppendData(SKey : String; SName : String; SValue1 : integer; SValue2 : String); begin //優先處理會被省略的參數 //原先的函式本體 end; procedure TDataProvider.AppendData(SKey : String; SName : String); begin self._AppendData(SKey, SName, nil, -1, nil); end; procedure TDataProvider.AppendData(SKey : String; SName : String; SValue2 : String); begin self._AppendData(SKey, SName, nil, -1, SValue2); end; [/code] ===================引 用 P.D. 文 章=================== 1.感謝coffee 兄的提點, 使用 overload 是比較簡單易懂的方法, 不過我這類的function 有近二十餘支, 換成 overload 就會備增兩倍, 對程式的負荷著實不小, 2.提到的 passbyvalue, passbyref , 由於之前未接觸這類的觀念, 所以提出的做法一時之間還無法完全理解及吸收 3, carstyc 兄提到 TObject 的屬性是否可以不用下 var , 就具有 reference 功能, 可能我要測測看, 4.至於放錯版面的問題, 實在是本人的電腦反應過慢, 畫面的點選一時不查, 以為點到 Object Pascal, 實際上卻是點到下一個 VCL區 看來目前設計的方向應該是明確的, 所以暫時先結案了, 感謝兩位提供的資料 ===================引 用 carstyc 文 章=================== 好樣的,用 overload 來解決,果然是高招。 to P.D 大大 其實你只要拿掉 var 就可以用傳 nil 了。 如果我沒記錯的話,function 參數傳遞只要是 object 的話,都是call by reference ,所以不用特別加 var 。 還是我記錯了,不是DELPHI,是別種程式。 有沒有大大釐清一下..
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |