Применение стиля к ячейке Delphi XE4 Firemonkey StringGrid во время выполнения

Я пытаюсь применить стиль к XE4 FM Stringgrid во время выполнения, но не могу найти правильный синтаксис для этого.

StringGrid уже наследует TextCellStyle (по умолчанию), который я создал во время разработки, и отображает ячейки в сетке строк в соответствии с этим стилем.

В идеале я хотел бы изменить цвет шрифтов в определенных ячейках (отрицательный = красный, положительный = зеленый и т. Д.) Во время выполнения, но не могу понять, как это сделать, поскольку я не могу получить доступ к Stylelookup на уровне ячеек,

Пожалуйста, помните, что этот запрос относится к TStringGrid, а не к TGrid, поскольку наше приложение требует, чтобы мы динамически выделяли память для сетки во время выполнения, и это гораздо проще сделать со строкой сетки.

Любая помощь будет очень признательна, и спасибо заранее.

1 ответ

Я пытался научиться делать это с TGrid, и благодаря помощи Майка Саттона это удалось.

[См. Изменение цвета фона TTextCell во время выполнения XE4 для фона.]

Добившись этого, я попытался применить аналогичную логику к TStringGrid, и она работала нормально. Поскольку stringgrid не использует Grid1GetValue, я просто жестко запрограммировал случайные числа в сетке в FormCreate.

[В приведенном ниже коде у меня есть стиль, называемый textcellstyle; к компоненту 'background' textcellstyle я добавил TRectangle, чтобы я мог вызвать свойство 'Fill' TRectangle. Все еще не в курсе стилей, см. Ссылку выше.]

Мой код, в случае, если это полезно:

    Procedure TForm1.FormCreate(Sender : TObject);

    begin
      { CREATE AN EXTRA COLUMN }
      StringGrid1.AddObject(TFinancialColumn.CreateStringGrid1));  
      { HARD-CODE THE ROWS }
      StringGrid1.Cells[0,0] :='0';
      StringGrid1.Cells[0,1] :='1';
      StringGrid1.Cells[0,2] :='2';
      StringGrid1.Cells[0,3] :='3';
      StringGrid1.Cells[0,4] :='4';
      StringGrid1.Cells[0,5] :='5';
      StringGrid1.Cells[0,6] :='6';
      StringGrid1.Cells[0,7] :='7';
      StringGrid1.Cells[0,8] :='8';
      StringGrid1.Cells[0,9] :='9';
      StringGrid1.Cells[0,10]:='10';
      { HARD-CODE A BUNCH OF NUMBERS. NOTE THAT HASH IN FRONT OF A NUMBER IS SIMPLY A  FLAG FOR IsImportant }
      StringGrid1.Cells[1,0] :='-10';
      StringGrid1.Cells[1,1] :='-6.86999999';
      StringGrid1.Cells[1,2] :='76.0999999';
      StringGrid1.Cells[1,3] :='#10.25';        
      StringGrid1.Cells[1,4] :='#17.2900006';
      StringGrid1.Cells[1,5] :='#57.1599993';
      StringGrid1.Cells[1,6] :='21.86000';
      StringGrid1.Cells[1,7] :='6.17';
      StringGrid1.Cells[1,8] :='27.219999';
      StringGrid1.Cells[1,9] :='#32.56000';
      StringGrid1.Cells[1,10]:='-1.7999';
    end;


    Function TFinancialColumn.CreateCellControl : TStyledControl;

    begin
      Result:=TFinancialCell.Create(Self);

      TTextCell(Result).OnTyping:=DoTextChanged;
      TTextCell(Result).OnExit  :=DoTextExit;
    end;

    Constructor TFinancialCell.Create(AOwner : TComponent);

    begin
      inherited;
      StyleLookup:='textcellstyle';
      StyledSettings:=StyledSettings-[TStyledSetting.ssStyle,TStyledSetting.ssFontColor]; { THIS LINE MUST BE HERE TO APPLY A NEW STYLE; IT CLEARS THE 'DEFAULT' STYLE SETTINGS }
      TextAlign:=TTextAlign.taTrailing;
    end;

    Procedure TFinancialCell.SetData(const Value          : TValue);

    var 
      F                                                   : Single;
      O                                                   : TFMXObject;
      S                                                   : String;

    begin
      S:=Value.AsString;

      If Length(S)>1 then 
      begin 
        FIsImportant:=S[1]='#';
        If IsImportant then
          S:=Copy(Value.AsString,2,MaxInt)
        else
          S:=Value.AsString;

        F:=StrToFloat(S);
        inherited SetData(Format('%n',[F]));
        FIsNegative:=F<0;

        ApplyStyling;
      end;  
    end;

    Procedure TFinancialCell.ApplyStyle;

    var 
      T                                                   : TFMXObject;

    begin
      inherited;

      T:=FindStyleResource('rectangle1');

      If T is TRectangle then
      begin 
        If IsNegative then 
        begin
          TRectangle(T).Fill.Color:=claRed; 
        end;  
      end;

      ApplyStyling;
    end;

    Procedure TFinancialCell.ApplyStyling;

    var 
      T                                                   : TFMXObject;

    begin
      If IsNegative then
        FontColor:=claBlack
      else
        FontColor:=claGreen;

      If IsImportant then Font.Style:=[TFontStyle.fsItalic,TFontStyle.fsBold]; { REPEAT THE ITALIC ELSE IT WILL ONLY BE BOLD, IE IT OVERWRITES THE ITALIC WITH BOLD }

      If Assigned(Font.OnChanged) then
        Font.OnChanged(Font);

      Repaint;
    end;

Этот код работает с точки зрения рестайлинга шрифтов и фона. Любые предложения по улучшению вышесказанного приветствуются, но, надеюсь, это поможет.

Тем не менее, стилизация разваливается, как только вы начинаете прокручивать, но еще не выяснили, как это исправить. Любое предложение будет приветствоваться!

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