powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / VirtualStringTree + FocusedNode + OwnerDraw
25 сообщений из 26, страница 1 из 2
VirtualStringTree + FocusedNode + OwnerDraw
    #38521337
VTV-шник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
7129Как сделать произвольную отрисовку основной колонки фокусной ноды?
VTV ver 4.8.7.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure MyVTBeforeCellPaint(Sender: TBaseVirtualTree;
      TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
      CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
begin
//  if (Node <> Sender.FocusedNode) and (Column =  MyVT.Header.MainColumn) then // - так работает
//  if (Node = Sender.FocusedNode)  and (Column <> MyVT.Header.MainColumn) then // - так работает
  if (Node = Sender.FocusedNode) and (Column = MyVT.Header.MainColumn) then // - ФигВам 
  begin
    TargetCanvas.Brush.Color := oChessColor;
    TargetCanvas.FillRect(CellRect);
  end;
end;
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521352
Фотография kgb ussr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VTV-шник,

Что надо?
Она и так правильно отрисовывается.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521362
VTV-шник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kgb ussr,
Что значит правильно?
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521366
Фотография kgb ussr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VTV-шникkgb ussr,
Что значит правильно?
Это значит - "меня устраивает".
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521393
VTV-шник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Допустим, хочу залить градиентом, или отрисовать в 2(3, 4...) цвета.
Ы?
Ошибочка закралась - событие не Before, а AfterCellPaint.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure MyVTAfterCellPaint(Sender: TBaseVirtualTree;
      TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
      CellRect: TRect);
begin
  if (Node = Sender.FocusedNode) and (Column = MyVT.Header.MainColumn) then 
  begin
     FillGradient(TargetCanvas, CellRect, ...);
  end;
end;


Отрисовка выполняется по умолчанию.
Для ЛЮБОЙ другой ячейки это работает
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521415
Фотография kgb ussr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VTV-шник,

если колонка в фокусе, определяй

Код: pascal
1.
2.
3.
4.
        *.Colors.FocusedSelectionBorderColor := ...;
        *.Colors.UnfocusedSelectionBorderColor := ...;
        *.Colors.FocusedSelectionColor := ...;
        *.Colors.UnfocusedSelectionColor := ...;






Вот мой код раскраски:


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
procedure TBaseTreeFrame.VSTBeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellRect: TRect);
var
  SelColor, InactiveSelColor: TColor;
begin
  if BusinessDataModule.Parameters.bExpertParams.SelColor = clDefault then
    SelColor := DarkenedColor(TargetCanvas.Brush.Color, 30)
  else
    SelColor := BusinessDataModule.Parameters.bExpertParams.SelColor;
  InactiveSelColor := BrightenedColorProp(SelColor, 128);

  if Column >= VST.Header.Columns.Count then
    Exit;

  if VST.Selected[Node] or (VST.FocusedNode = Node) then
  begin
    if VST.Focused or VST.IsEditing then begin
      TargetCanvas.Brush.Color := SelColor;
    end else begin
      TargetCanvas.Brush.Color := InactiveSelColor;
    end;

    if (Column = VST.FocusedColumn) then begin
      if (Node = VST.FocusedNode) then begin
        if IsCellEditable(Node, Column) then begin
          if IsObservableRed(SelColor) then begin
            VST.Colors.FocusedSelectionBorderColor := clRed;
            VST.Colors.UnfocusedSelectionBorderColor := clRed;
          end else begin
            VST.Colors.FocusedSelectionBorderColor := clWhite;
            VST.Colors.UnfocusedSelectionBorderColor := clWhite;
          end;
        end else begin
          if IsObservableYellow(SelColor) then begin
            VST.Colors.FocusedSelectionBorderColor := clYellow;
            VST.Colors.UnfocusedSelectionBorderColor := clYellow;
          end else begin
            VST.Colors.FocusedSelectionBorderColor := clOlive;
            VST.Colors.UnfocusedSelectionBorderColor := clOlive;
          end;
        end;
        VST.Colors.FocusedSelectionColor := DarkenedColor(SelColor, 15);
        VST.Colors.UnfocusedSelectionColor := DarkenedColor(InactiveSelColor, 15);
      end else begin
        VST.Colors.FocusedSelectionBorderColor := SelColor;
        VST.Colors.UnfocusedSelectionBorderColor := InactiveSelColor;
        VST.Colors.FocusedSelectionColor := SelColor;
        VST.Colors.UnfocusedSelectionColor := InactiveSelColor;
      end;
    end;
  end;
  if TargetCanvas.Brush.Color <> VST.Color then
    TargetCanvas.FillRect(CellRect);
