2

お金のセルをグリッド上に配置して、現地通貨記号を表示し、右揃えにし、負の数値を赤で表示する必要があります。

同様の投稿とは異なり、livebindings を使用してデータセットから TGrid を設定しています。他の解決策は、グリッドの TStringCell から「TFinancialCell」をサブクラス化することを提案していますが、これは livebindings を使用する場合には困難です。

Livebindings では、Bind Manager がグリッドの列とセルの作成を制御するため、Bind Manager (およびその他の関連クラス) をサブクラス化することはおそらく実用的でもエレガントでもありません。

4

1 に答える 1

3

これをもう少しいじって、私の問題に答える解決策を見つけました

通貨記号は、データセット フィールドの OnGetText イベントを使用して取得し、書式設定された文字列を返します。

procedure FDTableMyCurrFieldGetText(Sender: TField; var Text: string;
  DisplayText: Boolean);
begin
  DisplayText := True;
  Text := FloatToStrF(Sender.AsCurrency, ffCurrency, 18, 2);
end;

Grid OnPainting イベントでこれを行うこともできましたが、この方法で行うと、リンクされたすべてのコントロールとグリッドのフィールドがフォーマットされます。「FDTableMyCurrField」ではなく「Sender」を使用してフィールドを参照し、データセット内の他のすべての通貨フィールドの OnGetText イベントをこのメソッドにポイントできるようにします。

残りの書式設定はグリッドで行われます。グリッドのセルは明示的に公開されていませんが、「TTextCell(Grid1.Columns[I].Children[J])」のように取得できます。Grid OnPaintingイベントを使用して、セルが描画される直前にセルをフォーマットします。

右揃えは、グリッド内のセルの配置を設定することによって実現されます。

セルのテキストの色は、スタイルを使用して設定されます。アプリケーション StyleBook で「textcellnegativestyle」を作成する必要があります。これは、「前景」ブラシの色が赤であることを除いて、デフォルトの「textcellstyle」と同じです。デスクトップ アプリケーションでは、アプリケーションに TEdit をドロップし、それを右クリックして [カスタム スタイルの編集...] を選択し、「editstyle」に基づいてカスタム スタイルに「textcellnegativestyle」という名前を付けますが、フォアグラウンド ブラシの色を赤に変更するだけです。 .

私は、この理由により、「カスタム スタイルの編集」が Delphi フォーム エディタのポップアップ メニュー オプションに表示されないモバイル アプリです。カスタム スタイルを追加するには、メモ帳またはテキスト エディタで .style ファイル (のコピー) を編集する必要があります。

  1. 「textcellstyle」オブジェクトをコピーして貼り付けます
  2. 貼り付けたオブジェクトの名前を「textcellnegativestyle」に編集します
  3. 「前景」ブラシの色を赤に変更します。
  4. 編集したファイルをアプリケーション StyleBook に読み込みます。

これが私の .style ファイルでどのように見えるかです:

  object TLayout
    StyleName = 'textcellnegativestyle'
    DesignVisible = False
    Height = 50.000000000000000000
    Width = 50.000000000000000000
    object TLayout
      StyleName = 'content'
      Align = alContents
      Locked = True
      Height = 42.000000000000000000
      Margins.Left = 4.000000000000000000
      Margins.Top = 4.000000000000000000
      Margins.Right = 4.000000000000000000
      Margins.Bottom = 4.000000000000000000
      Width = 42.000000000000000000
    end
    object TBrushObject
      StyleName = 'foreground'
      Brush.Color = claRed
    end
    object TBrushObject
      StyleName = 'selection'
      Brush.Color = x7F72B6E6
    end
    object TFontObject
      StyleName = 'font'
    end
  end

Grid OnPainting イベントを使用して、セルの配置とスタイルを設定します。ここに私の実用的なソリューションがあります:

procedure TFormMain.Grid1Painting(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
var
  I, J: Integer;
  T: TTextCell;
begin
  // my Column 0 is text, all other columns are money in this example
  for I := 1 to Grid1.ColumnCount - 1 do
    for J := 0 to Grid1.Columns[I].ChildrenCount- 1 do
    begin
      T := TTextCell(Grid1.Columns[I].Children[J]);
      // set the Cell text alignment to right align
      T.TextAlign := TTextAlign.taTrailing;

      // test the Cell string for a negative value
      if (T.Text[1] = '-') then
      begin
        // remove the leading minus sign
        T.Text := Copy(T.Text, 2, Length(T.Text) - 1);
        // set the font to red using the style
        T.StyleLookup := 'textcellnegativestyle';
      end
      else T.StyleLookup := 'textcellstyle';
    end;
end;
于 2013-11-05T08:16:10.957 に答える