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

有關 FUNCTION 參數值定義的問題

答題得分者是:Coffee
P.D.
版主


發表:571
回覆:3888
積分:3677
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-06 15:45:17 IP:61.67.xxx.xxx 未訂閱
請問各位

以下的 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-06 15:54:19 IP:59.124.xxx.xxx 訂閱
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 重新編輯於 2009-08-06 15:55:37, 註解 無‧
Coffee 重新編輯於 2009-08-06 15:59:21, 註解 無‧
Coffee 重新編輯於 2009-08-06 16:00:14, 註解 無‧
carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-06 16:41:21 IP:203.79.xxx.xxx 訂閱
好樣的,用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-06 17:22:40 IP:59.124.xxx.xxx 訂閱

[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
回覆:5486
積分:4552
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-06 17:27:53 IP:118.169.xxx.xxx 訂閱
Yes, sir! :P

===================引 用
Coffee 文 章===================
就會實際的影響myObj的值。

另外,建議本篇移往Object Pascal區。

carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-08-06 17:47:11 IP:203.79.xxx.xxx 訂閱

如 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-06 18:26:05 IP:59.124.xxx.xxx 訂閱
如果就被操作的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.
版主


發表:571
回覆:3888
積分:3677
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-08-07 12:45:23 IP:61.67.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-08-07 14:40:23 IP:59.124.xxx.xxx 訂閱
其實不需要兩倍的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,是別種程式。

有沒有大大釐清一下..


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