Как установить выравнивание текста для определенного столбца в firemonkey TGrid/TStringGrid?

В firemonkey (RAD Studio 10.3) я работаю с TStringGrid, подключенным к базе данных, и хочу изменить выравнивание текста определенного столбца. Как я могу это сделать? Изменение HorzAlign в свойстве TextSettings изменяет выравнивание всех столбцов.

Я попробовал предложенное решение в эта страница и не сработало! В более новых версиях Firemonkey приведенный ниже код решения приводит к ошибке.

type TSpecificColumn = class(TColumn)
protected
  function CreateCellControl: TStyledControl;override;
end;

В классе TColumn больше нет функции CreateCellControl, которую можно было бы переопределить! Это ошибка, которую я получил:

Метод CreateCellControl не найден в базовом классе.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 833
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В событиях OnDrawColumnCell и/или OnDrawColumnHeader вы можете использовать TTextLayout для этой цели. Как в следующем примере, показывающем отрисовку ячеек с тремя разными выравниваниями. То же самое можно применить при рисовании заголовков:

uses
  ...
  fmx.textlayout;


procedure TForm11.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
  const Column: TColumn; const Bounds: TRectF; const Row: Integer;
  const Value: TValue; const State: TGridDrawStates);
var
  tl: TTextLayout;
  rf: TRectF;    // added
begin
  tl := TTextLayoutManager.DefaultTextLayout.Create;
  try
    tl.BeginUpdate;
    try
      // added from here
      rf := Bounds;
      InflateRect(rf, -2, -2);
      if (TGridDrawState.Selected in State) or
         (TGridDrawState.Focused in State) or
         (TGridDrawState.RowSelected in State)
      then
        Canvas.Fill.Color := TAlphaColors.LightBlue
      else
        Canvas.Fill.Color := TAlphaColors.White;

      Canvas.FillRect(rf, 0, 0, [], 1);
      // added until here

      tl.TopLeft := Bounds.TopLeft;
      tl.MaxSize := PointF(Column.Width, Column.Height);
      tl.Font.Size := 15;
      tl.Text := 'Some text'; // Value
      case Column.Index of
        0: tl.HorizontalAlign := TTextAlign.Leading;
        1: tl.HorizontalAlign := TTextAlign.Center;
        2: tl.HorizontalAlign := TTextAlign.Trailing;
      end;
    finally
      tl.EndUpdate;
    end;
    tl.RenderLayout(Canvas);
  finally
    tl.Free;
  end;
end;

TTextLayout имеет много других полезных опций и свойств, поэтому рекомендую ознакомиться с документацией.

Спасибо за отличный ответ! Все работает чудесно, кроме одной вещи, с которой я не знаю, что с этим делать. Как я упоминал в вопросе, мой StringGrid подключен к таблице базы данных (через TBindSourceDB) для просмотра и редактирования значений. Для свойства text созданного textlayout я сделал это: tl.Text := value.ToString; но теперь в каждой ячейке у меня есть два текстовых значения друг на друге. Это образ. Что вы предлагаете? @Том

Moj.H 21.07.2019 06:38

Для заголовка у меня тоже была эта проблема. Добавив Column.Header := ''; в событие OnDrawColumnHeader, заголовки стали ОК. Но для ячеек, содержащих значения базы данных, я понятия не имею! Это изображение №1 и изображение №2 до и после решения проблемы с заголовком.

Moj.H 21.07.2019 07:12

Извините, что здесь. Я могу продолжить расследование, если вы можете предоставить мне набор данных в памяти, привязку данных и соответствующие части файла .fmx (чтобы убедиться, что мои настройки равны), чтобы воспроизвести проблему. Также включите свою версию обработчика событий OnDrawColumnCell().

Tom Brunberg 21.07.2019 09:15

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

Tom Brunberg 21.07.2019 11:53

Бесконечно благодарен! Ваш новый фрагмент кода сделал свое дело. Кроме того, я изменил InflateRect(rf, -2, -2); на InflateRect(rf, 0, 0);, чтобы полностью покрыть предыдущие значения в ячейках. кроме того, я включил AlternatingRowBackground в настройках, и мне пришлось учитывать цвета фона для альтернативных строк. В качестве решения я проверяю, является ли индекс строки нечетным или четным, и я не знаю, правильно это или глупо!

Moj.H 21.07.2019 13:05

Осталась только одна проблема! Когда я дважды щелкаю ячейку и она переходит в режим редактирования, выравнивание текста возвращается к значению по умолчанию! Например, я установил выравнивание на «по центру» в событии OnDrawColumnCell, а свойство textalignment в инспекторе объектов установлено на «ведущий». Во время выполнения выравнивание текста «по центру», но когда я дважды щелкаю ячейку и она переходит в режим редактирования, выравнивание текста возвращается к «ведущему».

Moj.H 21.07.2019 13:11

На самом деле выравнивание текста не меняется, хотя может так показаться. Это выглядит так из-за внутреннего редактора, который жестко закодирован так, чтобы открываться на левой границе ячейки и покрывать всю область ячейки. Поэтому текст в редакторе отображается слева от ячейки. TStringGrid не позволяет отображать редактор в разных позициях.

Tom Brunberg 21.07.2019 15:47

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

Moj.H 21.07.2019 16:17

Помимо уже идентифицированного изменения InflateRect(rf, 0, 0), чтобы существующие данные отображались правильно:

Изменять

tl.Text := 'Some text'; // Value line 

к

tl.Text := [StringGrid name property].Cells[Column.Index,Row];

Это сработало для меня.

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