Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Оформление VitrualTreeView


Автор: estra 22.12.2009, 16:10
Есть VitrualTreeView, заполняемое примерно следующим образом

user posted image

1. Можно ли (и если да, то как) сделать эффект объединения ячеек, как в Excel, чтобы текст (в данном случае название фильма) не обрывался у границы первой колонки, а продолжал писаться во второй, третьей и т.д., сколько бы их не было?

2. Хочется использовать фон у VitrualTreeView, но когда я в событии BeforeCellPaint делаю отрисовку, то под ней фона не видно (что конечно же логично). Хочу, отрисовывая свой фон, сделать эффект полупрозрачности, для чего мне нужно получить координаты ячейки относительно VitrualTreeView, а зная их скопировать часть канвы с этими координатами, и рисовать уже на этой копии. Как это можно сделать?

Очень надеюсь на помощь форумчан!

Автор: kami 22.12.2009, 20:45
по п.1:
AutoSpanColumns в TreeOptions>AutoOptions поставить в True.
В ячейках, которые стоят после длинного текста должно быть '' (пустая строка), неплохо так же (imho) сделать обработчик события OnGetCellIsEmpty.

Автор: estra 22.12.2009, 21:25
Спасибо!

Цитата(kami @ 22.12.2009,  20:45)
…неплохо так же (imho) сделать обработчик события OnGetCellIsEmpty.


А можно поподробнее? С какой целью нужно обрабатывать это событие? Если можно, приведите для наглядности пример…
 smile 

Автор: kami 22.12.2009, 22:47
Давненько не заглядывал уже в исходники VT, но если не изменяет память, это событие активно используется для определения - стоит ли отрисовывать границы ячеек, их фон и т.п... Можно, конечно, и без него (все работать будет), но кажется дольше (с лишними вызовами к примеру отрисовки).

Пример из моего кода:
Код

procedure TfrState.vtGetCellIsEmpty(Sender: TBaseVirtualTree;  Node: PVirtualNode; Column: TColumnIndex; var IsEmpty: Boolean);
var
  NodeData: pStateNodeData;
begin
  if Column = 1 then
    IsEmpty := False // первая колонка не может быть пустой - № п/п или заголовок
  else
    begin
      IsEmpty:=True; // иначе - 
      NodeData := Sender.GetNodeData(Node);
      if Assigned(NodeData) then
        if Assigned(NodeData.StateItem) then
          IsEmpty := NodeData.StateItem.ElementName <> ''; // если заголовок - все колонки кроме первой пустые.
    end;
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)