我写了个简单的线程,主要是在数据库的检索某条数据,以为可能很多人同时操作,所以我在COM对象里面用线程,我的COM其实是个COM组件之类的,ASP中可以调用,这一点很好,每问题,但是我先改造成检索某条数据的时候用线程,但数据无法回送给我,代码如下(只简单列出线程部分)type //线程检索作用
TQueryThread=class(TThread)
private
fs:widestring;
fa:widestring;
fb:widestring;
fc:widestring;
protected
procedure Execute;override;
public
constructor Create(Suspended:Boolean;s:widestring;const stra, strb,
strc: WideString);
end;下面
implementation
{$R *.DFM}
constructor TQueryThread.Create(Suspended:Boolean;s:widestring;const stra, strb,
strc: WideString);
begin
inherited Create(Suspended);
fs:=s;
fhpzl:=strhpzl;
fhphm:=strhphm;
fclsbdh:=strclsbdh;
FreeOnTerminate:=True;
end;procedure TQueryThread.Execute;
var adoconnection:tadoconnection;adoquery:tadoquery;
begin
//fs无法返回数据
if Terminated then exit;
//CoInitialize(nil);
ADOConnection:=tADOConnection.Create(nil);
adoconnection.LoginPrompt:=false;
ADOConnection.Close;
ADOConnection.ConnectionString:='Provider=MSDAORA.1;Password=1;User ID=temp;Data Source=orcl';
//连接ORACLE
adoquery:=TADOQuery.Create(nil);
adoquery.Connection:=adoconnection;
adoquery.SQL.Text:='select a,b,c from Vehicle where (a='''+fa+''' and b='''+fb+''') or c ='''+fc+'''';
try
adoquery.Open;
fs:=Trim(adoquery.FieldByName('a').AsString)+','+
Trim(adoquery.FieldByName('b').AsString)+','+
Trim(adoquery.FieldByName('c').AsString);
//我需要返回FS的值是多少
except on e:exception do
begin
fs:='-2,错误信息:'+e.Message;
adoquery.Close;
adoquery.Free;
exit;
end
end;
if adoquery.IsEmpty then fs:='-3';
adoquery.Close;
adoquery.Free;
adoconnection.close;
adoconnection.free;
end;如果线程写在普通的FORM中,并且s换成MEMO,后面线程CREATE的时候具体给出FORM上的MEMO(如MEMO),则正常,现在的问题是我在后面另外一个自定义的函数里面调用线程的时候
var s:widestring;
TQueryThread.Create(false,s,strHpzl,strHphm,strClsbdh);
//调用后,S没有值,但实际查询的结果是有值的
//感觉S没传回数值过来,为什么?哪位高知解决的办法,因为是在MOUDLE里面用,你可别告诉我拖一个MEMO控件进去,那是不可能的(数据模块里面怎么能拖MEMO!!!,呵呵,不可能)
result:='开始'+s+'结束';
TQueryThread=class(TThread)
private
fs:widestring;
fa:widestring;
fb:widestring;
fc:widestring;
protected
procedure Execute;override;
public
constructor Create(Suspended:Boolean;s:widestring;const stra, strb,
strc: WideString);
end;下面
implementation
{$R *.DFM}
constructor TQueryThread.Create(Suspended:Boolean;s:widestring;const stra, strb,
strc: WideString);
begin
inherited Create(Suspended);
fs:=s;
fhpzl:=strhpzl;
fhphm:=strhphm;
fclsbdh:=strclsbdh;
FreeOnTerminate:=True;
end;procedure TQueryThread.Execute;
var adoconnection:tadoconnection;adoquery:tadoquery;
begin
//fs无法返回数据
if Terminated then exit;
//CoInitialize(nil);
ADOConnection:=tADOConnection.Create(nil);
adoconnection.LoginPrompt:=false;
ADOConnection.Close;
ADOConnection.ConnectionString:='Provider=MSDAORA.1;Password=1;User ID=temp;Data Source=orcl';
//连接ORACLE
adoquery:=TADOQuery.Create(nil);
adoquery.Connection:=adoconnection;
adoquery.SQL.Text:='select a,b,c from Vehicle where (a='''+fa+''' and b='''+fb+''') or c ='''+fc+'''';
try
adoquery.Open;
fs:=Trim(adoquery.FieldByName('a').AsString)+','+
Trim(adoquery.FieldByName('b').AsString)+','+
Trim(adoquery.FieldByName('c').AsString);
//我需要返回FS的值是多少
except on e:exception do
begin
fs:='-2,错误信息:'+e.Message;
adoquery.Close;
adoquery.Free;
exit;
end
end;
if adoquery.IsEmpty then fs:='-3';
adoquery.Close;
adoquery.Free;
adoconnection.close;
adoconnection.free;
end;如果线程写在普通的FORM中,并且s换成MEMO,后面线程CREATE的时候具体给出FORM上的MEMO(如MEMO),则正常,现在的问题是我在后面另外一个自定义的函数里面调用线程的时候
var s:widestring;
TQueryThread.Create(false,s,strHpzl,strHphm,strClsbdh);
//调用后,S没有值,但实际查询的结果是有值的
//感觉S没传回数值过来,为什么?哪位高知解决的办法,因为是在MOUDLE里面用,你可别告诉我拖一个MEMO控件进去,那是不可能的(数据模块里面怎么能拖MEMO!!!,呵呵,不可能)
result:='开始'+s+'结束';
解决方案 »
- 数据转发怎么写?
- ◆◆◆ Delphi循环体代码优化的小总结 ◆◆◆
- 如何禁止让光标进入EhLibGrid(或DBGRID)的单元格
- *****搜索服务器时总是出现"Undeclared identifier: 'CreateOleObject'的错误.在线等待,得到正确答案马上给分
- 各位CSDN的朋友,救命啊!(高分相送,不够可以再加)
- 求snmpapi.dll中的函数声明。
- Delphi 5.X ADO_MTS_COM+高级程序设计篇书籍下载
- 在delphi中怎么得到dll文件中一个函数的输出参数值。
- 毕业设计完成了!!!这段时间里,多谢各位给予的帮助!!!谢谢!我把所有的分送给大家!(只有这么多了)
- 有关treeview中重命名的问题
- dll中TTreeView、TTreeNode的创建及使用
- 多个窗体想共用一个ADO连接
var s:pchar;
TQueryThread.Create(false,s,strHpzl,strHphm,strClsbdh);
result:='开始'+s+'结束';
结果S还是没有数值啊
thread.waitfor(); result:='开始'+thread.fs+'结束';