Вопрос, который волнует многих разработчиков, работающих с компонентами Devextreme, связан с окрашиванием узлов в TcxTreeList. Пользователь столкнулся с проблемой, когда весь грид окрашивался в один цвет, а дочерние узлы оставались неокрашенными, то есть с черным текстом на белом фоне. Проблема заключалась в том, что узлы заполнялись и удалялись динамически при изменении выбора.
var
LNode : TcxTreeListNode;
LListData : TOfferList;
LSiteData : TSiteList;
LContract : TItem;
begin
LNode := TreeTypes.FocusedNode;
if Assigned(LNode) then
begin
if LNode.Level = 0 then
begin
LNode.DeleteChildren; // Очистка детей для предотвращения дублирования
LSiteData := TSiteList(LNode.Data);
PopulateOfferList; // Заполнение списка детей данными из базы
InitialiseOffers; // Наполнение дерева данными из списка
LNode.Expand(True);
end
else
begin
LListData := TOfferList(LNode.Data);
LContract := TItem.Create(LListData.UnitID);
end;
end;
end;
В данном примере кода, приведенного выше, осуществляется динамическое заполнение узлов TreeList данными из базы. Однако, несмотря на успешное выполнение основных операций, пользователь хотел бы видеть дочерние узлы окрашенными в разные цвета для лучшей идентификации различий между ними.
Для реализации окрашивания узлов был использован метод CustomDrawDataCell, однако при изменении родительских узлов возникали ошибки доступа и окрашивание дочерних узлов не происходило. После этого было решено добавить Tree.FullRefresh на событие NodeSelectionChange, но это также не принесло ожидаемого результата.
procedure TFrmTestView1.TreeTypesCustomDrawDataCell(Sender: TcxCustomTreeList;
ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo; var ADone: Boolean);
var
LState : TStates;
LOffer : TOfferList;
begin
if (Assigned(AViewInfo)) and (Assigned(AViewInfo.Node)) then
begin
if AViewInfo.Node.Level > 0 then
begin
LOffer := AViewInfo.Node.Data;
LState := FGlobals.GetStateFromID(LOffer.StateID);
end;
end;
if AViewInfo.Node.Level > 0 then
begin
if Assigned(LState) then
begin
ACanvas.Brush.Color := LState.Background;
ACanvas.Font.Color := LState.Foreground;
end;
end;
end;
Проблема была решена после обращения в поддержку Devexpress, которая предоставила следующий код:
var
LState : TStates;
LOffer : TOfferList;
begin
if AViewInfo.Node.Level > 0 then
begin
LOffer := TOfferList(AViewInfo.Node.Data);
LState := FGlobals.GetStateFromTag(LOffer.StateTag);
ACanvas.Brush.Color := LState.Background; // Цвет фона, сохраненный в базе данных как целочисленное значение
ACanvas.Font.Color := LState.Foreground; // Цвет текста, сохраненный в базе данных как целочисленное значение
end;
end;
Ошибка заключалась в том, что пользователь пытался усложнить процесс, разделив его на этапы "сбор данных" и "применение к canvas". Сохранение процесса в едином блоке кода позволило достичь желаемого результата. В будущем стоит помнить о принципе KISS (Keep it simple, stupid!).
Таким образом, пользователь смог успешно окрасить дочерние узлы в соответствии с данными, сохраненными в базе данных, и избежать дальнейших проблем с окрашиванием при изменении родительских узлов.
Пользователь столкнулся с проблемой окрашивания дочерних узлов в компоненте Devextreme TreeList, когда динамически изменялось состояние узлов, и пытался найти решение, используя методы настройки цвета в процессе отрисовки узлов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS