线程的简单问题8:如果是这个例子中,怎么为不同的线程的ADOQuery的SQLTEXT属性赋值 ( 积分: 15 )

  • 主题发起人 主题发起人 ppqingyu
  • 开始时间 开始时间
P

ppqingyu

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我从离线资料上找到的一个例子,是两个线程的.里面介绍到在线程中查询.但我不明白,每一个查询的SQL语句都是根据不同的条件动态写成的.那SQLTEXT属性该在哪里赋值?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, Grids, DBGrids, StdCtrls;
type
TForm1 = class(TForm)
Session1: TSession;
{ 属性SessionName填写为S1 }
Database1: TDatabase;
{ 属性SessionName选择为S1 }
Query1: TQuery;{ 属性Database选择为Database1;属性SessionName选择为S1 }
DataSource1: TDataSource;
{ 属性DataSet设置为空 }
DBGrid1: TDBGrid;
{ 属性DataSource选择为DataSource1 }
Session2: TSession;
{ 属性SessionName填写为S2 }
Database2: TDatabase;
{ 属性SessionName选择为S2 }
Query2: TQuery;{ 属性Database选择为Database2;属性SessionName选择为S2 }
DataSource2: TDataSource;
{ 属性DataSet设置为空 }
DBGrid2: TDBGrid;
{ 属性DataSource选择为DataSource2 }
BtnGoPause: TButton;
{ 用于执行和挂起线程 }
procedure FormCreate(Sender: TObject);
{ 创建窗体时创建线程对象 }
procedure FormDestroy(Sender: TObject);
{ 销毁窗体时销毁线程对象 }
procedure BtnGoPauseClick(Sender: TObject);
{ 执行线程和挂起线程 }
private
public
end;

TThreadQuery = class(TThread) { 声明线程类 }
private
FQuery: TQuery;
{ 线程中的查询组件 }
FDataSource: TDataSource;
{ 与查询组件相关的数据感知组件 }
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
procedure Execute;
override;{ 执行线程的方法 }
public
constructor Create(Query: TQuery;
DataSource: TDataSource);
virtual;
{ 线程构造器 }
end;

var
Form1: TForm1;
Q1, { 线程查询对象1 }
Q2: TThreadQuery;
{ 线程查询对象2 }
implementation
{$R *.DFM}
{ TThreadQuery类的实现 }
{ 连接数据查询组件和数据感知组件}
procedure TThreadQuery.ConnectDataSource;
begin
FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
end;

procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
try
FQuery.Open;
{ 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error');
{ 线程异常 }
end;
end;

{ 线程查询类的构造器 }
constructor TThreadQuery.Create(Query: TQuery;
DataSource: TDataSource);
begin
FQuery := Query;
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end;

{ 创建窗体时创建线程查询对象 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(Query1, DataSource1);
Q2 := TThreadQuery.Create(Query2, DataSource2);
end;

{ 销毁窗体时销毁线程查询对象 }
procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate;
{ 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate;
{ 销毁之前终止线程执行 }
Q2.Destroy;
end;

{ 开始线程、继续执行线程、挂起线程 }
procedure TForm1.BtnGoPauseClick(Sender: TObject);
begin
if Q1.Suspended then
Q1.Resume else
Q1.Suspend;
if Q2.Suspended then
Q2.Resume else
Q2.Suspend;
end;

end.
 
这是我从离线资料上找到的一个例子,是两个线程的.里面介绍到在线程中查询.但我不明白,每一个查询的SQL语句都是根据不同的条件动态写成的.那SQLTEXT属性该在哪里赋值?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, Grids, DBGrids, StdCtrls;
type
TForm1 = class(TForm)
Session1: TSession;
{ 属性SessionName填写为S1 }
Database1: TDatabase;
{ 属性SessionName选择为S1 }
Query1: TQuery;{ 属性Database选择为Database1;属性SessionName选择为S1 }
DataSource1: TDataSource;
{ 属性DataSet设置为空 }
DBGrid1: TDBGrid;
{ 属性DataSource选择为DataSource1 }
Session2: TSession;
{ 属性SessionName填写为S2 }
Database2: TDatabase;
{ 属性SessionName选择为S2 }
Query2: TQuery;{ 属性Database选择为Database2;属性SessionName选择为S2 }
DataSource2: TDataSource;
{ 属性DataSet设置为空 }
DBGrid2: TDBGrid;
{ 属性DataSource选择为DataSource2 }
BtnGoPause: TButton;
{ 用于执行和挂起线程 }
procedure FormCreate(Sender: TObject);
{ 创建窗体时创建线程对象 }
procedure FormDestroy(Sender: TObject);
{ 销毁窗体时销毁线程对象 }
procedure BtnGoPauseClick(Sender: TObject);
{ 执行线程和挂起线程 }
private
public
end;

TThreadQuery = class(TThread) { 声明线程类 }
private
FQuery: TQuery;
{ 线程中的查询组件 }
FDataSource: TDataSource;
{ 与查询组件相关的数据感知组件 }
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
procedure Execute;
override;{ 执行线程的方法 }
public
constructor Create(Query: TQuery;
DataSource: TDataSource);
virtual;
{ 线程构造器 }
end;

var
Form1: TForm1;
Q1, { 线程查询对象1 }
Q2: TThreadQuery;
{ 线程查询对象2 }
implementation
{$R *.DFM}
{ TThreadQuery类的实现 }
{ 连接数据查询组件和数据感知组件}
procedure TThreadQuery.ConnectDataSource;
begin
FDataSource.DataSet := FQuery;{ 该方法在查询结束后才调用 }
end;

procedure TThreadQuery.Execute;{ 执行线程的方法 }
begin
try
FQuery.Open;
{ 打开查询 }
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error');
{ 线程异常 }
end;
end;

{ 线程查询类的构造器 }
constructor TThreadQuery.Create(Query: TQuery;
DataSource: TDataSource);
begin
FQuery := Query;
FDataSource := DataSource;
inherited Create(True);
FreeOnTerminate := False;
end;

{ 创建窗体时创建线程查询对象 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Q1 := TThreadQuery.Create(Query1, DataSource1);
Q2 := TThreadQuery.Create(Query2, DataSource2);
end;

{ 销毁窗体时销毁线程查询对象 }
procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate;
{ 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate;
{ 销毁之前终止线程执行 }
Q2.Destroy;
end;

{ 开始线程、继续执行线程、挂起线程 }
procedure TForm1.BtnGoPauseClick(Sender: TObject);
begin
if Q1.Suspended then
Q1.Resume else
Q1.Suspend;
if Q2.Suspended then
Q2.Resume else
Q2.Suspend;
end;

end.
 
不知道,也许直接写在控件里面了把[:D]
 
不可能写在控件里面,怎么动态改变查询条件呢?
 
接受答案了.
 
后退
顶部