私はデータベースを探索するための検索コードを書いています。クエリは単独で動作するので、私はスレッドを使用しました。デルファイのスレッドエラー
このスレッド(このウェブサイトのユーザーの1人が書かれています)は、多くのエラーを示しています。
コード:
procedure TForm1.QueryFinished(Sender: TObject);
begin
if TThread(Sender).FatalException <> nil then
begin
// something went wrong
on E : Exception do
begin
MLog.Lines.Add('Exception class name = '+E.ClassName); /// MLog is Memo For Log
MLog.Lines.Add('Exception message = '+E.Message);
end;
exit;
end;
MLog.Lines.Add('Search is Done!');
end;
procedure TForm1.Requery;
var
Thread: TThread;
begin
Thread := TThread.CreateAnonymousThread(
procedure
begin
query.close;
query.sql.text:='select * from Customer where CustomerID LIKE "%'+Form1.edit1.text+'%"';
query.open;
end);
Thread.OnTerminate := QueryFinished;
Thread.Start;
end;
エラー1:
プロジェクトproject1に:
プロジェクトProject1.exeのは
エロ2 'テキストが見つかりませんでした' というメッセージと例外クラスEEvaluatorErrorを上げました.exeは、メッセージ 'EvalError LinkControlToField6で例外クラスEEvaluatorErrorを発生しました:テキストが見つかりません'
EvalError」というメッセージとプロジェクトのProject1.exe発生した例外クラスEBindCompError中:
エラー3:
エラー4
プロジェクトのProject1.exe発生した例外クラスEArgumentOutOfRangeExceptionメッセージで '範囲外の引数' LinkControlToField2:モジュールのアドレス5005FC08でアクセス違反 'rtl230.bpl' アドレスの読む000000D0'
エラー5:
モジュール 'FireDACCommon230.bpl'のアドレス006CE2BFのアクセス違反00000004
この問題を解決するにはどうすればよいですか?
多分私はスレッドを終了する必要があります。 スレッドがTerminate権を持っていることをどのように知ることができますか?
を私たちは何も 'query'を知っています。 [Mcve]。 –
スレッドのコンテキストで接続とクエリを作成する必要があるため、これは機能しません。そして、クラス自体にすでに入っているときにフォーム変数を使用しないでください。 – whosrdaddy
スレッドについては忘れてしまいます。非同期データベース操作(内部的にスレッドを使用します)が必要です。 [Documentation](http://docwiki.embarcadero.com/CodeExamples/en/FireDAC.TFDQuery.Async_Sample)を参照してください。 – whosrdaddy