function result觀念 |
答題得分者是:ccchen
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
function TBaseForm.ShowF1(i_sqlstr,i_db,i_key:string):TDataSource; var qry :TQuery; Ds :TDataSource; begin qry:=TQuery.Create(nil ); if qry<>nil then begin qry.SQL.Clear ; qry.SQL.Add(i_sqlstr '''' i_key ''''); qry.SQL.Text; qry.DatabaseName :=i_db ; qry.Open ; Ds :=TDatasource.Create(nil ); if Ds<>Nil then begin Ds.DataSet:=qry; Result:=Ds; end else Result:=Nil; end else Result:=Nil; qry.Free ; Ds.Free ; end;請問function 把值result回去,是否代表call此function的事件已經接收到傳回值,然後在執行result後的程式碼呢??? 不過實作結果好像要等function全部執行完才會把值傳回,那result的先後次序就不是該考慮的,不知是否對??? |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
請問function 把值result回去,是否代表call此function的事件已經接收到傳回值,然後在執行result後的程式碼呢???
No. 不過實作結果好像要等function全部執行完才會把值傳回,那result的先後次序就不是該考慮的,不知是否對???
Yes, the final result is the effective answer. e.g.
function FuncA: integer; begin Result := 1; Result := 2; end; B := FuncA; { B = 2 } |
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi cyl 您好, 做個小實驗就知道囉:
function TForm1.MyFun(InNum: Integer): Integer; begin ShowMessage(IntToStr(a)); // a-->0 Inc(InNum); Result := InNum; ShowMessage(IntToStr(a)); // a-->0 end; procedure TForm1.Button1Click(Sender: TObject); begin a := 0; a := MyFun(0); ShowMessage(IntToStr(a)); // a-->1 end;我不是高手, 高手是正在銀幕前微笑的人.
------
我不是高手, 高手是正在銀幕前微笑的人. |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
不管如何這個程式一定不對
function TBaseForm.ShowF1(i_sqlstr,i_db,i_key:string):TDataSource; var qry :TQuery; Ds :TDataSource; //宣告一個object reference, 本身占4bytes begin qry:=TQuery.Create(nil ); if qry<>nil then begin qry.SQL.Clear ; qry.SQL.Add(i_sqlstr '''' i_key ''''); qry.SQL.Text; qry.DatabaseName :=i_db ; qry.Open ; Ds :=TDatasource.Create(nil ); //配置一塊記憶體, 並將ds指向此記憶體 //i.e. 在ds的4bytes內填入所配置記憶體之位址 if Ds<>Nil then //若此記憶體配置成功 begin Ds.DataSet:=qry; Result:=Ds; //傳回此塊記憶體之reference end else Result:=Nil; end else Result:=Nil; qry.Free ; Ds.Free ; //將前面配置之記憶體free掉(但並未改ds之內容) //(i.e) ds仍指向原配置之記憶體,但已告訴系統此塊記憶體已無用可另作他用 end;如上之說明, 可見你傳回了一個已經宣告不用的DataSource, 當然不對 發表人 - ccchen 於 2003/01/13 22:21:48 |
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
引言: 不管如何這個程式一定不對Dear ccchen : 我了解了,但是還有一些基本觀念請教, Ds :=TDatasource.Create(nil ); //配置一塊記憶體, 並將ds指向此記憶體 這不是代表我建立一個TDatasource的物件,所以我此元件給free掉,不就代表把ds釋放掉,還會存在嗎??? Ds.Free ; //將前面配置之記憶體free掉(但並未改ds之內容) 那 ds為什麼仍指向原配置之記憶體??function TBaseForm.ShowF1(i_sqlstr,i_db,i_key:string):TDataSource; var qry :TQuery; Ds :TDataSource; //宣告一個object reference, 本身占4bytes begin qry:=TQuery.Create(nil ); if qry<>nil then begin qry.SQL.Clear ; qry.SQL.Add(i_sqlstr '''' i_key ''''); qry.SQL.Text; qry.DatabaseName :=i_db ; qry.Open ; Ds :=TDatasource.Create(nil ); //配置一塊記憶體, 並將ds指向此記憶體 //i.e. 在ds的4bytes內填入所配置記憶體之位址 if Ds<>Nil then //若此記憶體配置成功 begin Ds.DataSet:=qry; Result:=Ds; //傳回此塊記憶體之reference end else Result:=Nil; end else Result:=Nil; qry.Free ; Ds.Free ; //將前面配置之記憶體free掉(但並未改ds之內容) //(i.e) ds仍指向原配置之記憶體,但已告訴系統此塊記憶體已無用可另作他用 end;如上之說明, 可見你傳回了一個已經宣告不用的DataSource, 當然不對 發表人 - ccchen 於 2003/01/13 22:21:48 |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
引言: Ds :=TDatasource.Create(nil ); //配置一塊記憶體, 並將ds指向此記憶體 這不是代表我建立一個TDatasource的物件,所以我此元件給free掉,不就代表把ds釋放掉,還會存在嗎??? Ds.Free ; //將前面配置之記憶體free掉(但並未改ds之內容) 那 ds為什麼仍指向原配置之記憶體??Ds is a pointer pointing to the memory occupied by the TDatasource created. Freeing the datasource will NOT alter the value stored in Ds. Maybe you could use the FreeAndNil procedure in SysUtils.pas to free and set the pointer to nil. |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
Ds :TDataSource; //宣告一個object reference, 本身占4bytes
實際上ds只是一個integer, 與pointer可任意轉型, 未指向任何物件時其值為0 Ds :=TDatasource.Create(nil ); //配置一塊記憶體, 並將ds指向此記憶體
你必須將這行看成兩件事, 先是配置一塊記憶體, 假設此記憶體位址在0800(純假設), 將此位址填入ds, 即ds為一integer, 此時之值為0800 Ds.Free ; //告訴系統0800所在之記憶體已無用, 可另作他用, ds還是0800, 只是0800所在之記憶體內容是什麼, 已不一定了 所以通常ds.free之後, 必須加上ds:=nil; 使其內容成為0, 以免指向不可靠之記憶體
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |