Hier meine aktuelle, lauffähige Version des Threads, falls jemand etwas ähnliches braucht:
Delphi-Quellcode:
interface
type
TQThread =
class(TThread)
private
FQuery: TADOQuery;
FDataSource: TDataSource;
FRightsPk: Integer;
FRecordCount: Integer;
FIsRunning: Boolean;
FQueryName:
string;
protected
procedure Execute;
override;
public
constructor Create(DataSource: TDataSource);
destructor Destroy;
override;
property RightsPk: Integer
read FRightsPk
write FRightsPk;
property RecordCount: Integer
read FRecordCount
write FRecordCount;
property IsRunning: Boolean
read FIsRunning
write FIsRunning;
property QueryName:
string read FQueryName
write FQueryName;
end;
implementation
constructor TQThread.Create(DataSource: TDataSource);
begin
inherited Create(True);
FDataSource := DataSource;
FreeOnTerminate := True;
end;
destructor TQThread.Destroy;
begin
inherited;
end;
procedure TQThread.Execute;
begin
inherited;
CoInitialize(
nil);
try
try
FQuery := TADOQuery(FDataSource.DataSet);
RightsPk := FDataSource.Tag;
IsRunning := True;
RecordCount := 0;
QueryName := FQuery.
Name;
FQuery.Close;
FQuery.Open;
RecordCount := FQuery.RecordCount;
IsRunning := False;
except
on Ex:
Exception do
begin
dxMessageDlg('
Fehler beim Ausführen des Query-Thead! (' + FQuery.
Name + '
, ' + Self.QualifiedClassName + '
)' + #13#10#13#10 + '
Fehlermeldung: ' + Ex.
Message + #13#10 + Ex.StackTrace + #13#10 + '
SQL: ' + FQuery.SQL.Text, mtError, [mbOK], 0);
end;
end;
finally
CoUninitialize();
end;
end;
Um die Ergebnisse abzufragen, nutze ich das Event OnTerminate:
Delphi-Quellcode:
procedure TForm1.TerminateThread(Sender: TObject);
var
RightsPk: Integer;
RecordCount: Integer;
begin
RightsPk := TQThread(Sender).RightsPk;
RecordCount := TQThread(Sender).RecordCount;
// Verarbeitung der Variablen
end
Ich sehe gerade, IsRunning ist hier sogar völlig überflüssig...
PS: Kann ich den ersten Beitrag nicht bearbeiten, um den Thread als "gelöst" zu markieren?