アプリケーションが何かを行っていることを示すための最適なソリューションは何ですか?
進行状況インジケーターを表示しようとしましたが、うまくいきませんでした。
アップデート: - - - - - - -
プログレス バーは正常に機能しますが、私が望むものではありません。
Web ブラウザーが使用するようなthrobberを表示したいので、何かが更新されている限り回転し続けます。
カーソルは crHourGlass モードにすることもできます。
アプリケーションが何かを行っていることを示すための最適なソリューションは何ですか?
進行状況インジケーターを表示しようとしましたが、うまくいきませんでした。
アップデート: - - - - - - -
プログレス バーは正常に機能しますが、私が望むものではありません。
Web ブラウザーが使用するようなthrobberを表示したいので、何かが更新されている限り回転し続けます。
カーソルは crHourGlass モードにすることもできます。
これを試して:
アニメートユニット
unit AnimateUnit;
interface
uses
Windows, Classes;
type
TFrameProc = procedure(const theFrame: ShortInt) of object;
TFrameThread = class(TThread)
private
{ Private declarations }
FFrameProc: TFrameProc;
FFrameValue: ShortInt;
procedure SynchedFrame();
protected
{ Protected declarations }
procedure Frame(const theFrame: ShortInt); virtual;
public
{ Public declarations }
constructor Create(theFrameProc: TFrameProc; CreateSuspended: Boolean = False); reintroduce; virtual;
end;
TAnimateThread = class(TFrameThread)
private
{ Private declarations }
protected
{ Protected declarations }
procedure Execute(); override;
public
{ Public declarations }
end;
var
AnimateThread: TAnimateThread;
implementation
{ TFrameThread }
constructor TFrameThread.Create(theFrameProc: TFrameProc; CreateSuspended: Boolean = False);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := True;
FFrameProc := theFrameProc;
end;
procedure TFrameThread.SynchedFrame();
begin
if Assigned(FFrameProc) then FFrameProc(FFrameValue);
end;
procedure TFrameThread.Frame(const theFrame: ShortInt);
begin
FFrameValue := theFrame;
try
Sleep(0);
finally
Synchronize(SynchedFrame);
end;
end;
{ TAnimateThread }
procedure TAnimateThread.Execute();
var
I: ShortInt;
begin
while (not Self.Terminated) do
begin
Frame(0);
for I := 1 to 8 do
begin
if (not Self.Terminated) then
begin
Sleep(120);
Frame(I);
end;
end;
Frame(0);
end;
end;
end.
ユニット1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ImgList;
type
TForm1 = class(TForm)
ImageList1: TImageList;
Image1: TImage;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure UpdateFrame(const theFrame: ShortInt);
end;
var
Form1: TForm1;
implementation
uses
AnimateUnit;
{$R *.DFM}
procedure TForm1.UpdateFrame(const theFrame: ShortInt);
begin
Image1.Picture.Bitmap.Handle := 0;
try
ImageList1.GetBitmap(theFrame, Image1.Picture.Bitmap);
finally
Image1.Update();
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AnimateThread := TAnimateThread.Create(UpdateFrame);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
AnimateThread.Terminate();
end;
end.
画像
時間のかかるタスクをメイン スレッドで実行している可能性があります。
1 つのオプションは、メッセージ キューを処理できるようにするバックグラウンド スレッドに移動することです。プログレスバー、そして実際にはUIが機能するためには、サービスを提供する必要があります。
更新された質問への回答:
インジケータOKです。Application.ProcessMessages
変更後、電話連絡が必要です。
「そのアプリケーションが何かをしていることを示すための最良の解決策は何ですか?」- マウス カーソルを crHourGlass に設定しますか? または、アプリケーションが何かを「実行中」であり、ユーザーが待機する必要があることをユーザーに通知する別のフォーム/フレーム/などを作成します。
時間のかかるタスクから、進行状況バーなどの視覚的なインジケーターを時々更新できます。Update
ただし、フィードバックを提供するコントロールを呼び出して、変更をすぐに再描画する必要があります。
Application.ProcessMessages
再入可能性の問題が発生する可能性があるため、使用しないでください。