Delphi 西雅图未显示有关 Firemonkey 的提示

Hints on Firemonkey not displaying in Delphi Seattle

很高兴 Firemonkey 再次获得控件提示 属性,至少在 Delphi 柏林和西雅图是这样。 不过,实现起来好像还是有点问题。

一个奇怪的问题是 Hint 的显示似乎与表单的 BorderIcons 属性 有关。如果 BorderIcons 保留默认值(Maximize、Minimize、SystemMenu),则显示提示。但是如果我改变一些边框图标,提示就不会再显示了。我没有看到任何逻辑,所以它看起来像一个错误。我在 FMX.Forms 单元中追踪了一些代码,但找不到与边框图标的任何关系。 TriggerControlHint 和其他方法中的提示似乎设置正确。

有没有人遇到过这样的问题,你们有没有解决?

还有其他问题,例如提示在 Windows 上转换为西雅图的 XE8 项目上不起​​作用。在这个问题Firemonkey Hints don't work in Delphi Seattle, for a project converted from XE7中提到了它。我通过重新创建 dproj 文件修复了这个问题,它可能与默认 manifests/themes.

有关

放置在 TLayout 上的控件的提示也不会显示,因为布局没有 ShowHint 属性。对我来说听起来不太合逻辑,但至少可以通过手动设置每个控件的 ShowHint 属性 来克服它。

问题在 QC 上报告为 RSP-13218

通过 FMX.Forms 进行更多追踪后,我发现了错误。

TCommonCustomForm.Create 方法的末尾,提示对象设置为

if not (csDesigning in ComponentState) then
  FSharedHint := THint.CreateNewInstance(Handle);

但是当 BorderIcons 发生变化时,以及在其他情况下,它会调用 TCommonCustomForm.Recreate 方法,该方法也会重新创建 window 句柄,因此提示不再链接到它。 为了修复它,我还必须通过在 Recreate 方法中的 finally 子句之前添加几行来重新创建提示:

if Visible and ([TFmxFormState.Showing] * FormState = []) then
  FWinService.ShowWindow(Self);
// Added lines
if not (csDesigning in ComponentState) then
begin
  FSharedHint.Free;
  FSharedHint := THint.CreateNewInstance(Handle);
end;