Nano Hash - криптовалюты, майнинг, программирование

Пользовательский заголовок FMX для TStringGrid

Я использую этот код для установки заголовков столбцов для моего TStringGrid (FMX - 10.4.1)

procedure TForm1.StringGrid1ApplyStyleLookup(Sender: TObject);
var
  Header: THeader;
  HeaderItem: THeaderItem;
  I: Integer;
begin
  Header:= THeader((Sender as TStringGrid).FindStyleResource('header'));
  if Assigned(Header) then
    begin
      for I := 0 to pred(Header.Count) do
        begin
          HeaderItem:= Header.Items[I];
          HeaderItem.StyledSettings := HeaderItem.StyledSettings - [TStyledSetting.Size, TStyledSetting.FontColor];
          HeaderItem.Font.Size := 20;
          HeaderItem.FontColor:= TAlphaColors.Blue;
          HeaderItem.TextSettings.HorzAlign := TTextAlign.Center;
          HeaderItem.TextSettings.VertAlign := TTextAlign.Center;
      end;
      Header.Height := 28;
  end;
end;

Я получаю этот результат, как и ожидалось

введите здесь описание изображения

Однако, если я обновляю список некоторыми новыми данными, заголовок возвращается к стилю по умолчанию.

введите здесь описание изображения

Почему сейчас по-другому? Почему ApplyStyleLookup применяется только один раз?

Как я могу убедиться, что правильные настройки будут применяться к моим заголовкам каждый раз? Спасибо

Здесь ниже пример кода

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 400
  ClientWidth = 600
  Position = DesktopCenter
  FormFactor.Width = 320
  FormFactor.Height = 480
  FormFactor.Devices = [Desktop]
  DesignerMasterStyle = 0
  object StringGrid1: TStringGrid
    Align = Client
    CanFocus = True
    ClipChildren = True
    Margins.Left = 5.000000000000000000
    Margins.Top = 50.000000000000000000
    Margins.Right = 5.000000000000000000
    Margins.Bottom = 5.000000000000000000
    Size.Width = 590.000000000000000000
    Size.Height = 345.000000000000000000
    Size.PlatformDefault = False
    StyleLookup = 'gridstyle'
    TabOrder = 0
    RowCount = 0
    Options = [ColumnResize, ColLines, RowLines, RowSelect, Tabs, Header]
    OnApplyStyleLookup = StringGrid1ApplyStyleLookup
    Viewport.Width = 586.000000000000000000
    Viewport.Height = 320.000000000000000000
    object StringColumn1: TStringColumn
      Header = 'Test'
    end
  end
  object Button1: TButton
    Position.X = 8.000000000000000000
    Position.Y = 8.000000000000000000
    Size.Width = 177.000000000000000000
    Size.Height = 33.000000000000000000
    Size.PlatformDefault = False
    TabOrder = 1
    Text = 'Show Form Properties'
    OnClick = Button1Click
  end
  object Text1: TText
    Anchors = [akLeft, akTop, akRight]
    Position.X = 192.000000000000000000
    Position.Y = 8.000000000000000000
    Size.Width = 401.000000000000000000
    Size.Height = 33.000000000000000000
    Size.PlatformDefault = False
    Text = 'Unkown'
    TextSettings.HorzAlign = Trailing
  end
end


unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  System.Rtti, System.TypInfo,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Grid.Style,
  FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Grid, FMX.Header,
  FMX.Objects;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Text1: TText;
    StringColumn1: TStringColumn;
    procedure Button1Click(Sender: TObject);
    procedure StringGrid1ApplyStyleLookup(Sender: TObject);
  private
    { Private declarations }
    FCount: cardinal;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation


{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
var
  PropList: PPropList;
  PropCount, PropIndex: Integer;
begin
  StringGrid1.ClearColumns;

  PropCount:= GetPropList(Form1, PropList);
  StringGrid1.RowCount:= PropCount;
  StringGrid1.RowHeight:= 20;

  StringGrid1.AddObject(TStringColumn.Create(StringGrid1));
  StringGrid1.Columns[0].Width:= (StringGrid1.Width - 24) / 2;
  StringGrid1.Columns[0].HorzAlign:= TTextAlign.Leading;
  StringGrid1.Columns[0].Header:= 'Property';

  StringGrid1.AddObject(TStringColumn.Create(StringGrid1));
  StringGrid1.Columns[1].Width:= (StringGrid1.Width - 24) / 2;
  StringGrid1.Columns[1].HorzAlign:= TTextAlign.Leading;
  StringGrid1.Columns[1].Header:= 'Value';

  for PropIndex:= 0 to pred(PropCount) do
    begin
      StringGrid1.Cells[0, PropIndex]:= PropList[PropIndex].Name;
      StringGrid1.Cells[1, PropIndex]:= GetPropValue(Form1, PropList[PropIndex].Name, true);
  end;
end;

procedure TForm1.StringGrid1ApplyStyleLookup(Sender: TObject);
var
  Header: THeader;
  HeaderItem: THeaderItem;
  I: Integer;
begin
  inc(FCount);
  Text1.Text:= Format('Executed [%.3d]', [FCount]);

  Header:= THeader((Sender as TStringGrid).FindStyleResource('header'));
  if Assigned(Header) then
    begin
      for I := 0 to pred(Header.Count) do
        begin
          HeaderItem:= Header.Items[I];
          HeaderItem.StyledSettings := HeaderItem.StyledSettings - [TStyledSetting.Size, TStyledSetting.FontColor];
          HeaderItem.Font.Size := 20;
          HeaderItem.FontColor:= TAlphaColors.Blue;
          HeaderItem.TextSettings.HorzAlign := TTextAlign.Center;
          HeaderItem.TextSettings.VertAlign := TTextAlign.Center;
      end;
      Header.Height := 28;
  end;
end;

end.

  • Спасибо. Я собираюсь создать короткий пример. Пожалуйста, дайте мне немного времени. Ваше здоровье 28.12.2020

Ответы:


1

Не могу ответить почему вопросы, иначе как по замыслу.

Но для решения вашей проблемы звоните

StringGrid1.NeedStyleLookup;

после того, как вы внесли свои изменения в структуру (количество столбцов/строк) сетки.

28.12.2020
  • Спасибо, Том. Будьте в безопасности и почти счастливы в Новом году 29.12.2020
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..