Если вы используете компонент VirtualStringTree от SoftGem в среде разработки Delphi 7, вам, возможно, захочется добавить сетчатые линии, чтобы визуально улучшить представление данных в дереве. Стандартные свойства toShowHorzGridLines и toShowVertGridLines позволяют отображать линии только для существующих узлов, но как быть, если нужно показать линии в пустом пространстве до добавления элементов?
Описание проблемы
Пользователи VirtualStringTree в Delphi 7 часто сталкиваются с проблемой, когда хотят отобразить сетчатые линии, аналогичные тем, что используются в компоненте TListView. Стандартные свойства, такие как toShowHorzGridLines и toShowVertGridLines, не позволяют отобразить линии в пустом пространстве, где узлы ещё не созданы.
Решение проблемы
Из описания подтвержденного ответа следует, что для реализации полных сетчатых линий без учета несуществующих узлов необходимо модифицировать метод PaintTree. Ниже приведен пример кода, который позволяет дополнительно нарисовать горизонтальные линии, используя значение DefaultNodeHeight для определения расстояния между линиями.
type
TVirtualStringTree = class(VirtualTrees.TVirtualStringTree)
public
procedure PaintTree(TargetCanvas: TCanvas; Window: TRect; Target: TPoint;
PaintOptions: TVTInternalPaintOptions; PixelFormat: TPixelFormat = pfDevice); override;
end;
implementation
// TVirtualStringTree
procedure TVirtualStringTree.PaintTree(TargetCanvas: TCanvas; Window: TRect;
Target: TPoint; PaintOptions: TVTInternalPaintOptions;
PixelFormat: TPixelFormat);
var
I: Integer;
EmptyRect: TRect;
PaintInfo: TVTPaintInfo;
begin
inherited;
if (poGridLines in PaintOptions) and (toShowHorzGridLines in TreeOptions.PaintOptions) and
(GetLastVisible <> nil) then
begin
EmptyRect := GetDisplayRect(GetLastVisible,
Header.Columns[Header.Columns.GetLastVisibleColumn].Index, False);
EmptyRect := Rect(ClientRect.Left, EmptyRect.Bottom + DefaultNodeHeight,
EmptyRect.Right, ClientRect.Bottom);
ZeroMemory(@PaintInfo, SizeOf(PaintInfo));
PaintInfo.Canvas := TargetCanvas;
for I := 0 to ((EmptyRect.Bottom - EmptyRect.Top) div DefaultNodeHeight) do
begin
PaintInfo.Canvas.Font.Color := Colors.GridLineColor;
DrawDottedHLine(PaintInfo, EmptyRect.Left, EmptyRect.Right,
EmptyRect.Top + (I * DefaultNodeHeight));
end;
end;
end;
Пример кода выше должен быть добавлен в реализацию класса TVirtualStringTree. Этот код рисует сетчатые линии с использованием функции DefaultNodeHeight для пустого пространства, которое не заполнено узлами. Важно отметить, что для корректного отображения сплошных линий следует установить свойство LineStyle компонента в значение lsSolid.
Результаты и комментарии
Применение данного решения позволяет получить результат, на котором линии сетки отображаются правильно и в пустом пространстве перед узлами. Небольшой сдвиг, видимый на скриншоте, может быть следствием использования пунктирных линий. Исправление данного сдвига включает в себя корректное использование функции GetLastVisibleColumn для определения правой границы линии.
Напоминаем, что предложенный код является модификацией стандартной реализации компонента и может потребовать дополнительной настройки под конкретные нужды вашего проекта.
Пользователь столкнулся с необходимостью активировать сетчатые линии во VirtualStringTree в Delphi 7 для улучшения визуализации данных, даже в тех областях, где узлы ещё не созданы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.