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

Изменение свойства шрифта одной ячейки в FireMonkey TStringGrid DELPHI XE6


CrazyUser

Вопрос

 в delphi xe4 и xe5 это осуществлялось вот так:

procedure TForm1.FormCreate(Sender: TObject);
var
  Col, Row: Integer;
  CellCtrl: TStyledControl;
begin
  StringGrid1.Cells[ 0, 0 ] := 'Cell00';
  StringGrid1.Cells[ 1, 0 ] := 'Cell10';

  StringGrid1.Cells[ 0, 1 ] := 'Cell01';
  StringGrid1.Cells[ 1, 1 ] := 'Cell11';

  for Col := 0 to StringGrid1.ColumnCount - 1 do
  begin
    for Row := 0 to StringGrid1.RowCount - 1 do
    begin
      CellCtrl := TColumnAccess( StringGrid1.Columns[ Col ] ).CellControlByRow( Row );
      if ( CellCtrl <> nil ) and ( CellCtrl is TTextCell ) then
      begin
        TTextCell( CellCtrl ).StyledSettings := [];
        TTextCell( CellCtrl ).FontColor := claBlueViolet;
        TTextCell( CellCtrl ).Font.Family := 'Times New Roman';
        TTextCell( CellCtrl ).Font.Style := [ TFontStyle.fsBold ];
        TTextCell( CellCtrl ).Font.Size := 14;
      end;
    end;
  end;
end;

в Delphi xe6 этот код ошибок не выдает, но и не чего не делает :(((

Подскажите, что не так?

 

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

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

  • 0
  • Администраторы

Поменялась логика работы грида. Теперь он самостоятельно отрисовывает ячейки и не создает для каждой ячейки отдельный контрол. Поэтому старый способ работать не будет.
 
Новый вариант решения - это самостоятельно нарисовать ячейку грида:

uses
  FMX.TextLayout, System.UIConsts;
procedure TForm2.Grid1DrawColumnCell(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;
begin
  // Здесь определяем какую ячейку будем перерисовывать
  if (Column = StringColumn1) and (Row = 1) then
  begin
    TextRect := Bounds;
    TextRect.Left := TextRect.Left + 1;
    TextRect.Bottom := TextRect.Bottom -1;
    TextRect.Inflate(-HorzTextMargin, -VertTextMargin);
    Canvas.FillRect(TextRect, 0, 0, AllCorners, 1);
    TextLayout := TTextLayoutManager.DefaultTextLayout.Create;
    try
      TextLayout.BeginUpdate;
      try
        TextLayout.WordWrap := False;
        TextLayout.Opacity := Column.AbsoluteOpacity;
        TextLayout.HorizontalAlign := StringGrid1.TextSettings.HorzAlign;
        TextLayout.VerticalAlign := StringGrid1.TextSettings.VertAlign;
        TextLayout.Trimming := TTextTrimming.Character;
        TextLayout.TopLeft := TextRect.TopLeft;
        TextLayout.Text := Value.ToString;
        TextLayout.MaxSize := PointF(TextRect.Width, TextRect.Height);

        { Пользовательские настройки отрисовки }
        TextLayout.Font.Family := 'Times New Roman';
        TextLayout.Font.Style := [ TFontStyle.fsBold ];
        TextLayout.Font.Size := 14;
        TextLayout.Color := claBlueViolet;
      finally
        TextLayout.EndUpdate;
      end;
      TextLayout.RenderLayout(Canvas);
    finally
      TextLayout.Free;
    end;
  end;
end;
Ссылка на комментарий
  • 0
  • Администраторы

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

 

А еще бывает полезно пользоваться встроенными средствами Delphi для выяснения, где находится декларация того или иного объекта и тд

Refactor -> Find Unit ... (Ctrl+A)
Ссылка на комментарий
  • 0

Ярослав, извиняюсь, но своего опыта в FM не хватает.

Все работает, но есть пара неудобств.

  1. Пропадают линии, разделяющие ячейки (они отражаются у других, а у этой нет). Как бы их добавить, причем те же самые что использует Grid.
  2. Пропадает выделение этой ячейки, щелчок на ячейке ее не выделяет (не подкрашивает как остальные, которые не обрабатывались), а хотелось бы чтобы общий стиль не изменялся при манипуляциях с размером или цветом шрифта.

Заранее спасибо.

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

Добрый день:

 

Пропадающие линии

Надо уменьшить область, куда отрисовывается ячейка:

TextRect.Left := TextRect.Left + 1;
TextRect.Bottom := TextRect.Bottom - 1;
TextRect.Inflate(-HorzTextMargin, -VertTextMargin);
Canvas.FillRect(TextRect, 0, 0, AllCorners, 1);

Выделение

Выделение нужно отрисовать самостоятельно, основываясь на значении аргумента State:

const State: TGridDrawStates

Который содержит указание выделена ли строка, выделена ячейка и в фокусе ячейка или нет.

Используйте этот параметр для отрисовки выделения так, как вам нужно. 

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

Всем доброго времени суток, очень помогла тема и ответы выше. Решил добавить небольшой пример касательно  "Tgriddrawstates" ( Указание выделена ли строка, выделена ячейка и в фокусе ли ячейка или нет ) Может быть полезно новичкам.

procedure TForm4.StringGrid1DrawColumnCell(Sender: TObject;
  const Canvas: TCanvas; const Column: TColumn; const [Ref] Bounds: TRectF;
  const Row: Integer; const [Ref] Value: TValue; const State: TGridDrawStates);
var
   TextLayout : TTextLayout;
   TextRect: TRectF;

begin
  
      if TGridDrawState.RowSelected in State  then 
        Canvas.Fill.Color := TAlphaColors.Blue;
      else  
        Canvas.Fill.Color := TAlphaColors.white;       
end;        

вместе с кодом отрисовки ячейки грида выше можно управлять цветом фона да и чем угодно при например выделении строки.

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

Помогите, У меня есть две таблицы, при клике по ячейки одной, заполняется вторая таблица. После заполнения я хочу закрасить строки в таблице по условию. Как мне вызвать процедуру из примера? Постоянно пишет E2035 Not enough actual parameters.

Ссылка на комментарий
  • 0
5 часов назад, proffkot сказал:

Постоянно пишет E2035 Not enough actual parameters.

Я думаю, надо посмотреть - какие параметры ожидает процедура и дать ей именно их.

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

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

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

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

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

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

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

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

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

×
×
  • Создать...