アニメーションについて


ぴょん吉  2022-10-26 00:02:30  No: 150619  IP: 192.*.*.*

おはようございます。
アニメーションについて教えてください。
以下のコードで実行したのですが
アニメーションが動いてくれません。
[処理内容]
①Excelファイルを選択
②アニメーション開始
③選択したExcelファイルのシート名をListViewにリストアップ
④アニメーション終了

何処がおかしいのでしょうか。
***********************************************
  if OpenDialog1.Execute then
    convF.Text := OpenDialog1.FileName;

  LMaxTime   := 10000;
  LStartTime := TimeGetTime;

  //アニメーション開始
  ActivityIndicator1.Animate := True;

  LTime := timeGetTime - LStartTime;
  if LTime > LMaxTime then
  begin
    //アニメーション終了
    ActivityIndicator1.Animate := False;
  end;

  Application.ProcessMessages;
  Sleep(1);

  //ListView1にExcelファイルのシート名をリストアップ(Start)
  System.Variants.DispatchUnsignedAsSigned := True;

  excelFile := convF.Text;
  try
    excel := CreateOleObject( 'Excel.Application' );
    excel.Application.WindowState := xlMinimized;
    excel.Application.Visible := True;
    book := Excel.WorkBooks.Open(FileName:=excelFile, ReadOnly:=True);
    try

      ListView1.Clear;

      for i := 1 to book.Worksheets.Count do
      begin
        ws := book.Worksheets[i];
        item1 := ListView1.Items.Add;
        item1.Caption := ws.Name;
      end;

      book.Close(SaveChanges:=False);
    finally
      excel.Quit;
    end;
  except
    on E: Exception do
      MessageDlg(E.Message, mtError, [mbOk], E.HelpContext);
  end;
  //ListView1にExcelファイルのシート名をリストアップ(End)

  ShowMessage('シート名のリストアップが完了しました。');
  ActivityIndicator1.Animate := False;  //アニメーション終了
***********************************************

環境:Windows10 Pro
Dephi 10.1 Berlin update 2 Enterprise

編集 削除
take  2022-10-26 00:36:25  No: 150621  IP: 192.*.*.*

なんかすごいのが来ましたね。

TActivityIndicator コンポーネントを使って
処理の進捗をアニメーション表示したいけどうまく動かない

ってことだとすると
ループ内で処理の進捗を表示していないから表示されないのでは?

下の方で

      for i := 1 to book.Worksheets.Count do

とあるのがループ部分でこの処理に時間がかかるから
その進捗を表示したいと思うのですが
そのループ内に進捗を表示する処理がないから表示されません。

サンプルをと思ったのですが
これ、とあるWEBサイトのサンプルをそのままコピペしただけですね
サンプルが何をしているのかを自分で理解しないと使うのは難しいのでは?

ステップ実行でもいいので自身で書いたプログラムがどういう動きをしているのか
一度試して見てはいかがでしょうか?

編集 削除
AAAAA  2022-10-26 08:41:56  No: 150630  IP: 192.*.*.*

LTime := timeGetTime - LStartTime;
  if LTime > LMaxTime then
  begin
    //アニメーション終了
    ActivityIndicator1.Animate := False;
  end;

  Application.ProcessMessages;
  Sleep(1);

これはなんですか?

編集 削除
AAAAA  2022-10-26 08:54:11  No: 150631  IP: 192.*.*.*

var
    I: Integer;
begin
     ActivityIndicator1.Animate := True;
     for I:=0 to 9999 do
     begin
       Memo1.Lines.Add('A');
       Application.ProcessMessages; 
     end;

 Application.ProcessMessages; 無しだと For を抜けてからアニメーションが始まる

アニメーション自体は TActivityIndicator 内部で TTimer でやってるだけだね

編集 削除
mam  URL  2022-11-01 22:57:50  No: 150665  IP: 192.*.*.*

TActivityIndicatorはメインスレッドで動作します。したがって、時間のかかる処理をメインスレッドで行うと、TActivityIndicatorがアニメーションしません。
時間のかかる処理をTThread.CreateAnonymousThread等を使って別スレッドで実行させるとアニメーションします。

編集 削除