2

stringgrid を使用するプロジェクトに delphi 2010 を使用しています。グリッドのいくつかの列を右揃えにしたい。defaultdrawing を false に設定してこれを行う方法を理解しています。

ただし、可能であれば、グリッドのランタイム テーマ シェーディングを維持したいと考えています。defaultdrawing を有効にして列を右揃えにする方法、または少なくとも onDrawCell イベントのコードを複製してランタイム テーマのシェーディングを模倣する方法はありますか?

4

1 に答える 1

7

インターポーザークラスを使用してDrawCellメソッドをオーバーライドできます。このサンプルを確認してください

type
  TStringGrid = class(Grids.TStringGrid)
   protected
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
  end;    

  TForm79 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
  private
  end;

var
  Form79: TForm79;

implementation

{$R *.dfm}

{ TStringGrid }

procedure TStringGrid.DrawCell(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState);
var
  s : string;
  LDelta : integer;
begin
  if (ACol=1) and (ARow>0) then
  begin
    s     := Cells[ACol, ARow];
    LDelta := ColWidths[ACol] - Canvas.TextWidth(s);
    Canvas.TextRect(ARect, ARect.Left+LDelta, ARect.Top+2, s);
  end
  else
  Canvas.TextRect(ARect, ARect.Left+2, ARect.Top+2, Cells[ACol, ARow]);
end;

procedure TForm79.FormCreate(Sender: TObject);
begin
  StringGrid1.Cells[0,0]:='title 1';
  StringGrid1.Cells[1,0]:='title 2';
  StringGrid1.Cells[2,0]:='title 3';

  StringGrid1.Cells[0,1]:='normal text';
  StringGrid1.Cells[1,1]:='right text';
  StringGrid1.Cells[2,1]:='normal text';
end;

そしてその結果

ここに画像の説明を入力してください

于 2012-04-07T03:15:52.487 に答える