2

アプリケーションが何かを行っていることを示すための最適なソリューションは何ですか?

進行状況インジケーターを表示しようとしましたが、うまくいきませんでした。

アップデート: - - - - - - -

プログレス バーは正常に機能しますが、私が望むものではありません。

Web ブラウザーが使用するようなthrobberを表示したいので、何かが更新されている限り回転し続けます。

カーソルは crHourGlass モードにすることもできます。

4

6 に答える 6

8

これを試して:

アニメートユニット

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 画像2 画像3 画像4 画像5 画像6 画像7 画像8

アニメート1

于 2011-04-29T16:34:30.400 に答える
6

時間のかかるタスクをメイン スレッドで実行している可能性があります。

1 つのオプションは、メッセージ キューを処理できるようにするバックグラウンド スレッドに移動することです。プログレスバー、そして実際にはUIが機能するためには、サービスを提供する必要があります。

于 2011-04-29T10:20:07.477 に答える
4

更新された質問への回答:

  • アニメーション GIF を生成します。
  • 環境に GIF ライブラリを追加する (JEDI JVCL+JCL)
  • TImage を挿入し、生成された gif をロードする
  • 必要に応じて表示する
于 2011-04-29T12:37:05.813 に答える
1

インジケータOKです。Application.ProcessMessages変更後、電話連絡が必要です。

于 2011-04-29T10:05:40.237 に答える
0

「そのアプリケーションが何かをしていることを示すための最良の解決策は何ですか?」- マウス カーソルを crHourGlass に設定しますか? または、アプリケーションが何かを「実行中」であり、ユーザーが待機する必要があることをユーザーに通知する別のフォーム/フレーム/などを作成します。

于 2011-04-29T11:01:05.250 に答える
0

時間のかかるタスクから、進行状況バーなどの視覚的なインジケーターを時々更新できます。Updateただし、フィードバックを提供するコントロールを呼び出して、変更をすぐに再描画する必要があります。

Application.ProcessMessages再入可能性の問題が発生する可能性があるため、使用しないでください。

于 2011-04-30T12:40:20.610 に答える