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

function result觀念

答題得分者是:ccchen
cyl
中階會員


發表:163
回覆:171
積分:66
註冊:2002-07-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-13 16:40:35 IP:61.218.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-13 16:47:47 IP:147.8.xxx.xxx 未訂閱
請問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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-13 17:01:58 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-13 22:19:42 IP:203.217.xxx.xxx 未訂閱
不管如何這個程式一定不對
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-01-14 09:05:04 IP:61.218.xxx.xxx 未訂閱
引言: 不管如何這個程式一定不對
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
Dear ccchen : 我了解了,但是還有一些基本觀念請教, Ds :=TDatasource.Create(nil ); //配置一塊記憶體, 並將ds指向此記憶體 這不是代表我建立一個TDatasource的物件,所以我此元件給free掉,不就代表把ds釋放掉,還會存在嗎??? Ds.Free ; //將前面配置之記憶體free掉(但並未改ds之內容) 那 ds為什麼仍指向原配置之記憶體??
william
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-01-14 09:23:48 IP:147.8.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-01-14 09:40:23 IP:163.29.xxx.xxx 未訂閱
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, 以免指向不可靠之記憶體
系統時間:2024-05-14 0:19:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!