Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как в TStringGrid изменить цвет текста по условию?


Vasya

Вопрос

Как в TStringGrid изменить цвет текста по условию желательно без рисования самого текста в ячейке самостоятельно, т.е. только за счёт указания, каким цветом рисовать?

Или с рисованием текста, но тогда как его сделать абсолютно точно совпадающим (кроме цвета) с тем, что по-умолчанию выводится?

Изменено пользователем Vasya
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Только с рисованием.

Используй GridDrawColumnCell

procedure TForm2.GridDrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates);
const
  HorzTextMargin = 2;
  VertTextMargin = 1;
var
  TextLayout: TTextLayout;
  TextRect: TRectF;
  el_id: Integer;
  i: Integer;
  el_type: Integer;
begin
  TextRect := Bounds;
  TextRect.Left := TextRect.Left + 1;
  TextRect.Bottom := TextRect.Bottom - 1;
  TextRect.Inflate(-HorzTextMargin, -VertTextMargin);
  if TGridDrawState.RowSelected in State then
    Canvas.Fill.Color := form1.Style.SelectCellColor
  else
    Canvas.Fill.Color := TAlphaColors.white;
  Canvas.FillRect(Bounds, 0, 0, AllCorners, 1);
  if Value.IsEmpty = false then
  begin
    TextLayout := TTextLayoutManager.DefaultTextLayout.Create;
    try
      TextLayout.BeginUpdate;
      try
        TextLayout.WordWrap := false;
        TextLayout.Opacity := Column.AbsoluteOpacity;

        TextLayout.HorizontalAlign := TTextalign.Leading;
        TextLayout.VerticalAlign := TTextalign.Center;
        TextLayout.Trimming := TTextTrimming.Character;
        TextLayout.TopLeft := TextRect.TopLeft;
        TextLayout.Text := Value.ToString;
        TextLayout.MaxSize := PointF(TextRect.Width, TextRect.Height);

            el_type := 0; //условие и т.д.
            if el_type = 0 then
              TextLayout.Color := form1.Style.OsveshenieColor
            else if el_type = 1 then
              TextLayout.Color := form1.Style.KlimatColor
            else if el_type = 2 then
              TextLayout.Color := form1.Style.BezopasnostColor
            else if el_type = 3 then
              TextLayout.Color := form1.Style.OhranaColor
            else if el_type = 4 then
              TextLayout.Color := form1.Style.UstroystvaColor
            else if el_type = 5 then
              TextLayout.Color := form1.Style.UpravlenieColor
            else if el_type = 6 then
              TextLayout.Color := form1.Style.WifiColor
            else if el_type = 7 then
              TextLayout.Color := form1.Style.DopColor;

        { Пользовательские настройки отрисовки }
        // TextLayout.Font.Family := 'Times New Roman';
        // TextLayout.Color := form1.Style.FontColor;
        TextLayout.Font.Size := form1.Style.FontSize;
        TextLayout.Font.Family := (Sender as TStringGrid).TextSettings.Font.Family;
      finally
        TextLayout.EndUpdate;
      end;
      TextLayout.RenderLayout(Canvas);
    finally
      TextLayout.DisposeOf;
    end;
  end;
end;

 

Ссылка на комментарий
  • 0

Спасибки!

Я почему не люблю с собственным рисованием - потому что никакой гарантии, что это будет в точности также (геометрически), как это делает оригинал...

Ссылка на комментарий
  • 0

Подскажите, а как обратиться к цвету selection'а изнутри обработчка GridDrawColumnCell() ?

Ещё глобальный вопрос - а где вообще увидеть, какой контрол что именно использует из стилизатора?

Screenshot_1.png

Ссылка на комментарий
  • 0

Так Вам шашечки или ехать? 

Если Вы рисуете на канве, то какие стили могут быть?

Для канвы я Вам пример дал, там есть все про цвет выделенной ячейки.

Если Вы хотите попробовать использовать стили, то примерно это должно выглядеть так

Stringgrig.StylesData['background.content.selection.Fill.Color'] := Color;

Но это не точно, надо пробовать

 

А где увидеть, что именно используется из стиля я не знаю, может кто еще подскажет.

По стилям есть видеоуроки от Ярослава Бровина, посмотрите, может там будет ответ

Изменено пользователем gonzales
Ссылка на комментарий
  • 0
