Сетки VCL Ownerdraw не выбирают ожидаемый выбранный цвет для стиля VCL

В нашем продукте используется сетка, рисуемая владельцем (TStringGrid), где мы рисуем все за пределами сетки. Я пытаюсь сделать так, чтобы это соответствовало стилю VCL, используемому приложением. Большая часть этого работает, но когда я пытаюсь получить выбранный цвет для сетки, он либо кажется черным (не очень хорошо, когда используемый стиль уже темный), либо кажущимся случайным градиентом. Вот код, который я использую для получения выбранного цвета (возможно, я использую неправильный элемент или ElementColor для получения ожидаемого цвета).

    StyleServices.GetElementColor (StyleServices.GetElementDetails (tgCellSelected), ecFillColor, theColor);

Любая помощь будет оценена по достоинству. Спасибо


person mmmm    schedule 23.12.2016    source источник


Ответы (1)


Не все TElementColor (ecBorderColor, ecFillColor, ecTextColor, ..) определены для всех возможных TThemedElementDetails, поэтому вы всегда должны проверять логический результат, возвращаемый функцией GetElementColor.

Если результат ложный, значит, цвет не определен. В вашем случае значение цвета не определено для ecFillColor, когда элемент равен tgCellSelected.

Попробуйте этот образец, в котором вместо элемента tgClassicCellSelected используется элемент tgClassicCellSelected, а если он не существует, просто используйте цвет HighLight активного стиля VCL.

if not StyleServices.GetElementColor(StyleServices.GetElementDetails(tgClassicCellSelected), ecFillColor, AColor) then
 AColor := StyleServices.GetSystemColor(clHighlight);
person RRUZ    schedule 23.12.2016
comment
Я экспериментировал с установкой его для каждого типа элемента и остановился на tgFixedCellNormal, как вы предложили. Падение назад тоже хорошо. Спасибо еще раз) - person mmmm; 23.12.2016