【问题标题】:C++ Builder: Refresh FireMonkey Visual ComponentC++ Builder:刷新 FireMonkey 可视化组件
【发布时间】:2016-11-08 05:23:28
【问题描述】:

我对 C++ Builder 和 FireMonkey 有疑问。我正在创建一个与 Datasnap Rest WebService 连接的移动应用程序。有些请求有点长,所以我想显示一条等待消息。这是我的代码:

lbl_testConnexion->Text = "Please Wait...";
lbl_testConnexion->TextSettings->FontColor = TAlphaColorRec::Red;
this->Invalidate();

//Call to the Web Service
list<Colis>* l = WS->getListeColis("00DP0097");

lbl_testConnexion->Text = "Success!";

我尝试了函数 Form->Invalidate() 和 Label->Repaint() 但只显示最后一个文本。 如何动态刷新函数中的标签?

【问题讨论】:

  • 现在我真的不知道这个 builder 或 firemonkey 但通常 c++ 足够快,所以你的眼睛看不到 UI 的变化你确定你的查询运行的时间足够长,比如 ~5s最少?
  • 查询需要 3 到 6 秒,所以我确定这不是光学效应。感谢您的回答

标签: c++ c++builder firemonkey


【解决方案1】:

文本的更改必须由被请求阻塞的主线程处理。如果您不想为长请求使用单独的线程,您必须调用Application-&gt;ProcessMessages()

lbl_testConnexion->Text = "Please Wait...";
lbl_testConnexion->TextSettings->FontColor = TAlphaColorRec::Red;
Application->ProcessMessages();

//Call to the Web Service
list<Colis>* l = WS->getListeColis("00DP0097");

lbl_testConnexion->Text = "Success!";

注意:

你必须小心Application-&gt;ProcessMessages()。您可以在互联网上找到许多关于此的文章和讨论。当您使用 VCL 时,存在用于类型 TWinControl 的控件的方法 Update,它调用 WinAPI 的函数 UpdateWindow。 Firemonkey 确实有类似的功能,但仅适用于 Windows。

包含FMX.Platform.Win.hpp 并将Application-&gt;ProcessMessages() 替换为UpdateWindow(Platform::Win::WindowHandleToPlatform(Handle)-&gt;Wnd)

【讨论】:

  • 远离Application-&gt;ProcessMessages()!如果您只想重新绘制 UI,请使用各个控件的 Repaint() 方法,甚至是表单本身,来处理挂起的绘制操作。使用InvalidateRect() 方法向需要重新绘制的控件发出信号。
  • @RemyLebeau:我也试过这个。但是控件不会立即重新绘制。 TForm 也没有 Repaint() 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2014-03-27
  • 1970-01-01
  • 2019-07-14
相关资源
最近更新 更多