Android:在屏幕上显示组件而不与它们交互时执行方法

问题描述 投票:0回答:2

我已经开始在 Android 上使用 FireMonkey 编程(直到现在我在 C++Builder 6 中编程),第一个问题开始出现。

举个例子:

在 Windows 上的 BCB6 和 FireMonkey 中,如果我创建一个带有

TForm
TPanel
,其中包含一个
TProgressBar
,并且在
TForm.OnActivate
事件中我实现了一个循环并显示
TProgressBar 的方法调用
“推进”,它会完美执行。它显示了窗体、面板和进度条,然后执行方法。

如果我在 Android 上实现相同的“脚本”,它会在“启动画面”期间执行该方法,然后在移动屏幕上显示面板及其组件,并在循环完成后显示它们。我试过在表单的其他事件(

OnCreate
OnFocus...
等)中调用该方法,但结果是一样的。

简而言之,我不知道如何做到一旦表单及其组件显示在移动屏幕上,就开始执行任何算法,而不需要与它们进行任何类型的交互。

是否有解决方案,或者我应该重新考虑我的 Android 编程方式?

android firemonkey c++builder
2个回答
0
投票

在窗体的

OnShow
事件中,尝试使用
TThread.ForceQueue()
延迟执行方法,直到事件处理程序退出后,例如:

procedure TForm1.FormShow(Sender: TObject);
begin
  TThread.ForceQueue(nil,
    procedure
    begin
      // method call here ...
    end
  );
end;

0
投票

自从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 事件中)。

© www.soinside.com 2019 - 2024. All rights reserved.