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


Автор: Alexander63 27.6.2007, 14:57
Как изменить высоту строки в VirtualDrawTree при отрисовке smile 

Автор: aktuba 27.6.2007, 15:14
OnMeasureItem и в настройках какое-то свойство установить надо, не помню..

Добавлено через 1 минуту и 16 секунд
TreeOptions-MiscOptions-toVariableNodeHeight в True...

Автор: Alexander63 27.6.2007, 15:19
Это свойство установлено true и заюзан метод MeasureItemHeight, но почему то высота строк остается равной той, которая указана в свойстве DefaultNodeHeight

Автор: aktuba 27.6.2007, 15:30
выложи проект. ту телепатов нету

Автор: Alexander63 27.6.2007, 15:37
Вот процедуры отрисовки. Что в них не так?

Код

procedure TFormats.FormatGridDrawNode(Sender: TBaseVirtualTree; const PaintInfo: TVTPaintInfo);
var
   FormatData: PFormatRec;
   R: TRect;
begin
   FormatData := Sender.GetNodeData(PaintInfo.Node);
   with PaintInfo.Canvas do
   begin
      with Brush do
      begin
         Color := clWindow;
         Style := bsSolid;
      end;
      Pen.Color := $00B99D7F;
   end;
   if Sender.FocusedNode = PaintInfo.Node then
   begin
      PaintInfo.Canvas.Font.Style := [fsBold];
      GradFill(PaintInfo.Canvas.Handle, PaintInfo.CellRect, $00EAE2D9, $00D7C8B7, gkVert);
   end
   else
   begin
      PaintInfo.Canvas.Font.Style := [];
      PaintInfo.Canvas.FillRect(PaintInfo.CellRect);
   end;
   PaintInfo.Canvas.Brush.Style := bsClear;
   PaintInfo.Canvas.Font.Color := clBlack;
   case PaintInfo.Column of
      1: PaintInfo.Canvas.TextOut(PaintInfo.CellRect.Left + 4,
            PaintInfo.CellRect.Top + 2, FormatData.FieldName);
      2: PaintInfo.Canvas.TextOut(PaintInfo.CellRect.Left + 4,
            PaintInfo.CellRect.Top + 2, FormatData.Caption);
         end;
      3: PaintInfo.Canvas.TextOut(PaintInfo.CellRect.Left + 4,
            PaintInfo.CellRect.Top + 2, FormatData.Description);
   end;
end;

procedure TFormats.FormatGridMeasureItem(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer);
begin
   TargetCanvas.Font := Sender.Font;
   Sender.MeasureItemHeight(TargetCanvas, Node);
   NodeHeight := Node.NodeHeight;
end;

Автор: aktuba 27.6.2007, 15:53
Цитата

Код

NodeHeight := Node.NodeHeight;



Это ты ноду присваиваешь высоту этого-же нода???? ну правильно, как было 18 так и останеться =)))) Где ты высоту меняешь?

Добавлено через 52 секунды
Цитата

Код

   TargetCanvas.Font := Sender.Font;
   Sender.MeasureItemHeight(TargetCanvas, Node);



Эти строки вообще не понял smile 

Автор: Alexander63 27.6.2007, 16:00
эта строка для того, чтобы вычислить высоту с учетом текущего Font  и его стиля

Код

TargetCanvas.Font := Sender.Font;


а собственно вычисление новой выстоы должно происходить в 
Код

Sender.MeasureItemHeight(TargetCanvas, Node);


или я не прав? А вообще мне нужно чтобы происходил перевод строки, если текст не помещается в ячейку.

Автор: aktuba 27.6.2007, 16:06
Цитата

А вообще мне нужно чтобы происходил перевод строки, если текст не помещается в ячейку. 


А как ты тогда вычисляешь? TargetCanvas - это канва (а, соответственно и размер) всего VirtualTreeView. Т.е. у тебя текст всегда будет помещаться (99,9%)... Для подобного, подход не правильный.

Автор: Alexander63 27.6.2007, 16:08
В какую сторону копать?

Автор: aktuba 27.6.2007, 19:11
Повторяю - выложи проект...

Автор: Alexander63 28.6.2007, 10:41
ПРоект очень большой. Зачем он вам.

Автор: aktuba 28.6.2007, 11:25
Цитата

ПРоект очень большой. Зачем он вам. 


Да не целый проект. Сделай тестовый, в котором будет просто добавление и отрисовка твоим кодом...

Автор: Alexander63 28.6.2007, 12:03
А разве тех двух процедур, приведенных выше недостаточно?.

Вот процедура отрисовки грида. 

Код

procedure TFormats.FormatGridDrawNode(Sender: TBaseVirtualTree; const PaintInfo: TVTPaintInfo);
var
   FormatData: PFormatRec;
   R: TRect;
begin
   FormatData := Sender.GetNodeData(PaintInfo.Node);
   with PaintInfo.Canvas do
   begin
      with Brush do
      begin
         Color := clWindow;
         Style := bsSolid;
      end;
      Pen.Color := $00B99D7F;
   end;
   if Sender.FocusedNode = PaintInfo.Node then
   begin
//      PaintInfo.Canvas.Font.Style := [fsBold];
      GradFill(PaintInfo.Canvas.Handle, PaintInfo.CellRect, $00EAE2D9, $00D7C8B7, gkVert);
   end
   else
   begin
//      PaintInfo.Canvas.Font.Style := [];
      PaintInfo.Canvas.FillRect(PaintInfo.CellRect);
   end;
   PaintInfo.Canvas.Font.Style := [];
   PaintInfo.Canvas.Brush.Style := bsClear;
   PaintInfo.Canvas.Font.Color := clBlack;
   case PaintInfo.Column of
      1: PaintInfo.Canvas.TextOut(PaintInfo.CellRect.Left + 4,
            PaintInfo.CellRect.Top + 2, FormatData.FieldName);
      2: begin
            R := PaintInfo.CellRect;
            Windows.DrawText(PaintInfo.Canvas.Handle, pchar(FormatData.Caption),
               length(FormatData.Caption), R, DT_NOCLIP or DT_LEFT or DT_WORDBREAK);
//            PaintInfo.Canvas.TextOut(R.Left + 4,
//               R.Top + 2, FormatData.Caption);
         end;
      3: PaintInfo.Canvas.TextOut(PaintInfo.CellRect.Left + 4,
            PaintInfo.CellRect.Top + 2, FormatData.Description);
   end;
end;


В этом варианте текст, не помещающийся в ячейку, переносится на новую строку. НО высота ячейки не меняется. Хотя в свойствах VDT.TreeOptions.MiscOptions.toVariableNodeHeight у меня в true. И каждый нод получает в Node.States параметр vsMultiline. Весь вопрос состоит в том как мне динамически изменить высоту ячейки при переносе текста?
Я догадываюсь, что необходимо задействовать событие OnMeasureItem. В этом событии необходимо выставить нужную высоту строки. Как мне в этом случае узнать номер столбца, который в данный момент отрисовывается?

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