TVirtualStringTree - Проблемы с отображением подсказок в столбцах
При работе с компонентом TVirtualStringTree в Delphi может возникнуть проблема с отображением подсказок в столбцах. Пользовательский класс подсказок, возвращаемый в обработчике Application.OnShowHint, работает корректно для всех контролов, но при отображении подсказок в столбцах TVirtualStringTree подсказки отображаются лишь на мгновение и тут же исчезают.
Причина проблемы
Проблема связана с тем, что TVirtualStringTree использует собственный класс подсказок и структуру данных для передачи информации о подсказках в столбцах. Даже если пользовательский класс подсказок (наследуемый от THintWindow) возвращается в обработчике Application.OnShowHint, подсказки отображаются ненадолго и затем закрываются.
Пример кода
Ниже приведен пример кода, демонстрирующий проблему:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, VirtualTrees, StdCtrls;
type
TForm1 = class(TForm)
VirtualStringTree1: TVirtualStringTree;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
public
procedure ApplicationShowHint(var HintStr: string; var CanShow: Boolean;
var HintInfo: THintInfo);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TMyHintWindow = class(THintWindow)
public
{ nothing special here for now }
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
VirtualStringTree1.Hint := 'VT main hint';
VirtualStringTree1.ShowHint := True;
Memo1.Hint := 'Memo hint';
Memo1.ShowHint := True;
Application.OnShowHint := ApplicationShowHint;
end;
procedure TForm1.ApplicationShowHint(var HintStr: string; var CanShow: Boolean;
var HintInfo: THintInfo);
var
VTHintData: TVTHintData;
begin
if HintInfo.HintWindowClass = TVirtualTreeHintWindow then
begin
if HintInfo.HintData <> nil then
begin
VTHintData := PVTHintData(HintInfo.HintData)^;
if VTHintData.Node <> nil then
begin
{ node hint }
end
else
begin
{ column hint }
HintStr := VTHintData.DefaultHint;
end;
end;
end;
Memo1.Lines.Add(HintStr);
HintInfo.HintColor := clAqua;
{ use my own hint window class
the hint from the VT columns is shown for a split second and hides! }
HintInfo.HintWindowClass := TMyHintWindow;
end;
end.
Решение проблемы
Для решения проблемы необходимо обработать подсказки для столбцов вручную, используя методы DoGetNodeHint или DoGetNodeToolTip компонента TVirtualStringTree. Это позволит отображать пользовательские подсказки для столбцов без проблем.
Подтвержденный ответ
Чтобы отображать пользовательские подсказки в столбцах TVirtualStringTree, необходимо обработать подсказки для столбцов вручную, используя методы DoGetNodeHint или DoGetNodeToolTip. Это решит проблему с отображением подсказок в столбцах.
Альтернативный ответ
Если пользовательский класс подсказок не является критически важным для приложения, можно использовать встроенный класс подсказок TVirtualTreeHintWindow, который будет отображать подсказки для столбцов корректно. В этом случае не потребуется обрабатывать подсказки для столбцов вручную.
При работе с компонентом `TVirtualStringTree` в Delphi может возникнуть проблема с отображением подсказок в столбцах, где пользовательский класс подсказок работает корректно для всех контролов, но при отображении подсказок в столбцах `TVirtualStringTree`
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.