Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Высота строки в VirtualDrawTree 
:(
    Опции темы
Alexander63
  Дата 27.6.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.3.2007

Репутация: нет
Всего: нет



Как изменить высоту строки в VirtualDrawTree при отрисовке smile 
PM MAIL   Вверх
aktuba
Дата 27.6.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



OnMeasureItem и в настройках какое-то свойство установить надо, не помню..

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


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Alexander63
Дата 27.6.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.3.2007

Репутация: нет
Всего: нет



Это свойство установлено true и заюзан метод MeasureItemHeight, но почему то высота строк остается равной той, которая указана в свойстве DefaultNodeHeight
PM MAIL   Вверх
aktuba
Дата 27.6.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



выложи проект. ту телепатов нету


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Alexander63
Дата 27.6.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.3.2007

Репутация: нет
Всего: нет



Вот процедуры отрисовки. Что в них не так?

Код

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;

PM MAIL   Вверх
aktuba
Дата 27.6.2007, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

Код

NodeHeight := Node.NodeHeight;



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

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

Код

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



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


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Alexander63
Дата 27.6.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.3.2007

Репутация: нет
Всего: нет



эта строка для того, чтобы вычислить высоту с учетом текущего Font  и его стиля

Код

TargetCanvas.Font := Sender.Font;


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

Sender.MeasureItemHeight(TargetCanvas, Node);


или я не прав? А вообще мне нужно чтобы происходил перевод строки, если текст не помещается в ячейку.
PM MAIL   Вверх
aktuba
Дата 27.6.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

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


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


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Alexander63
Дата 27.6.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.3.2007

Репутация: нет
Всего: нет



В какую сторону копать?
PM MAIL   Вверх
aktuba
Дата 27.6.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Повторяю - выложи проект...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Alexander63
Дата 28.6.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.3.2007

Репутация: нет
Всего: нет



ПРоект очень большой. Зачем он вам.
PM MAIL   Вверх
aktuba
Дата 28.6.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

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


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


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Alexander63
Дата 28.6.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.3.2007

Репутация: нет
Всего: нет



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

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

Код

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. В этом событии необходимо выставить нужную высоту строки. Как мне в этом случае узнать номер столбца, который в данный момент отрисовывается?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.