0

実行時に XE4 FM Stringgrid にスタイルを適用しようとしていますが、これを行うための正しい構文が見つかりません。

StringGrid は、設計時に作成した 'TextCellStyle' (デフォルト) を既に継承しており、このスタイルに従って stringgrid 内のセルを表示します。

私が理想的にしたいのは、実行時に特定のセルのフォントの色 (負 = 赤、正 = 緑など) を変更することですが、セル レベルで Stylelookup にアクセスできないため、これを行う方法がわかりません。 .

このクエリは、TGrid ではなく TStringGrid に関連していることに注意してください。アプリケーションでは、実行時にグリッドにメモリを動的に割り当てる必要があり、stringgrid を使用する方がはるかに簡単です。

どんな助けでも大歓迎です、そして前もって感謝します。

4

1 に答える 1

0

私は TGrid でこれを行う方法を学ぼうとしてきましたが、Mike Sutton の助けのおかげでこれを管理できました。

[背景については、ランタイム XE4 で TTextCellの背景色を変更するを参照してください。]

これを正しく行うことができたので、TStringGrid で同様のロジックを試みたところ、うまくいきました。stringgrid は Grid1GetValue を使用しないため、FormCreate のグリッドに乱数をハードコードするだけです。

[以下のコードには、textcellstyle というスタイルがあります。textcellstyle の「背景」コンポーネントに TRectangle を追加したので、TRectangle の「Fill」プロパティを呼び出すことができました。まだスタイルのトップではありません。上記のリンクを参照してください。]

参考になる場合に備えて、私のコード:

    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;

このコードは、フォントと背景のスタイル変更に関して機能します。上記を改善するための提案は大歓迎ですが、これが役立つことを願っています。

ただし、スクロールを開始するとすぐにスタイリングが崩れますが、それを修正する方法はまだわかりません. どんな提案でも大歓迎です!

于 2013-05-17T14:12:19.623 に答える