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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Текст в ячейке VirtualTreeView, как расположить в центре 
V
    Опции темы
sanik
Дата 20.4.2012, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Надо сместить текст в ячейке VirtualTreeView в центр.
Не знаю и не могу найти нигде код, отвечающий за управление форматированием ячейки.

Присоединённый файл ( Кол-во скачиваний: 98 )
Присоединённый файл  HowToCenter.jpg 79,94 Kb
PM MAIL ICQ   Вверх
kami
Дата 20.4.2012, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



В design-mode:
  
Код

vt.Header.Columns[0].Alignment:=taCenter

Ку?
PM MAIL WWW   Вверх
sanik
Дата 20.4.2012, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вы что издеваетесь? Я же вроде предельно ясно на картинке изобразил что получается и что хотелось бы добиться.
vt.Header.Columns[0].Alignment:=taCenter
Эта опция, ессно, включена в настройках дерева. Но я заметил, что она глюкавая до чертиков и применима только к Caption - то есть к заголовку колонки и никак не влияет на управление содержимым ячейки данных.

Хорошо, прикладываю другую картинку, более подробную, подправил картинку.

Это сообщение отредактировал(а) sanik - 20.4.2012, 20:53

Присоединённый файл ( Кол-во скачиваний: 72 )
Присоединённый файл  Tut_Text2.jpg 224,00 Kb
PM MAIL ICQ   Вверх
sanik
Дата 20.4.2012, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Поразительно, что никто не заморачивался с такой проблемой. Не нашел в сети после упорных поисков ничего толкового. 
PM MAIL ICQ   Вверх
kami
Дата 20.4.2012, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(sanik @  20.4.2012,  20:45 Найти цитируемый пост)
Вы что издеваетесь?

Так и подмывает ответить "Да".

Цитата(sanik @  20.4.2012,  20:45 Найти цитируемый пост)
 Я же вроде предельно ясно на картинке изобразил 

Ключевое слово здесь - "вроде".

Теперь - к делу.
Во-первых, смотрим функцию DrawText. Выясняем, что для того, чтобы отображение было центрировано по вертикали, нужно выставить флаг DT_VCENTER. А он работает только совместно с DT_SINGLELINE.

Идем в исходники TCustomVirtualStringTree.PaintNormalText. (у меня версия 4.8.5, но я думаю в последующем вряд ли что поменялось).
И наблюдаем там примерно следующее:
    
Код

if vsMultiline in Node.States then
        begin
..........................................................................
        end
      else
        begin
          InflateRect(R, -FTextMargin, 0);
          FFontChanged := False;
          TripleWidth := FEllipsisWidth;
          DoPaintText(Node, Canvas, Column, ttNormal);
          if FFontChanged then
            begin
              // If the font has been changed then the ellipsis width must be recalculated.
              TripleWidth := 0;
              // Recalculate also the width of the normal text.
              GetTextExtentPoint32W(Canvas.Handle, PWideChar(Text), Length(Text), Size);
              NodeWidth := Size.cx + 2 * FTextMargin;
            end;

          // Disabled node color overrides all other variants.
          if (vsDisabled in Node.States) or not Enabled then
            Canvas.Font.Color := FColors.DisabledColor;

          [U]DrawFormat := DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE;[/U]
          if BidiMode <> bdLeftToRight then
            DrawFormat := DrawFormat or DT_RTLREADING;
          // Check if the text must be shortend.
          if (Column > -1) and ((NodeWidth - 2 * FTextMargin) > R.Right - R.Left) then
            begin
              Text := DoShortenString(Canvas, Node, Column, Text, R.Right - R.Left, TripleWidth);
              if Alignment = taRightJustify then
                DrawFormat := DrawFormat or DT_RIGHT
              else
                DrawFormat := DrawFormat or DT_LEFT;
            end
          else
            DrawFormat := DrawFormat or AlignmentToDrawFlag[Alignment];
        end;


Итого: для того, чтобы текст центрировался по вертикали, нужно чтобы у ячейки в States не было vsMultiline и текст должен "вписываться" полностью в отведенный ему регион.

Как-то так smile

Присоединённый файл ( Кол-во скачиваний: 55 )
Присоединённый файл  Безымянный.png 25,70 Kb
PM MAIL WWW   Вверх
kami
Дата 20.4.2012, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Ну и для того, чтобы нормально отработала строка
Код
DrawFormat := DrawFormat or AlignmentToDrawFlag[Alignment];

нужно, чтобы
Код
vt.Header.Columns[x].Alignment:=taCenter

Которое, кстати, к заголовку столбца отношения не имеет.
На заголовок влияет
Код
vt.Header.Columns[x].CaptionAlignment


P.S. Всё вышесказанное справедливо для версии 4.8.5, в последующих местоположение флагов и их состав вполне могли поменяться.

Это сообщение отредактировал(а) kami - 20.4.2012, 22:08
PM MAIL WWW   Вверх
sanik
Дата 20.4.2012, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



забавно! сам только что копал в сети про DrawTextW, 
спасибо буду смотреть

я позавчера выкладывал тестовый проект с multiline node

Довести до ума multirow virtual treeview, мультистрочный virtual treeview

тогда получается, что я пытаюсь совместить несовместимое - либо мультилайн, либо центровка по вертикали!?

как я понимаю: 
Цитата

Итого: для того, чтобы текст центрировался по вертикали, нужно чтобы у ячейки в States не было vsMultiline и текст должен "вписываться" полностью в отведенный ему регион.


надо ИЗБИРАТЕЛЬНО применить vsMultiline для колонок дерева, то есть для первых двух НЕ НУЖНО устанавливать мультилайн.

