【发布时间】:2021-02-20 00:00:43
【问题描述】:
我有一个 Delphi 项目,它由两个表单组成,即 MainForm 和 DialogForm。当我点击 Button1 时,DialogForm 应该会出现并保持在顶部,直到某个过程完成(该过程需要几秒钟才能完成)。
DialogForm 包含一个Timage 组件。当我单击 Button1 以显示 DialogForm 时,Gif 图像出现但没有动画。这只发生在进程开始时(没有动画工作的进程)。这是什么原因以及如何保持动画直到关闭 DialogForm?
procedure TMainForm.Button1Click(Sender: TObject);
var
gif: TGIFImage;
begin
Enabled:=false;
try
DialogForm.Show;
DialogForm.Refresh;
// The process is:
...
ipcAES1.Encrypt;//where ipcAES is part of the IPWorks Encrypt library
RichEdit1.Text:=ipcAES1.OutputMessage;
finally
Enabled:= true;
DialogForm.Close;
end;
end;
//---------------------------------------
procedure TDialogForm.FormShow(Sender: TObject);
var
gif: TGIFImage;
begin
gif := TGIFImage.Create;
gif.LoadFromFile('D:\preview.gif');
gif.Animate := True;
image1.Parent := Self;
image1.Left := 0;
image1.Top := 0;
image1.width := 800;
image1.height := 800;
image1.Picture.Assign(gif);
gif.Animate := True;
gif.Free;
end;
【问题讨论】:
-
欢迎来到 StackOverflow!只是一个想法:也许 TGifImage 依靠 Windows 消息处理来制作动画。如果您的进程不调用消息泵,则动画将停止。尝试在处理过程中尽可能频繁地添加 Application.ProcessMessages 调用。这只是一个测试,因为调用 ProcessMessages 可能存在缺陷。我们先看看它是否有效。
-
另外,请看这个问题:stackoverflow.com/questions/9573572/…
-
进程是否在做与 UI 无关的事情,放入一个单独的线程中,这样当你的进程在后台运行时,UI 可以更新(并对 gif 进行动画处理)(注意,你不能使用/从后台线程与 UI/Form 控件交互)。
-
我已经修改了代码和问题,请检查。
-
GIF 动画可能涉及到一个计时器,因此,正如前面的 cmets 中所述,主线程在忙时无法更新它。
标签: delphi animated-gif timage