end;
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521431
VTV-шник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kgb ussr,
Это понятно, это я знаю.
Но это НЕ ПРОИЗВОЛЬНОЕ РИСОВАНИЕ ячейки.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521442
VTV-шник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу градиент в основной колонки фокусной ноды.
Кстати, да, это касается не только фокусной, а всех Selected нод.
Зачем? Просто чтоб уметь это делать.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521449
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VTV-шникЗачем? Просто чтоб уметь это делать.
Придется изучить циклы.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521455
Фотография kgb ussr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VTV-шник...
Но это НЕ ПРОИЗВОЛЬНОЕ РИСОВАНИЕ ячейки.
Для этого следует использовать VirtualDrawTree.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521478
VTV-шник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kgb ussr, Да, с DrawTree проблем нет.
В принципе, можно и со StringTree извернуться, самостоятельно прорисовывая текст ноды в событии AfterCellPaint после отрисовки градиента...

wadman, расшифруй, не понял.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521501
Фотография user89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VTV-шник,

кстати, про градиент. В версии 5.0.0 возможен глюк. Иногда, при щелкании по доченим ячейкам, в столбцах у всех корневых Node пропадает градиент. Поэтому пришлось изворачиваться.
в событии OnMouseDown
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
procedure Tfrm_Main.vtMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  CurrentNode, SaveNode: PVirtualNode;
  dr: TRect;
begin
  CurrentNode := vt.NodeParent[vt.FocusedNode];

  if Assigned(CurrentNode) then
  begin
    SaveNode := CurrentNode; // Сохраним Node, потом пригодится для движения вниз от найденного родителя.

    // Сначала наверх от найденного родителя. Ищем только видимые на экране корневые узлы
    repeat
      dr := vt.GetDisplayRect(CurrentNode, 5, false, false, false);
      if dr.Bottom > 0 then vt.InvalidateNode(CurrentNode);
      CurrentNode := vt.GetPreviousSibling(CurrentNode);
    until (CurrentNode = nil) or (dr.Bottom < 1);
    // Теперь вниз от заранее сохраненного родителя. Ищем только видимые на экране корневые узлы
    CurrentNode := vt.GetNextSibling(SaveNode);
    if Assigned(CurrentNode) then
      repeat
        dr := vt.GetDisplayRect(CurrentNode, 5, false, false, false);
        if dr.Bottom > 0 then vt.InvalidateNode(CurrentNode);
        CurrentNode := vt.GetNextSibling(CurrentNode);
      until (CurrentNode = nil) or (dr.Bottom > vt.ClientHeight);

  end;//if Assigned(CurrentNode)
end;

...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521507
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VTV-шникwadman, расшифруй, не понял.
Градиент рисуется в цикле.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #38521537
VTV-шник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanГрадиент рисуется в цикле.
Спасибо, улыбнуло :)
Я знаю, как рисуется градиент.
Дело в том, что во всех ячейках VirtualStringTree,
кроме Selected ячеек основной колонки, это замечательно рисуется.
А вот в них - нет.
Точнее, предполагаю, что в этих ячейках тоже все ОК,
просто дефолтная отрисовка этих ячеек происходит после события BeforeCellPaint.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
VirtualStringTree + FocusedNode + OwnerDraw
    #39512609
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если например пользователь не делает фокус и надо выделить определенную строку (тоесть сделать буквы не черными а красными)
То есть идет обновление и во время обновления нашлась ошибка как можно указать это ?
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #39512627
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMagА если например пользователь не делает фокус и надо выделить определенную строку (тоесть сделать буквы не черными а красными)
То есть идет обновление и во время обновления нашлась ошибка как можно указать это ?
В демке посмотреть и в доке - не? Мне лично помогло.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #39512664
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВ демке посмотреть и в доке - не? Мне лично помогло.

Если ты не хочешь помочь просто не пиши! Уже в доску достал!
Все эти демки и мануал в 800 страниц пересмотрел и не понял.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #39512673
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMag,