Не могли бы Вы посмотреть сам проект и "подкрутить гаечку".  Надеюсь, я не выгляжу халявщиком, весь тестовый проект собрал сам, осталось немного.  smile 

Это сообщение отредактировал(а) sanik - 20.4.2012, 22:46

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  VirtualTree_Multirows.zip 26,04 Kb
PM MAIL ICQ   Вверх
MacTep
Дата 24.4.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(sanik @  20.4.2012,  22:18 Найти цитируемый пост)
тогда получается, что я пытаюсь совместить несовместимое - либо мультилайн, либо центровка по вертикали!?

И какой грид ни возьми, везде так...


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Nightmareterrible
Дата 4.7.2013, 10:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



sanik

Не знаю, посещаете вы ещё форум или нет, но решение я нашёл.
Код

procedure TFormObjects.ViertualStringTree1AfterCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas;
  Node: PVirtualNode; Column: TColumnIndex; CellRect: TRect);
var
  Rect:TRect;
begin
  if (Column = 0) and (sender.MultiLine[Node]) and (CheckBox2.Checked) then
  begin
    rec := SEnder.GetNodeData(Node);
    Rect := CellRect;
    Rect.Left := 26 + 18*(Sender.GetNodeLevel(Node)+1); // Для Main-Column (у меня это Column0), для всех остальных +26 убираем
       DrawTextEx(TargetCanvas.Handle, PWideChar(rec.column0), Length(rec.column0),
       Rect,
       DT_VCENTER or DT_SINGLELINE,nil);
  end;
end;


И обязательно в OnGetText убираем текст с колонки, иначе у вас будут 2 одинаковых текста
Код

procedure TFormObjects.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType;

  var CellText: string);
begin
  rec := VST.GetNodeData(Node);
  case Column of
    0:
      //CellText := rec.column0;
      //Отрисовка осуществляется в onAfterCellPaint для выравнивания по центру
      // Если CellText = '' (пусто), то текст будет серым, а при выделении сбивается BKColor
      CellText := '   ';
    1:
      CellText := rec.column1;
    2:
      CellText := rec.column2;
  end;

PM MAIL   Вверх
sanik
Дата 11.7.2013, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ничерта не понятно. Пытаюсь применить в выложенном проекте.
Ругается на уже на это  -  
Цитата
PWideChar(rec.column0), Length(rec.column0),

у меня для rec.  нет column0, есть MessageAuthor, MessageDate, MessageText
если ставлю MessageAuthor - то 
Код

[Error] Unit1.pas(215): Incompatible types: 'WideChar' and 'Char'



Это сообщение отредактировал(а) sanik - 11.7.2013, 01:49
PM MAIL ICQ   Вверх
ZBugz
Дата 11.7.2013, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

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



В ошибке черным по белому написанно, что типы не совпадают smile
Нужно привести или к Char или WideChar...

Это сообщение отредактировал(а) ZBugz - 12.7.2013, 05:58
PM MAIL   Вверх
sanik
Дата 11.7.2013, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

       DrawTextEx(TargetCanvas.Handle, PChar(PWideChar(rec.MessageAuthor)), Length(rec.ElementName),Rect,
       DT_VCENTER or DT_SINGLELINE,nil);

так сделал, но ничего в работе проги не изменилось, подпись все равно находится вверху ячейки, а не рядом с пунктирной линией.

Это сообщение отредактировал(а) sanik - 11.7.2013, 19:27
PM MAIL ICQ   Вверх
northener
Дата 11.7.2013, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(sanik @  11.7.2013,  01:46 Найти цитируемый пост)
Пытаюсь применить в выложенном проекте.
Ругается на уже на это  -  
Цитата
PWideChar(rec.column0), Length(rec.column0),

у меня для rec.  нет column0, есть MessageAuthor, MessageDate, MessageText
если ставлю MessageAuthor - то 
Выделить всёкод Pascal/Delphi
1:
    
[Error] Unit1.pas(215): Incompatible types: 'WideChar' and 'Char'

Чего тут непонятно?
Ваша версия Дельфи ждет в качестве второго параметра процедуры DrawTextEx PChar (что в вашей Дельфи соответствует  PAnsiChar), а вы ей бездумно подсовываете PWideChar.
Попробуйте написать 
Код

 DrawTextEx(TargetCanvas.Handle, PChar(MessageAuthor), Length(MessageAuthor), Rect, DT_VCENTER or DT_SINGLELINE,nil);


P.S.
Я вообще не понимаю зачем в WinAPI-шной функции явно указывать PWideChar/PAnsiChar вместо PChar?

Это сообщение отредактировал(а) northener - 11.7.2013, 18:47


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
sanik
Дата 11.7.2013, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Я вообще не понимаю зачем

Ну просто коллега Nightmareterrible предложил вариант, я пробую.
Но я серьезно сомневаюсь, что существует решение.
Пока из всего, что предложили - ничего не срабатывает в проекте.
(красным прямоугольником показано ЖЕЛАТЕЛЬНОЕ расположение)
____________________________
Весь вышеобсужденный траходром "магически" решился путем скачивания и переустановки последней версии компонента. Вероятно, создатели поправили свои косяки.
Буду последовательно удалять из проекта примененные советы, чтобы найти что привело к разрешению проблемы.

Это сообщение отредактировал(а) sanik - 11.7.2013, 21:19

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  Somnenia.png 11,54 Kb
PM MAIL ICQ   Вверх
sanik
Дата 11.7.2013, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



выложенный вверху проект полностью правильно работает на выравнивание в ячейке


Присоединённый файл ( Кол-во скачиваний: 32 )
Присоединённый файл  Correct1.png 11,67 Kb
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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