續Tquery create問題 |
答題得分者是:cmf
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
續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 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
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 發送簡訊給我 |
引言: 好像是因為 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 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
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 發送簡訊給我 |
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
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 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
andersonhsieh
版主 發表:33 回覆:531 積分:439 註冊:2002-06-10 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言:版主我不懂ㄟ,create 後不是在finally都要free掉,我都已經用完ds,qry在為什麼finally不能free ex try form:=tform1.create(self); finally form.free; 所以我就照用阿... 是不是觀念錯誤了,可以說明白一點嗎??引言: 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掉@@~~飛翔在天際的精靈~~@@ |
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
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(就改紅色部分那兩行 其他程式不變 試試看應該可以 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2003/01/13 17:16:32
------
天行健 君子當自強不息~~@.@ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |