Создание подробного представления с панелью заголовка для каждой группы элементов в виртуальном древовидном представлении (TVirtualStringTree) - PullRequest
6 голосов
/ 29 августа 2011

Я пытаюсь получить результат, похожий на этот, из TVirtualStringTree:

desired virtualtreeview appearance

Я считаю, что это может быть возможно либо напрямую с помощью TVirtualStringTree (основной виртуальныйЭлемент управления Treeview (Майк Лишке), или путем его наследования и изменения унаследованного элемента управления, или перейдя к TVirtualDrawTree.

Вот что я могу получить, и показывает проблему, с которой я сталкиваюсь:

actual vritualtreeview appearance

У меня проблема в том, что я не могу получить текст для столбца 0, который бы занимал всю горизонтальную область виртуального древовидного элемента управления.В демонстрации Advanced есть демонстрация виртуального дерева, показывающая многострочный текст, который, кажется, делает то, что мне нужно, но я не могу понять, как его применять в сочетании со столбцами сведений, которые мне нужны, под строкой заголовка (показанной как Node,Узел, узел на рисунке).

Вот что я пытался:

  • Изменить ContentRect.Right в событии BeforeCellPaint:
  • установить toGridExtensions в в TreeOptions.MiscOptions.

Вот пример кода, показывающий, как я пытался изменить contentRect:

procedure TForm1.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
   level:Integer;
begin
 level := VirtualStringTree1.GetNodeLevel(Node);
 if (level=0) then
    Inc( ContentRect.Right, 300);

end;

Обновление:

Использованиеответ принят ниже, я получаю следующее:

enter image description here

1 Ответ

5 голосов
/ 29 августа 2011

Я думаю, вы хотите использовать опцию toAutoSpanColumnsTreeOptions.AutoOptions), возможно, с событием OnGetCellIsEmpty (не нужно, если вы возвращаете текст только для первого столбца).

Комуполучить многострочные узлы, инициировать их с состоянием ivsMultiline (в событии OnInitNode) или установить vtree.MultiLine[Node] := boolean;

...