Перейти к содержанию
  • Регистрация
  • 0
CrazyUser

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

Вопрос

 в 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

[DCC Error] TabbedTemplate.pas(738): E2003 Undeclared identifier: 'TTextLayout'

[DCC Error] TabbedTemplate.pas(747): E2003 Undeclared identifier: 'TTextLayoutManager'

[DCC Error] TabbedTemplate.pas(747): E2066 Missing operator or semicolon

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Добрый день.

 

У меня подобная "проблема"

 

А можно показать пример самостоятельного отрисовывания выделения ячейки

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ребята, вы чё, это же все есть в исходниках Embarcadero

Открываете модуль с контролом, и ищите его метод "что-то-там-Paint-что-то-там"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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 эмодзи.

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

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

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


  • Похожий контент

    • От Алиса Романец
      Доброго времени суток всем!
      В VCL была возможность скрыть полосы прокрутки на TStringGrid. Оно не отключало скролл, но оно позволяло спокойно сделать таблицу с n-ым количеством колонок одинаковой ширины без появления горизонтальной полосы проркрутки. Есть ли что-то подобное в FireMonkey, а в особенности отключение не всех сразу, а лишь одной (горизонтальной) полосы прокрутки?
    • От Sashar333
      Здравствуйте!
      Помогите разобраться пожалуйста.
      Delphi 10.1 и 10.2, Windows
      Программа прекрасно работала и программировалась.
      Добавил две колонки в StringGrid:

      сразу понял что не красиво и попытался их удалить(ничего в программе больше не менял и не добавлял!?) таким образом:

      но после нажатии кнопки "Delete" получил сообщение:

      дальше программировать, данный проект, нет возможности из таких сообщений и дальнейших разрушительных сбоев
      при новой загрузке проекта в DELPHI все работает и запускается, Project1.exe из Debug'а тоже работает.
      Но стоит только в DELPHI попытать что то сделать(бывает достаточно навести курсор мыши) с именно этим StringGrid то сразу выдает ошибки:


      помогает полное удаление StringGrid но так как 
      это не в первый раз и в разных версиях это сильно напрягает
      переустановки delphi не помогают
      может кто знает в чем дело?
      Заранее спасибо за ответ...
    • От Павел Караваев
      Добрый вечер, форумчане! Возможно ли менять ширину разделительных линий в StringGrid'е, гугол мне с этим не помог. Мне необходимо каждую пятую вертикальную и каждую пятую горизонтальную линию чуть шире остальных.(Delphi 10.2, Windows)
    • От Павел Караваев
      Люди добрые, помогите) Я не понимаю, как закрасить ячейки в зависимости от информации в данной ячейке. Если в ячейке 1, то нужно покрасить белым, если 0, то чёрным. Имеющиеся на форуме ответы не помогают, ячейки не красятся=(
    • От Sashar333
      Здравствуйте! Delphi 10.1 Berlin, android 6
      Есть СomboBox, в нем выбираю фильтр для вывода в StringGrid списка из файла базы.
      При выборе в ComboBox "ВСЕ" - StringGrid заполняется большим! списком, который соответственно можно прокручивать по инерции
      Есть выбор "1" в ComboBox, при котором StringGrid заполняется всего несколькими записями, которые умещаются в пол экрана(которые не прокручиваются)
      Момент такой: Если StringGrid прокручивается по инерции(с выбором "ВСЕ"), а в этот момент выбрать выбор "1"  то  приложение вылетает (на android)
      Я так понял это из-за того что Stringу нечего прокручивать!?
      Подскажите пожалуйста решение этой проблемы . Заранее спасибо!
    • От Mazzay
      Есть хоть какая-нибудь возможность зафиксировать первый столбец, чтобы он не прокручивался?
      То есть нужен аналог свойства FixedCols из VCL,
    • От Martifan
      доброго времени сутки
      я хочу установить свой шрифт в приложение, пробовал так http://community.embarcadero.com/index.php/blogs/entry/true-type-font-iconography-for-android-and-ios-apps вроде все получается но есть одна проблема
      после того как устанавливаешь свои шрифт невозможно указать стиль то есть я указываю чтобы текст был жирным но в прилажение все равно показывает нормальным без стиля в чем проблема кто знает?
      Заранее спасибо
    • От enatechno
      Откомпилировав тестовый проект в Berlin для Android (4.3, 5.1), обнаружил, что событие OnSelectCell стало "нестабильным". Т.е. если я делаю Tap по ячейкам StringGrid, то OnTap отрабатывает всегда, а OnSelectCell - не всегда.
      К тому же иногда нарушается последовательность вызова событий.
      Последовательность обработки событий в Android была такой (в Seattle и более ранних версиях):
      1). OnTap; 
      2). OnSelectCell.
      Как лечить?

       
       
      test_SelectCell.rar
    • От CodeToad
      Здравствуйте!  вопрос к знающим. Правильна ли практика применения заполнения сетки в зависимости от выбора в родительском списке(не parent!!)
      StrGrd.RowCount:=0;
       while not(Тquery.Eof) do
            begin
      StrGrd.RowCount:=StrGrd.RowCount:+1
      ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
        query.Next;
            end;
      Для  FMX8 при запросе возвращающем 1 строку вызывает exeption.  Разобрался из-за чего, но по правилам
      Запрещено публиковать найденные ошибки .
      Но может так не правильно очищать сетку для последующего заполнения может  это  wrong way?
    • От Morfi
      Подскажите как реализовать в TStringGrid заголовок с вертикальным текстом? Например: 

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

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

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