Как бы я применил цвет к дочерним узлам только для 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;
Оказывается, я пытался переоценить его, разделив процедуру на "сбор данных" и применив холст. Держа это вместе, это работает. На заметку будущему мне ПОЦЕЛУЙ (пусть будет просто глупо)!
Простите за потраченное время, ребята. Чувствую, что я пытался сделать проблему сложнее, чем когда-либо