VST.FocusedNode = Node - это проверка на то, в фокусе ли текущая нода при отрисовке.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #39512689
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторVST.FocusedNode = Node - это проверка на то, в фокусе ли текущая нода при отрисовке.

Да про фокус я знаю, но пользователь не должен брать ее в фокус, а программа заполняет данные и видит что в данных есть ошибка и просто выделяет эту строку.
Если тока я не правильна понял саму функцию фокуса.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #39512765
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMag,

Дерево начитает отрисовываться. У него есть список узлов. На отрисовку каждого узла происходит событие OnBeforeCellPaint, которое вы собираетесь перекрывать. Дальше вы (программа) можете сказать: "вот этот узел - кривой, установим у него цвет шрифта - красный". Ок. Если вы не будете ставить дополнительных условий, типа: цвет шрифта у узла красный, если узел в данный момент выделенный, то он будет красным в любом случае (хоть он выделен, в фокусе, хоть нет). Условие, по которому можно определить, является ли узел - фокусным, выше указано. Если вам не нужно учитывать это условие - просто не указывайте в событии.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #39512912
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторДерево начитает отрисовываться. У него есть список узлов. На отрисовку каждого узла происходит событие OnBeforeCellPaint, которое вы собираетесь перекрывать. Дальше вы (программа) можете сказать: "вот этот узел - кривой, установим у него цвет шрифта - красный". Ок. Если вы не будете ставить дополнительных условий, типа: цвет шрифта у узла красный, если узел в данный момент выделенный, то он будет красным в любом случае (хоть он выделен, в фокусе, хоть нет). Условие, по которому можно определить, является ли узел - фокусным, выше указано. Если вам не нужно учитывать это условие - просто не указывайте в событии.

ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО! То что надо!
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #39512978
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMagавторВ демке посмотреть и в доке - не? Мне лично помогло.

Если ты не хочешь помочь просто не пиши! Уже в доску достал!
Все эти демки и мануал в 800 страниц пересмотрел и не понял.
Фыр-фыр...
А предыдущий ответ как раз по твоему вопросу был: 15394957
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #39513028
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторФыр-фыр...
А предыдущий ответ как раз по твоему вопросу был: 15394957

Фыр-фыр забуть про фокус, мне надо без фокуса
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #39513051
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMagавторФыр-фыр...
А предыдущий ответ как раз по твоему вопросу был: 15394957

Фыр-фыр забуть про фокус, мне надо без фокуса

А там и без фокуса тоже. Учись читать код, лентяйко.
...
Рейтинг: 0 / 0
VirtualStringTree + FocusedNode + OwnerDraw
    #39513111
ain-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMag,

Из программы, работающее. Правда Лазарус, но VT и там и там практически один:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TfFirms.vsPricePaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType);
var Data: PPrice;
begin
  Data := Sender.GetNodeData(Node);
  if Assigned(Data) then Param.SetColorProduct(TVirtualStringTree(Sender), TargetCanvas, Node, Data^.Firm, Data^.IsShow);
  if not Data^.Is_Title then
  case Column of
    clPriceOffice: if Data^.CountOffice < 0 then TargetCanvas.Font.Color := clRed;
    clPriceDC:     if Data^.CountSklad < 0 then TargetCanvas.Font.Color := clRed;
    clPriceAllDC:  if (Data^.CountOffice + Data^.CountSklad) < 0 then TargetCanvas.Font.Color := clRed;
    clPriceIC:     if Data^.CountIC < 0 then TargetCanvas.Font.Color := clRed;
    clPriceDelta:  if Data^.CountDelta < 0 then TargetCanvas.Font.Color := clRed;
  end;
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TParam.SetColorProduct(Sender: TVirtualStringTree; const TargetCanvas: TCanvas; Node: PVirtualNode; aFirm: TLFirm; Is_Show: Boolean);
begin
  if Node = Sender.HotNode then SetHotColor(TargetCanvas, aFirm)
  else
    if Node = Sender.FocusedNode then SetFocusColor(Sender, TargetCanvas, aFirm)
    else
      if Is_Show then SetNormColor(Sender, TargetCanvas, aFirm)
      else TargetCanvas.Font.Color := clGray;
end;
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / VirtualStringTree + FocusedNode + OwnerDraw
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]