3
votes

It is nice that Firemonkey got again the Hint property for controls, at least in Delphi Berlin and Seattle. However, the implementation seems to be a bit flawed yet.

One weird issue is that the displaying of the Hint seems related to the form's BorderIcons property. If the BorderIcons are left with the default values (Maximize, Minimize, SystemMenu), the hint shows. But if I change some of the border icons, the hints don't show any more. I don't see any logic for it, so it looks like a bug. I traced some code in the FMX.Forms unit, but couldn't find any relation to the border icons. The hints in TriggerControlHint and other methods seem to be set correctly.

Has anyone had such an issue and have you solved it somehow?

There are other issue, like hints not working on a XE8 project converted to Seattle on Windows. It was mentioned in this question Firemonkey Hints don't work in Delphi Seattle, for a project converted from XE7. I fixed that by recreating the dproj file and it probably has something to do with the default manifests/themes.

Also hints for controls placed on a TLayout don't show, because the layout doesn't have the ShowHint property. Doesn't sound very logical to me, but at least it can be overcome by setting each control's ShowHint property manually.

The issue is reported on QC as RSP-13218

1

1 Answers

2
votes

After more tracing through FMX.Forms I found the bug.

In the end of the TCommonCustomForm.Create method the hint object is set with

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

but when the BorderIcons are changed, and also in other cases, it calls the TCommonCustomForm.Recreate method, which also recreates the window handle, so the hint is no longer linked to it. To fix it I had to also recreate the hint by adding a few lines before the finally clause in the Recreate method:

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;