在运行时创建 TActivityIndicator 时出错
Error Creating TActivityIndicator at Runtime
我在 Delphi 10 西雅图看到了 TActivityIndicator 的介绍,觉得很酷,我可以在某个地方使用它。我想用它来表明我的表单的一些动态创建的部分在填充表单之前仍在加载数据。所以我想我会在开始将数据加载到 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]。
我发现,如果您尝试更改在设计时创建的 TActivityIndicator 的 IndicatorSize
,那么它会完美运行。那么我在这里缺少什么或者无法在运行时创建 TActivityIndicators
?
错误信息很清楚。您需要分配一个 Parent
,activity 指标将在其上自行绘制。 Owner
是Owner销毁时负责释放控件的组件; Parent
是将在其上绘制(父级)控件以供显示的控件。
解决方案是在代码中分配父级:
Indicator := TActivityIndicator.Create(Self);
Indicator.Parent := Self; // <-- here
// Set any other properties here
同样的问题在所有视觉控件(例如TEdit
、TLabel
、TMemo
等)上都很常见,它们都需要有一个Parent
分配是为了有地方画自己。在某些情况下,需要 Parent
才能使子控件中的各种属性在依赖于具有 HWND
window 的子控件时正常运行,这需要 [=11] =] window,依此类推。
如果我理解您的意图,我想您会失望的。 TActivityIndicator
非常静态;它不是线程化的,这意味着如果您的表单很忙并且不处理计时器消息(它在内部使用),它将停止更新。
我在 Delphi 10 西雅图看到了 TActivityIndicator 的介绍,觉得很酷,我可以在某个地方使用它。我想用它来表明我的表单的一些动态创建的部分在填充表单之前仍在加载数据。所以我想我会在开始将数据加载到 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]。
我发现,如果您尝试更改在设计时创建的 TActivityIndicator 的 IndicatorSize
,那么它会完美运行。那么我在这里缺少什么或者无法在运行时创建 TActivityIndicators
?
错误信息很清楚。您需要分配一个 Parent
,activity 指标将在其上自行绘制。 Owner
是Owner销毁时负责释放控件的组件; Parent
是将在其上绘制(父级)控件以供显示的控件。
解决方案是在代码中分配父级:
Indicator := TActivityIndicator.Create(Self);
Indicator.Parent := Self; // <-- here
// Set any other properties here
同样的问题在所有视觉控件(例如TEdit
、TLabel
、TMemo
等)上都很常见,它们都需要有一个Parent
分配是为了有地方画自己。在某些情况下,需要 Parent
才能使子控件中的各种属性在依赖于具有 HWND
window 的子控件时正常运行,这需要 [=11] =] window,依此类推。
如果我理解您的意图,我想您会失望的。 TActivityIndicator
非常静态;它不是线程化的,这意味着如果您的表单很忙并且不处理计时器消息(它在内部使用),它将停止更新。