Как бы я применил цвет к дочерним узлам только для TcxTreelists?

Еще один вопрос, касающийся списков разработчиков. Мне удалось получить cxgrid для раскраски строк на основе значения, хранящегося в сетке. Мои попытки перенести эти знания в древовидный список не увенчались успехом. У меня в настоящее время вся сетка окрашена, и дочерние узлы остаются по умолчанию (черный текст на белом фоне).

Я думаю, что проблема заключается в том, когда и как заполняются дочерние узлы. В настоящее время они динамически заполняются и удаляются при изменении выбора.

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; //clear children so that list doesnt get duplicate entries / children
      LSiteData := TSiteList(LNode.Data); //root node info
      PopulateOfferList; //populate children list with data from DB
      InitialiseOffers; // populate treelist with children gathered from the list above
      LNode.Expand(True);
   end
   else
   begin
     LListData := TOfferList(LNode.Data); //do stuff with selected child node
     LContract := TItem.Create(LListData.UnitID);//do stuff with selected child node
    end;
  end;
end;

Это как есть, работает отлично. Я могу делать то, что мне нужно, со всей информацией. Однако весь список черно-белый. Чтобы помочь выявить любые различия в дочерних узлах, я бы хотел, чтобы они были окрашены на основе информации, собранной в процессе заполнения (объекты БД).

Текущий пользовательский розыгрыш:

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;

Это вызывает нарушения прав доступа при изменении родительских (корневых) узлов и не окрашивает ни один из дочерних узлов. Я попытался добавить Tree.FullRefresh для события nodeselectionchange, но это, похоже, не оказало никакого влияния.

Я просто хочу иметь возможность изменять цвет фона и текста в зависимости от данных, хранящихся в узле. Когда родительские узлы отображаются в черно-белом режиме, а дочерние узлы - целый массив цветов.

Спасибо,

Любые вопросы или подсказки для вещей, которые я пропустил, я был бы более чем рад добавить. Примечание. Я добавляю дочерние узлы, используя процедуру Node.AddChild.

Изменить: думаю, что я добавил сигнатуру метода, никогда не слышал, чтобы его так называли, так что это одна терминология, которую я могу отметить в своем списке.

1 ответ

Решение

Аккаунт 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; //integer stored in db
    ACanvas.Font.Color := LState.Foreground; //integer stored in db
  end;
end;

Оказывается, я пытался переоценить его, разделив процедуру на "сбор данных" и применив холст. Держа это вместе, это работает. На заметку будущему мне ПОЦЕЛУЙ (пусть будет просто глупо)!

Простите за потраченное время, ребята. Чувствую, что я пытался сделать проблему сложнее, чем когда-либо

Другие вопросы по тегам