Jak*_*ays 4 delphi firemonkey delphi-xe5
我正在使用Delphi XE-5(Firemonkey移动应用程序)
我想通过在长时间处理期间显示来让TAniIndicator工作.我的主表单上有一个TAniIndicator(AniIndi),但它没有旋转.它显示正确,但不旋转.
begin
Loading:= True;
AniIndi.Visible:= True;
AniIndi.Enabled:= True;
UpdateAll;
Application.ProcessMessages;
//do my processsing here
Loading:= False;
AniIndi.Enabled:= False;
AniIndi.Visible:= False;
UpdateAll;
Application.ProcessMessages;
end;
Run Code Online (Sandbox Code Playgroud)
//基于REMY的答案进行编辑
TLoadThread = class(TThread)
public
Config: Boolean;
constructor Create(const aConfig: Boolean); reintroduce;
protected
procedure DoProcessing;
procedure Execute; Override;
end;
var
loading: Boolean = false;
zLThread: TLoadThread = nil;
constructor TLoadThread.Create(const aConfig: Boolean);
begin
inherited Create(true);
Config:= aConfig;
end;
procedure TLoadThread.DoProcessing;
var
begin
//do processing here and update main form
end;
procedure TLoadThread.Execute;
begin
FreeOnTerminate:= true;
Synchronize(DoProcessing);
end;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
zLThread:= TLoadThread.Create(True, Host, NamePath, Config, Port);
zLThread.OnTerminate := ThreadTerminated;
zLThread.Start;
Loading := True;
AniIndi.Visible := True;
AniIndi.Enabled := True;
UpdateAll;
end;
procedure TfrmMain.ThreadTerminated(Sender: TObject);
begin
zLThread := nil;
Loading := False;
AniIndi.Enabled := False;
AniIndi.Visible := False;
UpdateAll;
end;
Run Code Online (Sandbox Code Playgroud)
Rem*_*eau 14
在长进程运行时,主线程需要对消息队列保持响应.如果没有,则阻止动画(以及UI的其他方面)接收新消息,例如绘制请求和计时器通知.您需要将任何长处理移动到单独的线程中.启动线程,然后启动动画.让主线程在此期间正常处理UI.线程完成后,让它通知主线程,然后主线程可以停止动画,并完成线程结果所需的任何其他处理(如果有的话).例如:
type
TLoadThread = class(TThread)
public
Host: string;
NamePath: string;
Port: Integer;
Config: Boolean;
constructor Create(const aHost, aNamePath: string; aPort: Integer; aConfig: Boolean); reintroduce;
protected
procedure Execute; override;
end;
constructor TLoadThread.Create(const aHost, aNamePath: string; aPort: Integer; aConfig: Boolean);
begin
inherited Create(True);
FreeOnTerminate := True;
Host := aHost;
NamePath := aNamePath;
Port := aPort;
Config := aConfig;
end;
procedure TLoadThread.Execute;
begin
//do processing
Synchronize(
procedure
//update main form
end
);
//do processing
end;
Run Code Online (Sandbox Code Playgroud)
var
Loading: Boolean = False;
zLThread: TLoadThread = nil;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
zLThread := TLoadThread.Create(Host, NamePath, Port, Config);
zLThread.OnTerminate := ThreadTerminated;
zLThread.Start;
Loading := True;
AniIndi.Visible := True;
AniIndi.Enabled := True;
UpdateAll;
end;
procedure TfrmMain.ThreadTerminated(Sender: TObject);
begin
zLThread := nil;
Loading := False;
AniIndi.Enabled := False;
AniIndi.Visible := False;
UpdateAll;
end;
Run Code Online (Sandbox Code Playgroud)