おそらく、あなたにとっては非常に簡単なことですが、TADSISearch コンポーネントを使用してadsi を照会するプロジェクト (教育目的) に数日間懸命に取り組んでいます。TADSISearch が Active Directory を検索しているときに、Form2 で男性労働者のアニメーション GIF を含む「Working, Please wait..」スプラッシュ スクリーンを表示しようとしています。私はあらゆる可能性を試しましたが、うまくいきませんでした。スレッドで TADSISearch を使用しようとしましたが、ADSIsearch が終了する前にスレッドが終了します。TADSISearch はスレッドセーフではないと思います。どう思いますか?また、Form2 を作成し、それを更新するためにスレッドを使用した別の方法ですが、メイン フォームが adsi 検索を行っている間にアニメーション gif が停止しています。これらについて何が言えますか?ADSISearch の動作中に待機画面を表示し、メイン フォームの応答を維持するにはどうすればよいですか。応用。ProcessMessages またはタイマーも方法ではありません。読んで答えてくれてありがとう。
4 に答える
グラフィカル ユーザー インターフェイスは、メイン スレッドによって更新される必要があります。検索コードを別のスレッドに配置する必要があります。検索スレッドが動作している間、メイン スレッドは「お待ちください」メッセージとともにアニメーションを表示できます。
サーチャー スレッドは、利用可能な同期手法のいずれかによって検索が行われると、メイン スレッドに通知できます。最も簡単な方法は、ユーザー インターフェイスでアニメーションを停止するメソッドをスレッド クラスで定義し、そのメソッドをサーチャー スレッドの Execute メソッドの最後で Synchronize に渡すことです。
サーチャー スレッド コードは次のようになります。
type
TMyThread = class(TThread)
private
procedure NotifyEndOfThread;
protected
procedure Execute; override;
end;
implementation
uses MainFormUnit;
procedure TMyThread.NotifyEndOfThread;
begin
MainForm.ShowAnimation := False;
end;
procedure TMyThread.Execute;
begin
try
{Add your search code here}
finally
Synchronize(NotifyEndOfThread);
end;
end;
メインスレッドのコードは次のようになります。
TMainForm = class(TForm)
...
private
FShowAnimation : Boolean;
procedure SetShowAnimation(Value: Boolean);
public
property ShowAnimation : Boolean read FShowAnimation write SetShowAnimation;
end;
procedure TMainForm.SetShowAnimation(Value: Boolean);
begin
FShowAnimation := Value;
if FShowAnimation then
{Add animation code here}
else
{Stop animation}
end;
多分あなたはこれを試すことができます:
Delphi 用スレッド スプラッシュスクリーン
http://cc.embarcadero.com/Item/20139
私はこれをタッチスクリーン/端末アプリケーション (シンクライアント、Wifi、RemObjects など) で使用していますが、うまく動作します! アニメーションgifも機能しています。
検索が完了する前にスレッドを終了するにはどうすればよいですか? 検索がスレッドで実行され、スレッドのインスタンスが 1 つしかない場合は、機能するはずです。
あなたはただすることはできません
f := TMyWaitForm.Create(self);
try
f.Show();
...start the TADSISearch...
finally
FreeAndNil(f);
end;
TMyWaitForm (それ自体が表示されます) にアニメーション GIF を配置しますか?
Web 作成プログラムで Web サイトを作成するときにプログレス フォームがあり、これは魅力的です。
待機フォームにいくつかの状態情報を表示することを検討することもできます (TADSISearch コンポーネント/ソフトウェアに割り当て可能なコールバック関数またはイベントがある場合)。
プロセスにかかる時間を示す実行中の時計を表示するのもいい感じです。