在运行时创建 TActivityIndi​​cator 时出错

Error Creating TActivityIndicator at Runtime

我在 Delphi 10 西雅图看到了 TActivityIndi​​cator 的介绍,觉得很酷,我可以在某个地方使用它。我想用它来表明我的表单的一些动态创建的部分在填充表单之前仍在加载数据。所以我想我会在开始将数据加载到 FormShow 之前执行此操作,其中 self 是表单。

indicator := TActivityIndicator.Create(self);
indicator.IndicatorSize := TActivityIndicatorSize.aisLarge;

可悲的是,当我尝试动态创建它们然后进行设置时 TActivityIndicator.IndicatorSize 我得到一个异常 ... EInvalidOperation with message 'Control '<name>' has no parent window' 单步执行 VCL 将我带到 Vcl.Controls TWinControl.CreateWnd 具体

if (WndParent = 0) and (Style and WS_CHILD <> 0) then
  if (Owner <> nil) and (csReading in Owner.ComponentState) and
    (Owner is TWinControl) then
    WndParent := TWinControl(Owner).Handle
  else
    raise EInvalidOperation.CreateFmt(SParentRequired, [Name]);

我检查过 Owner 是当然是 TWinControl 的表单,但 (csReading in Owner.ComponentState) returns 错误。单步执行 FormCreate 上的 Owner.ComponentState = [] 和 FormShow 上的 [csFreeNotification]。

我发现,如果您尝试更改在设计时创建的 TActivityIndi​​cator 的 IndicatorSize,那么它会完美运行。那么我在这里缺少什么或者无法在运行时创建 TActivityIndicators

错误信息很清楚。您需要分配一个 Parent,activity 指标将在其上自行绘制。 Owner是Owner销毁时负责释放控件的组件; Parent 是将在其上绘制(父级)控件以供显示的控件。

解决方案是在代码中分配父级:

Indicator := TActivityIndicator.Create(Self);
Indicator.Parent := Self; // <-- here
// Set any other properties here

同样的问题在所有视觉控件(例如TEditTLabelTMemo 等)上都很常见,它们都需要有一个Parent 分配是为了有地方画自己。在某些情况下,需要 Parent 才能使子控件中的各种属性在依赖于具有 HWND window 的子控件时正常运行,这需要 [=11] =] window,依此类推。

如果我理解您的意图,我想您会失望的。 TActivityIndicator 非常静态;它不是线程化的,这意味着如果您的表单很忙并且不处理计时器消息(它在内部使用),它将停止更新。