2 часа назад, gonzales сказал:

Если Вы рисуете на канве, то какие стили могут быть?

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

  if TGridDrawState.RowSelected in State then
    Canvas.Fill.Color := ???
  else
    Canvas.Fill.Color := ???;

Т.к. если я этого не сделаю, то вместо синего фона для выбранной строки будут белые дыры с синими рамками.

В Вашем примере

form1.Style

это что? Я думал, что это адресация к стилям из StyleBook, прикреплённого к форме.

Ещё я заметил, что есил вместо условия, приведённого выше, просто написать

Canvas.Fill.Color := 0;

то фон будет всегда нормальный. Ничего не понимаю ) Где это всё описано чётко?

Изменено пользователем Vasya
Ссылка на комментарий
  • 0
1 час назад, Vasya сказал:

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

Color := Stringgrig.StylesData['background.content.selection.Fill.Color']

 

1 час назад, Vasya сказал:

В Вашем примере

form1.Style

это что? Я думал, что это адресация к стилям из StyleBook, прикреплённого к форме.

Это просто набор цветов, который я использую. 

1 час назад, Vasya сказал:

Ещё я заметил, что есил вместо условия, приведённого выше, просто написать

Canvas.Fill.Color := 0;

то фон будет всегда нормальный. Ничего не понимаю ) Где это всё описано чётко?

Я дал пример, выдранный из одного моего проекта, нигде ничего четко написано не будет)))

Для понимания работы цветов в firemonkey - вот почитайте https://docwiki.embarcadero.com/RADStudio/Sydney/en/Colors_in_FireMonkey

то, что Вы указали Color:=0 - так это нулевой цвет, с нулевой прозрачностью, что Вы ожидали увидеть?

Ссылка на комментарий
  • 0

Что здесь не так?

Canvas.Fill.Color := (Sender as TStringGrid).StylesData['background.content.selection.Fill.Color'].AsType<TAlphaColor>

выдаёт exception чтения с нулевого адреса. Если же в качестве пути к стилю написать любую ерунду вроде 'aaabbbccc', то выдаёт 0 и не вылетает. Сам Sender приходит нормальный, можно заменить прямо на MyGrid - будет тоже самое. Можно написать AsInteger - будет тоже самое.

 

Вылетает вот здесь:

function TRttiProperty.GetValue(Instance: Pointer): TValue;
begin
  if not IsReadable then
    raise EPropWriteOnly.Create(Name);
  Result := DoGetValue(Instance);
end;

 

Про TAlphaColors.Null понял.

Изменено пользователем Vasya
Ссылка на комментарий
  • 0
 (Sender as TStringGrid).StylesData['background.content.selection.Fill.Color'].AsType<TAlphaColor>

(Sender as TStringGrid)(если тут nil то будет ошибка).StylesData['background.content.selection.Fill.Color'](если тут nil то будет ошибка).AsType<TAlphaColor>

https://stackoverflow.com/questions/43624260/how-to-change-color-of-a-cell-in-a-delphi-tgrid-firemonkey-component тут варианты как можно рисовать, в конце способ отрисовки по умолчанию, если у Canvas изменить цвет то нарисует я думаю нужным цветом текст.

 

Ссылка на комментарий
  • 0

На вид соответствует (сорри за гигантскую фотку, не уменьшается):

 Screenshot_1.png

Из этого всего надо вытащить цвет selection.

 

Upd: аааааа, у видел разницу в иконке... и что делать? Этот стиль не я создавал, это стандартные стили из дитрибутива Борланда, называется "Windows 10"

 

Изменено пользователем Vasya
Ссылка на комментарий
  • 0

это растровый стиль, если ткнуть дважды в элемент откроется окно с картинкой и областью, которая будет отображаться на канве. векторные стили встроенные C:\Program Files (x86)\Embarcadero\Studio\22.0\Redist\styles\Fmx

Ссылка на комментарий
  • 0

Ещё раз сделал цепочку действий:

1. Двойной клик на StyleBook, лежащий на форме

2. Загружаю в него коллекцию стилей из файла "C:\Program Files (x86)\Embarcadero\Studio\21.0\Redist\styles\Fmx\Win10Modern.Style"

3. Слева вижу, что "background" имеет иконку как у меня (растровую), а не как у тебя

ЧЯДНТ?

Изменено пользователем Vasya
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...