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

續Tquery create問題

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-13 14:16:44 IP:61.218.xxx.xxx 未訂閱
續http://delphi.ktop.com.tw/topic.php?TOPIC_ID=24869 對不起我把它給結案了,但是還是出現Tquery無法create問題,我也不知道為什麼 因為我昨天在家試真的可以,今天又不行,到底哪裡出問題,可請教一下. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,db,dbtables; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } function ShowF1(i_sqlstr,i_db,i_key:string):TDataSource; end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} function TForm1.ShowF1(i_sqlstr,i_db,i_key:string):TDataSource; var qry :TQuery; Ds :TDataSource; begin try if qry=nil then qry:=TQuery.Create(self ); --->根本就create qry ,以下就出錯了 qry.SQL.Clear ; qry.SQL.Add(i_sqlstr '''' i_key '%' ''''); qry.DatabaseName :=i_db ; qry.Open ; if Assigned(Ds)=FALSE then Ds :=TDatasource.Create(nil ); Ds.DataSet:=qry; Result:=Ds; finally qry.Free ; Ds.Free ; end; end; procedure TForm1.Button1Click(Sender: TObject); var i_str :string; form :TForm2; begin inherited; i_str:='select key1 代碼 ,key2 中文 from ac where key1 like '; form := TForm2.Create(Self); form.DBGrid1.DataSource :=ShowF1(i_str,'wdata','key1'); end; end. 發表人 - cyl 於 2003/01/13 14:29:28
cyl
中階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-13 14:34:16 IP:61.218.xxx.xxx 未訂閱
好像是因為 finally qry.Free ; Ds.Free ; 這段程式碼在作怪,我他給mark掉,tquery就會create,可是為什麼呢??? 如果mark掉 ds和qry要在哪free???
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-13 14:37:49 IP:61.218.xxx.xxx 未訂閱
function TForm1.ShowF1(i_sqlstr,i_db,i_key:string):TDataSource;
var qry :TQuery;
Ds :TDataSource;
begin    qry:=TQuery.Create(self );     if qry <> nil then
begin
  qry.SQL.Clear ;
  qry.SQL.Add(i_sqlstr + ''''+i_key+'%'+'''');
  qry.DatabaseName :=i_db ;
  qry.Open ;      Ds :=TDatasource.Create(nil );
  if Assigned(Ds) then
  begin
     Ds.DataSet:=qry;
     Result:=Ds;
  end
  else result:=nil;    else result:=nil;    end;
發表人 - cmf 於 2003/01/13 14:39:16
------
︿︿
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-13 14:41:11 IP:61.218.xxx.xxx 未訂閱
引言: 好像是因為 finally qry.Free ; Ds.Free ; 這段程式碼在作怪,我他給mark掉,tquery就會create,可是為什麼呢??? 如果mark掉 ds和qry要在哪free???
procedure TForm1.Button1Click(Sender: TObject); var i_str :string; form :TForm2; begin inherited; form.DBGrid1.DataSource:=nil; i_str:='select key1 代碼 ,key2 中文 from ac where key1 like '; form := TForm2.Create(Self); form.DBGrid1.DataSource :=ShowF1(i_str,'wdata','key1'); end;
------
︿︿
cyl
中階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-01-13 14:43:57 IP:61.218.xxx.xxx 未訂閱
請問我的原始碼邏輯錯在哪??可以解釋給我知道,以後不再犯這個錯
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-01-13 14:47:37 IP:61.218.xxx.xxx 未訂閱
引言: 請問我的原始碼邏輯錯在哪??可以解釋給我知道,以後不再犯這個錯
1. NIL 是空的意思 2. finally 是無論有沒有發生錯誤都會去執行
------
︿︿
cyl
中階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-01-13 14:47:57 IP:61.218.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject); var i_str :string; form :TForm2; begin inherited;    form.DBGrid1.DataSource:=nil; i_str:='select key1 代碼 ,key2 中文 from ac where key1 like '; form := TForm2.Create(Self); form.DBGrid1.DataSource :=ShowF1(i_str,'wdata','key1'); end; 1.還沒create form就指定值不會有錯嗎?? 2.Ds和ary要在哪個時機free 發表人 - cyl 於 2003/01/13 14:51:01
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-01-13 14:51:55 IP:61.218.xxx.xxx 未訂閱
引言: 還沒create form就指定值不會有錯嗎??
還沒create form 哪來的 Button1Click
------
︿︿
cyl
中階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-01-13 14:54:40 IP:61.218.xxx.xxx 未訂閱
引言:
引言: 請問我的原始碼邏輯錯在哪??可以解釋給我知道,以後不再犯這個錯
1. NIL 是空的意思 2. finally 是無論有沒有發生錯誤都會去執行
1.對啊那不就是最後把ds和qry釋放掉就好了 2.如果是Nil就去create不是就不create,那也沒錯 前一篇你也是這樣回答我用Nil,只不過我把finally mark解開 所以我還是不明白為什麼錯< >< >
cyl
中階會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-01-13 14:56:47 IP:61.218.xxx.xxx 未訂閱
引言:
引言: 還沒create form就指定值不會有錯嗎??
還沒create form 哪來的 Button1Click
是我太笨嗎??我的button明明去create另外一個form並不是本身這個form啊
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-01-13 15:03:35 IP:61.218.xxx.xxx 未訂閱
function TForm1.ShowF1(i_sqlstr,i_db,i_key:string;ds TDataSource); begin ds.DataSet:=TQuery.Create(self ); ds.DataSet.SQL.Clear ; ds.DataSet.SQL.Add(i_sqlstr '''' i_key '%' ''''); ds.DataSet.DatabaseName :=i_db ; ds.DataSet.Open ; end; procedure TForm1.Button1Click(Sender: TObject); var i_str :string; form :TForm2; begin inherited; i_str:='select key1 代碼 ,key2 中文 from ac where key1 like '; form := TForm2.Create(Self); form.DBGrid1.DataSource:=TDatasource.Create(nil ); ShowF1(i_str,'wdata','key1',form.DBGrid1.DataSource); end;
------
︿︿
cyl
中階會員


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-01-13 15:11:08 IP:61.218.xxx.xxx 未訂閱
1.如果單存只想讓程式run這樣是沒問題,但是我還是想知道為什麼原來的code到底是哪出問題?? 2.依照Cmf的做法應該是把DS,qry宣告成private or public吧,然後在form2 close把ds ,qry 給free掉,但是其實我最終的目的是把它寫在dll裡,這樣的做法在dll裡要如何free ds ,qry ???
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-01-13 15:21:12 IP:61.218.xxx.xxx 未訂閱
//如何free ds ,qry ?    你無需去 Free ds,qry 因為你已經 將 ds 指派到 form.DBGrid1.DataSource  當程示關畢時 自然會 釋放        
------
︿︿
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-01-13 15:48:43 IP:211.20.xxx.xxx 未訂閱
引言: 1.如果單存只想讓程式run這樣是沒問題,但是我還是想知道為什麼原來的code到底是哪出問題?? 你有CREATE可是在FINALLY又給FREE了當然會錯 2.依照Cmf的做法應該是把DS,qry宣告成private or public吧,然後在form2 close把ds ,qry 給free掉,但是其實我最終的目的是把它寫在dll裡,這樣的做法在dll裡要如何free ds ,qry ??? 可以宣告在form1的private or public在form1的close時free掉
@@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
cyl
中階會員


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-01-13 16:04:46 IP:61.218.xxx.xxx 未訂閱
引言:
引言: 1.如果單存只想讓程式run這樣是沒問題,但是我還是想知道為什麼原來的code到底是哪出問題?? 你有CREATE可是在FINALLY又給FREE了當然會錯 2.依照Cmf的做法應該是把DS,qry宣告成private or public吧,然後在form2 close把ds ,qry 給free掉,但是其實我最終的目的是把它寫在dll裡,這樣的做法在dll裡要如何free ds ,qry ??? 可以宣告在form1的private or public在form1的close時free掉
@@~~飛翔在天際的精靈~~@@
版主我不懂ㄟ,create 後不是在finally都要free掉,我都已經用完ds,qry在為什麼finally不能free ex try form:=tform1.create(self); finally form.free; 所以我就照用阿... 是不是觀念錯誤了,可以說明白一點嗎??
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-01-13 17:13:18 IP:61.220.xxx.xxx 未訂閱
function TForm1.ShowF1(i_sqlstr,i_db,i_key:string):TDataSource;
var qry :TQuery;
Ds :TDataSource;
begin
try
  if qry=nil then <---把這行拿掉
  qry:=TQuery.Create(self nil ); <---self 改成 nil
  qry.SQL.Clear ;
  qry.SQL.Add(i_sqlstr   '''' i_key '%' '''');
  qry.DatabaseName :=i_db ;
  qry.Open ;
  if Assigned(Ds)=FALSE then
     Ds :=TDatasource.Create(nil );
  Ds.DataSet:=qry;
  Result:=Ds;
finally
  qry.Free ;
  Ds.Free ;
end;
end;
就改紅色部分那兩行 其他程式不變 試試看應該可以 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2003/01/13 17:16:32
------
天行健
君子當自強不息~~@.@
系統時間:2024-05-13 1:20:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!