В процессе перехода от стандартного TTreeView к TVirtualStringTree может возникнуть необходимость наложить индикатор статуса (например, значок успеха или провала) поверх известного значка узла. В данной статье мы рассмотрим, как это можно сделать без рекурсивных вызовов уровня узла.
Используя TTreeView, можно было легко наложить значок статуса на узел с помощью следующего кода:
var
R: TRect;
begin
R := Node.DisplayRect(True);
StatusIconList.Draw(TreeView1.Canvas, R.Left - StatusIconList.Width - 14, R.Top, 3);
end;
Результат: красный крест поверх базового значка, как показано на рисунке:
При переходе к TVirtualStringTree может возникнуть желание найти лучший способ или получить более известные позиции для значка статуса. Однако, попытки повторить предыдущий подход могут привести к использованию уровня узла, что нежелательно:
procedure DrawFailed;
var
R: TRect;
begin
R := CellRect;
StatusIconList.Draw(TargetCanvas, R.Left - StatusIconList.Width + 49 + Sender.GetNodeLevel(Node) * 16, R.Top, siiFailed);
end;
Вопрос: есть ли лучшее решение для получения верхнего/левого угла базового значка без вызова уровня узла?
Подтвержденный ответ:
Вы можете использовать параметр Kind: TVTImageKind в обработчике события OnGetImageIndex. Проверьте его на ikOverlay и просто верните соответствующий индекс изображения.
Комментарии:
После добавления нескольких изображений в список изображений (например, индексы 8 и 9) и настройки OnGetImageIndex для возврата 0 или 1 при Kind = ikOverlay, значки статуса не отображаются. Возможно, нужно установить другой переключатель?
Ответ:
Использование параметра Kind: TVTImageKind в обработчике события OnGetImageIndex – это правильный подход. После настройки OnGetImageIndex для возврата соответствующего индекса изображения при Kind = ikOverlay, значки статуса должны отображаться без дополнительных настроек.
Пример кода:
procedure TForm1.VirtualTree1GetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; Kind: TVTImageKind; var Index: TImageIndex);
begin
if Kind = ikOverlay then
begin
if Node.Data is TMyNode then
begin
with TMyNode(Node.Data) do
case Status of
stPassed: Index := 0;
stFailed: Index := 1;
end;
end;
end
else
inherited;
end;
В данном примере TMyNode – это пользовательский тип данных узла, а Status – это поле, которое содержит текущий статус узла. Если Kind = ikOverlay, то в зависимости от статуса узла возвращается соответствующий индекс изображения. Если Kind не равен ikOverlay, то метод наследования вызывает родительский обработчик OnGetImageIndex.
Вывод:
можно осуществить с помощью параметра Kind: TVTImageKind в обработчике события OnGetImageIndex. После настройки OnGetImageIndex для возврата соответствующего индекса изображения при Kind = ikOverlay, значки статуса должны отображаться без дополнительных настроек.
В статье рассматривается вопрос наложения индикатора статуса на узлы TVirtualStringTree без рекурсивных вызовов уровня узла, используя параметр Kind: TVTImageKind в обработчике события OnGetImageIndex.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS