jsSessionThreadQry component:

The jsSessionThreadQry component runs threaded queries (automatically detecting whether to use the dataset's .Open or .ExecSQL method). Dbl click on the component at design time for instructions for its use.

Instructions for use:

Drop a TDatabase, TQuery, and TjsSessionThreadQry onto a form.
Set the following properties:

TDatabase.SessionName = TjsSessionThreadQry.SessionName,
TQuery.SessionName = TjsSessionThreadQry.SessionName,
TQuery.DatabaseName = TDatabase.DatabaseName.
At run time, set TjsSessionThreadQry.QueryEnabled := True to run the threaded query.
Important: Do NOT connect the query to a datasource.

Class Definitions:

type TjsSessionThreadQryAboutBoxComponentEditor = class(TComponentEditor)
private
 
{ Private declarations }
protected
 
{ Protected declarations }
public
 
function GetVerbCount : Integer; override;
  function GetVerb(Index : Integer) : String; override;
  procedure ExecuteVerb(Index : Integer); override;
published
 
{ Published declarations }
end;


type TQryThread = class(TThread)
private
  FQuery : TQuery;
protected
 
procedure Execute; override;
public
 
constructor Create(bCreateSuspended : Boolean; Query : TQuery);
end;

type TjsSessionThreadQry = class(TSession)
private
  FQueryActive : Boolean;
  FQueryEnabled : Boolean;
  FQuery : TQuery;
  FQryThread : TQryThread;
  FOnThreadDone : TNotifyEvent;
  function GetQuery : TQuery;
  procedure SetQuery(Value : TQuery);
protected
 
procedure Loaded; override;
  procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  procedure ThreadDone(Sender : TObject); virtual;
public
 
constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
  property QueryActive : Boolean read FQueryActive;
  procedure Execute;
published
 
property Query : TQuery read GetQuery write SetQuery;
  property OnThreadDone : TNotifyEvent read FOnThreadDone write FOnThreadDone;
end;