德尔菲跳动
回答
试试这个:
AnimateUnit
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.
的图像
这很有趣......只要能正确地获取图像,你可以将这些图像发送给我吗?谢谢。 – DRokie 2011-04-29 20:56:01
你可以在这里下载:http://www.eyeclaxton.com/download/images.zip – eyeClaxton 2011-04-30 00:02:37
指标正常。更改后必须致电Application.ProcessMessages
。
请不要。改用“ProgressBar.Update”。 'Application.ProcessMessages'有很多你需要处理的潜在问题;只是调用控件的'更新'就可以做到你想要做的事情,速度更快,并且没有任何问题。 – 2011-04-29 11:03:35
@ Ken真的,但其余的UI也会死掉。当区域无效时,它不会重新绘制。取消按钮(如果存在)将不起作用。等等。如果您要在主线程中运行长时间运行的任务(并且理想情况下您不会),那么实现它的唯一方法就是ProcessMessages,并带来所有后果。 – 2011-04-29 11:17:37
@Ken:我与大卫同意。我知道差异和缺点,但恕我直言作为一个简单的解决方案的新手这是最好的方式去。 – 2011-04-29 11:25:38
您可能正在主线程中运行耗时的任务。
一种选择是将其移动到后台线程,这将允许您的消息队列被服务。您需要对其进行维护,以便使您的进度条以及任何UI都能正常工作。 “
”什么是最好的解决方案,以表明该应用程序正在做什么?“ - 将鼠标光标设置为crHourGlass?或者创建另一个表单/框架/等,它们会关注用户应用程序正在“做”的事情,而且他需要等待。
回答到更新的问题:
- 生成动画GIF例如here
- 添加GIF库环境(JEDI JVCL + JCL)
- 插入的TImage和加载生成GIF
- 使其可见,如果你需要它
即使另一个线程被冻结,动画GIF也会保持“跳动”。 OP要求一个跳动者,他必须ping更新。 – 2011-04-29 15:09:15
为动画GIF网站+1。 – 2011-04-29 21:32:59
从冗长的任务中,您可以偶尔更新视觉指示器,如进度条或其他任何东西。但是,您需要通过在提供反馈的控件上调用Update
来立即重绘更改。
请勿使用Application.ProcessMessages
,因为这会引入可能的重入问题。
- 1. 布朗菲尔德vs格林菲尔德发展?
- 2. 德尔菲阵列的TEdit
- 3. 德尔菲Maxmind geoip查询
- 4. 德尔菲表加入
- 5. 德尔菲击中输入
- 6. 德尔菲队列和同步参数
- 7. 德尔菲弦/字符串数组
- 8. 简单的德尔菲TTimer程序
- 9. 德尔菲帧销毁/隐藏
- 10. 德尔菲7定时器复位
- 11. 比特菲尔德与3个国家...?
- 12. 德尔菲通用约束问题
- 13. 火鸟v 2.5和德尔菲挂
- 14. 德尔菲法签名转换成C#
- 15. 德尔菲+网络摄像头
- 16. 在艾菲尔
- 17. 德尔菲情节抛物线与分辨率
- 18. 德尔菲的接口继承和观察者模式
- 19. 德尔菲新项目不是从form1开始
- 20. 德尔菲程序突然不会发布查询更改
- 21. 德尔菲组件面部识别和标记
- 22. 霍普菲尔德神经网络不识别
- 23. 德尔菲界面没有引用计数
- 24. 从C#导入非托管代码导入到德尔菲#
- 25. 黑莓 - 菲尔兹布局动画
- 26. 埃菲尔编程练习
- 27. 埃菲尔合同怀疑
- 28. 如何在艾菲尔
- 29. 的Javascript CSS动画库菲尔曼VS埃米尔
- 30. 德尔福HID Delphi7和德尔福XE2
“没有工作”是不准确的。它是如何工作的?你的两个答案已经做出了相同的假设,为什么它不起作用,但我们可能是错的! – 2011-04-29 10:55:52
你正在寻找的词是* throbber *,所以我将它添加到你的问题中。你仍然需要告诉我们,当你说你的“进度指示器”不起作用时,你是在说什么,然后你需要说出发生了什么,以及你期望发生什么。 – 2011-04-29 12:34:41
是的。我生成图像,但可以看到它移动... – DRokie 2011-04-29 12:43:57