有關於Result的問題~ |
答題得分者是:小傑克
|
terrygobb
一般會員 發表:5 回覆:22 積分:5 註冊:2009-04-27 發送簡訊給我 |
因為小弟之前曾經學過c#~但對於delphi 的回傳方式有些地方不是很了解
以下列程式說明 [code delphi] function TSQL.GetAllTB: TstringList; var ds: TADODataSet; i: integer; begin result := TstringList.Create; //為什麼會在這result呢? result.Clear; ds := TADODataSet.Create(nil); openSchema(DS, 7); ds.First; while not ds.Eof do begin result.Add(ds.fieldByName('Table_Name').AsString); ds.Next; end; ds.Free; end; [/code] 因為在小弟認知的程式當中,大多都是在程式結尾才做Result的動作 但我搞不懂為什麼在程式開始的區段就用到Result了 況且還是Create,著實不太了解 有翻過書本了,但好像這方面的資料有點少 不曉得是否有經驗的前輩們幫忙一下,謝謝
------
尋找對的人,對的方法,對的態度跟對的環境 |
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
不同語言,行為定義有些不同很正常
對delphi 而言是會執行到function 結束, 或是中斷function exit(); 底下這從classes.pas 中隨便找的一個function, 這是回傳字串的 function TPersistent.GetNamePath: string; var S: string; begin Result := ClassName; //等於先給個default 值 if (GetOwner <> nil) then begin S := GetOwner.GetNamePath; if S <> '' then Result := S '.' Result; end; // 程式會執行到這邊, 這時Result 有可能已經變成 S '.' Result; end; 至於你問的 Create , 因為你回傳的 TStringList 是一個Class , 這個Class要使用method,property之前要先Create 類似這種東西一般應用程式書比較不會談到, 要看 Object Pascal 語法的書才會有, 不過一理通百理明,有用過C , delphi上手很快的
------
額有朝天骨,眼中有靈光 |
terrygobb
一般會員 發表:5 回覆:22 積分:5 註冊:2009-04-27 發送簡訊給我 |
恩恩 謝謝小傑克前輩的回答
等等我會try try看的 而我比較好奇的原因可能是我沒有表達清楚 因為物件的關係,在使用該class的時候,必須先Create 這到是沒啥問題 我好奇的是result 的 TStringList.Create會是個什麼樣的東西 是一個全新的TStringList 或者該程式執行結束時所回傳的TStringList 因為有想過要測試一下,但卻不曉得怎麼抓前後值,真糟糕 @@" 謝謝小傑克前輩,發表的文章沒表達清楚 不好意思~
------
尋找對的人,對的方法,對的態度跟對的環境 |
terrygobb
一般會員 發表:5 回覆:22 積分:5 註冊:2009-04-27 發送簡訊給我 |
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
function TSQL.GetAllTB: TstringList;
var ds: TADODataSet; i: integer; begin result := TstringList.Create; //為什麼會在這result呢? 請看下面紅字 result.Clear; ds := TADODataSet.Create(nil); openSchema(DS, 7); ds.First; while not ds.Eof do begin result.Add(ds.fieldByName('Table_Name').AsString); // 因為在這裡要用到, 所以在這之前要先定義 ds.Next; end; ds.Free; end; 您也可以改成到最後才用到 result, 如下, 但是有疊床架屋的感覺, function TSQL.GetAllTB: TstringList; var ds: TADODataSet; i: integer; mylist : tstringlist; begin mylist := TstringList.Create; mylist.Clear; ds := TADODataSet.Create(nil); openSchema(DS, 7); ds.First; while not ds.Eof do begin mylist.Add(ds.fieldByName('Table_Name').AsString); ds.Next; end; ds.Free; result := tstringlist.create; // 不做 create 不行, 因為要佔有記憶体空間 result.text := mylist.text; mylist.free; end;
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
terrygobb
一般會員 發表:5 回覆:22 積分:5 註冊:2009-04-27 發送簡訊給我 |
|
roviury
一般會員 發表:3 回覆:49 積分:15 註冊:2008-08-28 發送簡訊給我 |
要理解result不困難
你把他當作一個變數就可以 而最後就會return result ===================引 用 terrygobb 文 章=================== 因為小弟之前曾經學過c#~但對於delphi 的回傳方式有些地方不是很了解 以下列程式說明 [code delphi] function TSQL.GetAllTB: TstringList; var ds: TADODataSet; i: integer; begin result := TstringList.Create; //為什麼會在這result呢? result.Clear; ds := TADODataSet.Create(nil); openSchema(DS, 7); ds.First; while not ds.Eof do begin result.Add(ds.fieldByName('Table_Name').AsString); ds.Next; end; ds.Free; end; [/code] 因為在小弟認知的程式當中,大多都是在程式結尾才做Result的動作 但我搞不懂為什麼在程式開始的區段就用到Result了 況且還是Create,著實不太了解 有翻過書本了,但好像這方面的資料有點少 不曉得是否有經驗的前輩們幫忙一下,謝謝 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |