おはようございます。
アニメーションについて教えてください。
以下のコードで実行したのですが
アニメーションが動いてくれません。
[処理内容]
①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
なんかすごいのが来ましたね。
TActivityIndicator コンポーネントを使って
処理の進捗をアニメーション表示したいけどうまく動かない
ってことだとすると
ループ内で処理の進捗を表示していないから表示されないのでは?
下の方で
for i := 1 to book.Worksheets.Count do
とあるのがループ部分でこの処理に時間がかかるから
その進捗を表示したいと思うのですが
そのループ内に進捗を表示する処理がないから表示されません。
サンプルをと思ったのですが
これ、とあるWEBサイトのサンプルをそのままコピペしただけですね
サンプルが何をしているのかを自分で理解しないと使うのは難しいのでは?
ステップ実行でもいいので自身で書いたプログラムがどういう動きをしているのか
一度試して見てはいかがでしょうか?
LTime := timeGetTime - LStartTime;
if LTime > LMaxTime then
begin
//アニメーション終了
ActivityIndicator1.Animate := False;
end;
Application.ProcessMessages;
Sleep(1);
これはなんですか?
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 でやってるだけだね
TActivityIndicatorはメインスレッドで動作します。したがって、時間のかかる処理をメインスレッドで行うと、TActivityIndicatorがアニメーションしません。
時間のかかる処理をTThread.CreateAnonymousThread等を使って別スレッドで実行させるとアニメーションします。
ツイート | ![]() |