我已经开始在 Android 上使用 FireMonkey 编程(直到现在我在 C++Builder 6 中编程),第一个问题开始出现。
举个例子:
在 Windows 上的 BCB6 和 FireMonkey 中,如果我创建一个带有
TForm
的 TPanel
,其中包含一个 TProgressBar
,并且在 TForm.OnActivate
事件中我实现了一个循环并显示 TProgressBar
的方法调用
“推进”,它会完美执行。它显示了窗体、面板和进度条,然后执行方法。
如果我在 Android 上实现相同的“脚本”,它会在“启动画面”期间执行该方法,然后在移动屏幕上显示面板及其组件,并在循环完成后显示它们。我试过在表单的其他事件(
OnCreate
,OnFocus...
等)中调用该方法,但结果是一样的。
简而言之,我不知道如何做到一旦表单及其组件显示在移动屏幕上,就开始执行任何算法,而不需要与它们进行任何类型的交互。
是否有解决方案,或者我应该重新考虑我的 Android 编程方式?
在窗体的
OnShow
事件中,尝试使用TThread.ForceQueue()
延迟执行方法,直到事件处理程序退出后,例如:
procedure TForm1.FormShow(Sender: TObject);
begin
TThread.ForceQueue(nil,
procedure
begin
// method call here ...
end
);
end;
自从Show活动之后,也不管用了。 我曾尝试测试您的解决方案,但它无法在 C++ 中实现,但它给了我使用线程的想法。
我创建了一个线程类的形式:
class TDowmload : public TThread
{
....
public:
// User declarations
__fastcall TDowmload(TComponent* Owner,bool CreateSuspended);
};
__fastcall TDowmload::TDowmload(TComponent* Ownerint,bool CreateSuspended) : TThread(CreateSuspended)
{
Priority = tpNormal;
FreeOnTerminate = true;
}
void __fastcall TDowmload::Execute()
{
Synchronize(discharge);
Terminate();
}
void __fastcall TDowmload::discharge()
{
..
..
..
// PhTemp = System::Ioutils::TPath::GetTempPath();
// One of the actions is to download an file :
// ( PhTemp + "EjpFile.txt"))
}
//-------------------------------------------- --------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
Application->ProcessMessages();
TDowmload *Hilo = new TDowmload(this,false);
PhTemp = System::Ioutils::TPath::GetTempPath();
while(!FileExists( PhTemp + "EjpFile.txt"))
{
Application->ProcessMessages();
......
......
}
....
....
}
线程可以完美地下载文件,但是直到事件代码 FormActivate 结束时组件才会显示在屏幕上(也在 OnCreate 和 Show 事件中)。