Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2011年06月11日] [更新 2013年10月24日] Delphi サンプルプログラム集
051_セルの結合と TZColorStringGrid コンポ
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro
ZColorStringGrid Ver: 0.4
051_ZColorStringGridCompo.zip [5,601 KB] 2013年10月24日版 (EXE 同梱)



  • 2013年10月24日
  • ZColorStringGrid コンポのバージョンが Ver 0.4 になっていたので,ダウンロードしてテスト




TZColorStringGrid コンポーネント


Torry's Delphi Pages の ZColorStringGrid にも登録されている,Avemey というサイトが提供している StrigGrid コンポーネント,TZColorStringGrid の簡単な紹介記事です.
[050_TStringGrid とカスタム描画]で 固定セルの結合をテストをしました.固定セルの結合は比較的簡単ですが,データセルはかなり面倒です.
データセルは,選択状態の変化,スクロールした時の描画処理の制御,データ入力時にインプレースエディタも制御しなければなりません.これは,Paint メソッドを override (オーバーライド) して処理しないと無理があると思われます.つまり,コンポーネント化しないと無理があります.
この TZColorStringGrid コンポーネントは,このセルの結合の他にもセルのプロパティ設定の便利な機能があります.ただし,Windows XP 以降のテーマやエアロには対応ししていません.そのようなデザインが必要であればイベント内で描画することになります.
このコンポーネントはフリーウェアです.今回は zcolorstringgrid_bin_0_4.zip をダウンロードしてテストしています.
このコンポーネントでは,結合セル専用のクラスでその情報を管理制御し,Paint メソッドで全ての描画処理を行っています.このコンポーネントは,以下のような特徴があります.
  • セルの文字列のアライメントが横,縦方向共に設計時に設定可能
  • セルの背景色,フォント,枠線の設定が設計時に可能
  • セルの結合と解除がコード上で可能
  • セル幅と行の高さの自動調整が可能
  • 表計算機能がある
  • インプレースエディタの背景色,フォントの色の設定が設計時に可能
  • コンポーネントのソースコードが添付されている(学習やカスタマイズが可能)
Google で検索したところ,ロシア語での紹介記事はありましたが,日本語のサイトは検索リストには出てきませんでした.おそらくこのコンポーネントの紹介記事は,2011年06月09日現在,国内ではこれが初めてかも知れません.

本ページの記事掲載時の,このコンポーネントのバージョンは Ver 0.2 でした.今回は Ver 0.4 となっています.表計算等の機能が追加されたり,セル関係のプロパティも追加されていますが,それらについての説明やサンプルはありません.

TStringGrid にはない機能を補うものとして,上記リンクの Project.JEDI の TJvStringGrid も検討する価値があるのではないかと思います.


図1
コンポーネントのファイル構成
  • [src] にパスを通し,該当するパッケージをインストール
図2
添付のデモプログラムを実行
  • SAMPLES の [Calc] を少し改変
  • 表計算機能がある (100 + 300 = 400)




01_セルの結合と描画のカスタマイズ例


実際の動作テスト用のサンプルです.フォームの OnCreate イベント内で設定を行っていますが,その多くは設計時にオブジェクト・インスペクタで設定可能です.他のサンプルプログラム同様,コードのコピペでもテスト可能なように,OnCreate イベント内で設定しています.
読み込むデータが多い時は,OnShow イベント内で実行する方が,体感的な速度は速くなります.


図3
設計時画面
図4
実行開始画面
  • ファイルからデータを読み込んで表示
図5
指定セルを結合
  • フォーカスの枠線が多少乱れることがあるが Ver 0.2 の時よりも改善されているようである
図6
セルの結合を解除

リスト1
TZColorStringGrid コンポーネントの簡単な使用例
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ZColorStringGrid, StdCtrls, ExtCtrls, Grids;

type
  TForm1 = class(TForm)
    ZColorStringGrid1: TZColorStringGrid;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ZColorStringGrid1BeforeTextDrawCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState);
    procedure ZColorStringGrid1BeforeTextDrawMergeCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState;
      var CellCanvas: TCanvas);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses GraphUtil;

{$R *.dfm}

//=============================================================================
//  各種設定
//  多くは設計時に,オブジェクト・インスペクタで設定できるが,コードをコピペし
//  利用可能とするため,ここに記述
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  AStyle    : TCellStyle;
  AFileName : String;
  SL        : TStringList;
  i         : Integer;
  iRow      : Integer;
begin
  //グラデーションの色設定
  ZColorStringGrid1.GradientStartColor := clWhite;
  ZColorStringGrid1.GradientEndColor   := $00E8E8E8;

  //選択セルの背景色とセル枠線
  ZColorStringGrid1.SelectedColors.BGColor := $00E9E9DA;
  ZColorStringGrid1.LineDesign.LineColor   := clSilver;

  //固定列と固定行数を設定して,その文字列のアライメントを設定
  ZColorStringGrid1.FixedCols := 1;
  ZColorStringGrid1.FixedRows := 2;
  ZColorStringGrid1.DefaultFixedCellStyle.VerticalAlignment   := vaCenter;
  ZColorStringGrid1.DefaultFixedCellStyle.HorizontalAlignment := taCenter;

  ZColorStringGrid1.Options := ZColorStringGrid1.Options + [goEditing];
  ZColorStringGrid1.Options := ZColorStringGrid1.Options + [goThumbTracking];

  //固定行と固定列のセル結合
  ZColorStringGrid1.MergeCells.AddRectXY(0,0,0,1);
  ZColorStringGrid1.MergeCells.AddRectXY(1,0,1,1);
  ZColorStringGrid1.MergeCells.AddRectXY(2,0,3,0);
  ZColorStringGrid1.MergeCells.AddRectXY(4,0,4,1);

  //第1列名(列番号は0)はデータを表示しないので狭い幅に
  ZColorStringGrid1.ColWidths[0] := 20;

  //表示データをファイルから読み込む
  AFileName := ExtractFilePath(Application.ExeName) + 'ATest.txt';
  SL := TStringList.Create;
  try
    SL.LoadFromFile(AFileName);
    //列数と行数設定
    ZColorStringGrid1.ColCount := 5;
    ZColorStringGrid1.RowCount := SL.Count + ZColorStringGrid1.FixedRows;

    for i := 0 to SL.Count - 1 do begin
      iRow := i + ZColorStringGrid1.FixedRows;
      ZColorStringGrid1.Rows[iRow].CommaText := ',' + SL[i];
    end;
  finally
    FreeAndNil(SL);
  end;

  //固定行のテキスト
  ZColorStringGrid1.Cells[1, 0] := '番号';
  ZColorStringGrid1.Cells[2, 0] := '食品';
  ZColorStringGrid1.Cells[2, 1] := '分類';
  ZColorStringGrid1.Cells[3, 1] := '食品名';
  ZColorStringGrid1.Cells[4, 0] := 'キロカロリー';

  //セルのスタイル各種設定
  AStyle := ZColorStringGrid1.DefaultCellStyle;
  AStyle.VerticalAlignment   := vaCenter;
  AStyle.HorizontalAlignment := taLeftJustify;
  AStyle.Font.Color          := clBlack;
  AStyle.Font.Size           := 9;

  ZColorStringGrid1.CellStyleCol[1, False] := AStyle;
  ZColorStringGrid1.CellStyleCol[2, False] := AStyle;
  ZColorStringGrid1.CellStyleCol[3, False] := AStyle;

  AStyle.HorizontalAlignment := taRightJustify;
  ZColorStringGrid1.CellStyleCol[4, False] := AStyle;

  ZColorStringGrid1.SelectedColors.FontColor := clBlack;
end;

//=============================================================================
//  指定セルを結合する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  ZColorStringGrid1.MergeCells.AddRectXY(2,5,3,8);
  ZColorStringGrid1.Invalidate;
end;

//=============================================================================
//  結合したセルの結合を解除する
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  MergCellNo : Integer;
begin
  //結合セルのインデックスを取得
  MergCellNo := ZColorStringGrid1.MergeCells.InMergeRange(2, 5);
  //そのインデックスのセル結合を解除
  ZColorStringGrid1.MergeCells.DeleteItem(MergCellNo);
  ZColorStringGrid1.Invalidate;
end;

//=============================================================================
//  セルの文字列描画前に発生するイベント
//  TZColorStringGridコンポはDrawingStyleはgdsClassicしか有効でないので
//  固定行と列は体裁のため,グラデーションで塗りつぶす
//
//  usesにGraphUtilが必要
//=============================================================================
procedure TForm1.ZColorStringGrid1BeforeTextDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  if gdFixed in State then begin
    //Rectの矩形領域内をグラデーションで塗り潰す
    GradientFillCanvas(ZColorStringGrid1.Canvas,
                       ZColorStringGrid1.GradientStartColor,
                       ZColorStringGrid1.GradientEndColor,
                       Rect,
                       gdVertical);
  end;
end;

//=============================================================================
//  結合セルの文字列描画前に発生するイベント
//  TZColorStringGridコンポはDrawingStyleはgdsClassicしか有効でないので
//  結合した固定行と列も体裁のため,グラデーションで塗りつぶす
//  このイベント内で描画するCanvasは,結合セル専用のCellCanvas
//
//  usesにGraphUtilが必要
//=============================================================================
procedure TForm1.ZColorStringGrid1BeforeTextDrawMergeCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState; var CellCanvas: TCanvas);
begin
  if gdFixed in State then begin
    //Rectの矩形領域内をグラデーションで塗り潰す
    GradientFillCanvas(CellCanvas,
                       ZColorStringGrid1.GradientStartColor,
                       ZColorStringGrid1.GradientEndColor,
                       Rect,
                       gdVertical);
  end;
end;

end.




02_プロパティ


以下は,標準の TStringGrid に追加された,このコンポーネント独自のプロパティの内,コンポーネント全体に関係するプロパティです.


表1
コンポーネント全体に影響するプロパティ
オブジェクト・インスペクタで設定できる

プロパティ 説明
InplaceEditorOptions - インプレースエディタのプロパティ
背景色やフォントの色設定が可能
DefaultCellStyle TCellStyle セルのデフォルトのスタイル設定
DefaultFixedCellStyle TCellStyle 固定セルのデフォルトのスタイル設定
LineDesign TLineDesign グリッド線の設定
[06_グリッド線のプロパティ] 参照
SelectedColors TSelectColor 選択セルの背景色やフォントの設定
[05_選択セルのプロパティ] 参照
SizingHeight Boolean セル高さが文字列高さより低い場合,セル高を自動調整
UseCellSizingHeight が True だと設定は無効
SizingWidth Boolean セル幅が文字列長さより短い場合,セル幅を自動調整
UseCellSizingWidth が True だと設定は無効
UseCellSizingHeight Boolean セルのプロパティの SizingHigth を有効にするか無効にするかの設定
True にすると SizingHeight の設定は無効
UseCellSizingWidth Boolean セルのプロパティの SizingWidth を有効にするか無効にするかの設定
True にすると SizingWidth の設定は無効
UseCellWordWrap Boolean セルのプロパティの CellWordWrap を有効にするか無効にするかの設定
True にすると WordWra pの設定は無効
WordWrap Boolean 全セル内での折り返し表示の設定
UseCellWordWrap が False の場合のみ有効




03_セルの高さを文字フォントに合わせて自動調整


上の表の SizingHeight プロパティのテスト用コードです.
以下のテストでは,設計時にはコンポーネントのデフォルト設定を用いています.関係するプロパティ等は全てコード内で設定しています.ただし,第 1 列目だけは列幅を変更しています.


図7
セル高さの自動調整
  • SizingHeight を True にする

リスト2
SizingHeight の使用例
procedure TForm1.FormShow(Sender: TObject);
begin
  //デフォルトのフォントサイズを大きくしてみる
  ZCGrid1.DefaultCellStyle.Font.Size := 25;

  //セルの高さをフォントサイズに合わせて自動調整
  ZCGrid1.SizingHeight := True;

  //これ以降は各セルへのデータのセット 




04_文字列の長さに合わせてセル幅を自動調整


上の表の SizingWidth プロパティのテスト用コードです.


図8
列幅の自動調整
  • SizingWidth を True にする
  • UseCellWordWrap を False にする
  • 備考:千代田区に秋葉原という町名はない

リスト3
SizingWidth の使用例
procedure TForm1.FormShow(Sender: TObject);
begin
  ZCGrid1.UseCellSizingWidth := False;
  ZCGrid1.SizingWidth        := True;

  //これ以降は各セルへのデータのセット 




05_セル幅に合わせて文字列を自動改行 ( 折り返し表示 )


上の表の WordWrap プロパティのテスト用コードです.


図9
文字列の自動折り返し表示
  • WordWrap を True にする
  • UseCellWordWrap を Falseにする

リスト4
WordWrap の使用例
procedure TForm1.FormShow(Sender: TObject);
begin
  ZCGrid1.UseCellWordWrap := False;
  ZCGrid1.WordWrap        := True;

  //これ以降は各セルへのデータのセット 
end;




06_セルのプロパティ


セルの背景色やフォントのプロパティは,次の表のように,セル単位,列単位あるいは行単位で設定できます.


表2
セルのスタイル設定用プロパティ
セル単位,列単位,行単位で設定できる

プロパティ 説明
CellStyle[ACol, ARow] TCellStyle セルごとに設定する場合
ACol は列番号で Integer 型 (0 が 1 列目)
ARow は行番号で Integer 型 (0 が 1 行目)
CellStyleCol[ACol, FixedRow] TCellStyle 列単位の設定
ACol は列番号で Integer 型 (0 が 1 列目)
FixesRow は Boolea n型
FixedRow を False にすると固定行は対象外
CellStyleRow[ARow, FixedCol] TCellStyle 行単位の設定
ARow は行番号で Integer 型(0 が 1 行目)
FixedCol は Boolean 型
FixedCol を False にすると固定列は対象外


上表のプロパティを設定する際に使用する,各スタイルの値です.これらの値は,セルに文字列を代入する前に設定しないと機能しないものがあります.


表3
セルのスタイルの具体的なプロパティ

プロパティ 説明
BGColor TColor セルの背景色
BorderCellStyle TBorderCellStyle セルのボーダー線の設定で,以下のいずれかの値
sgLowered
sgRaised
sgNone
Font Tfont 文字(テキスト)のフォントプロパティ
HorizontalAlignment TAlignment 文字列 (テキスト) の横方向アライメント
Delphi の TAligment と同じ
SizingHeight Boolean セルの高さが文字の高さより低い場合に自動調整
UseCellSizingHeight が True の場合のみ有効
SizingWidth Boolean セル幅が文字列の長さより短い場合に幅を自動調整
UseCellSizingWidth が True の場合のみ有効
VerticalAlignment TVerticalAlignment 文字列(テキスト)の縦方向のアライメント
以下のいずれかの値
vaTop
vaCenter
vaBottom
WordWrap Boolean 文字列の折り返し表示
UseCellWordWrap が True の場合のみ有効


結合セル (TMergeCells クラス) のプロパティです.
このコンポーネントでは,結合セルは TMergeCells というクラスで管理しています.セルの結合と結合の解除はメソッドで行います.


表4

プロパティ 説明
Count Integer 読み出し専用
現在グリッドに設定されている結合セルの数を取得する
Items[Num] TRect 読み出し専用
NumはInteger 型で,結合セルのインデックス
TRect.Left には左端のセルの列番号が格納される
TRect.Top には上端のセルの行場号が格納される
結合セルのインデックスの最小値は 0


セルのプロパティのテスト用コードです.


図10
列単位でセルの背景色などを変更
  • 結合セルは,左上のセルで指定する

リスト5
セルの背景色などの,列単位での変更例
//=============================================================================
//  セルのプロパティを変更してみる
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  AStyle : TCellStyle;
begin
  //デフォルトのセルスタイルを取得して,一部変更
  AStyle                     := ZCGrid1.DefaultCellStyle;
  AStyle.BGColor             := $00DDEDDA;
  AStyle.Font.Color          := clPurple;
  AStyle.HorizontalAlignment := taCenter;
  AStyle.Font.Style          := AStyle.Font.Style + [fsBold];

  //設定したスタイルを列1に適用.固定セルには適用しない
  ZCGrid1.CellStyleCol[1, False] := AStyle;

  //セル単位の設定
  //MergeCellsメソッドでセルを結合
  //結合セルの場合は,左上のセルで指定する
  ZCGrid1.MergeCells.AddRectXY(3, 3, 4, 4);
  ZCGrid1.CellStyle[3, 3].BGColor := clSilver;
end;


上の表にはありませんが,Ver 0.4 では文字列の回転のプロパティが実装されています.
その動作確認のテストコードです.縦書きフォントで描画するのもいいですが,回転した文字列の描画というのもデザイン的に意味があるかも知れません.



//=============================================================================
//  セルのプロパティを変更してみる  セル内の文字列の回転の例
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  AStyle : TCellStyle;
begin
  //デフォルトのセルスタイルを取得して,一部変更
  AStyle                     := ZCGrid1.DefaultCellStyle;
  AStyle.Font.Name           := 'Tahoma';
  AStyle.Font.Size           := 12;
  AStyle.Rotate              := 90;
  AStyle.Rotate              := 90;
  AStyle.HorizontalAlignment := taCenter;

  //設定したスタイルを列2に適用.固定セルにも適用する
  ZCGrid1.CellStyleCol[2, True] := AStyle;

  //第2列名の幅を変更してみる
  ZCGrid1.ColWidths[2] := 40;
end;




07_選択セルのプロパティ


選択中のセル (TSelectColor クラス)のプロパティです.選択セルの背景色等を設定できます.
これらの値は,オブジェクト・インスペクタの SelectCololrs プロパティで設定できます.


表5

プロパティ 説明
BGColor TColor 選択セルの背景色
ColoredSelect Boolean 選択セルの背景色を塗り潰す場合は True に,
コンポの Color プロパティにする場合は False にする
FontColor TColor 選択セルの文字フォントの色
UseFocusRect Boolean 選択セルのフォーカス線の表示


選択中のセル (TSelectColor クラス) のプロパティのテスト用コードです.


図11
選択セルの背景色を変更

リスト6
選択中のセルの背景色の設定例
procedure TForm1.FormShow(Sender: TObject);
begin
  ZCGrid1.SelectedColors.BGColor       := $00D9FFD9;
  ZCGrid1.SelectedColors.ColoredSelect := True;
  ZCGrid1.SelectedColors.FontColor     := clBlack;
  ZCGrid1.SelectedColors.UseFocusRect  := True;

  //これ以降はセルへのデータのセット
end;




08_グリッド線のプロパティ


グリッド線 (TLineDesign クラス) のプロパティです.オブジェクト・インスペクタの LineDesign プロパティで設定できます.


表6

プロパティ 説明
LineColor TColor グリッド線の色
LineDownColor TColor BorderCellStyle の値が sgLowered か sgRaised の時に有効
枠の暗い方の設定値
LineUpColor TColor BorderCellStyle の値が sgLowered か sgRaised の時に有効
枠の明るい方の設定値


グリッド線 (TLineDesign クラス) のプロパティのテスト用コードです.


図12
グリッド線の色を変更
  • 少し淡い色にしてみた

リスト7
グリッド線の色を変更
procedure TForm1.FormShow(Sender: TObject);
begin
  ZCGrid1.LineDesign.LineColor := $00AED7D7;

  //これ以降は各セルへのデータのセット
end;




09_結合セル関係のメソッド


次の表は,結合セル (TMergeCells クラス) のメソッドです.セルの結合や結合の解除など,結合セルの制御はこれらのメソッド類を使用します.ここで言う結合セルとは,1 つ以上のセルを結合したセルのことを意味しています.結合セルは一意の整数値 (インデックス) で識別します.
結合セルの位置は,エクセルと同じように,結合前の左上のセルの列と行で指定し,そのセルに対してスタイルの設定,文字列の代入などを行います.

このコンポーネントのセルの編集時に使用するエディタは,TInplaceEditor の直接の継承クラスではありません.TMemo が使用されています.つまり,セルに TMemo コンポーネントのインプレースエディタを表示していることになります.したがって,かなりのカスタマイズが可能です.


表7
表中の num は結合セルのインデックスで Integer 型
ACol,ARow は Integer 型で,ACol は列番号,ARow は行番号

結合セルのメソッド 戻り値 説明
AddRect(Rct) Byte Rct は TRect 構造体
Rct.Left に左端の列番号
Rct.Top に上端の行番号
Rct.Right に右端の列番号
Rct.Bottom に下端の行番号を各々指定

戻り値の意味
0. セルの結合に成功
1. 指定セルが範囲外の値
2. 既存の結合セルと範囲がオーバーラップ
3. 追加できなかったセルがある
4. 固定セルとデータセルを結合しようとした
AddRectXY(x1, y1, x2, y2) Byte x1,y1,x2,y2 で指定する列と行範囲のセルを結合
戻り値の意味は AddRec tメソッドと同じ
Clear() - グリッド内の結合セルの結合を全て解除
DeleteItem(num) Boolean num で指定する結合セルの結合を解除
GetHeightArea(num) Integer num で指定する結合セルの高さ (ドット数) を取得
GetWidthArea(num) Integer num で指定する結合セルの幅 (ドット数) を取得
GetSelectedArea(SetSelected) TGridRect SetSelected は Boolean 型
[Shift] + [矢印キー] などで複数のセルを選択した際に,選択セルの範囲を,元の列番号と行番号の値でTGridRect 構造体に返す
SetSelected を True にすると,Selection プロパティにその値をセットする
InLeftTopCorner(ACol, ARow) Integer セル (ACol,ARow) が結合セルエリアの左上のセルであれば,その結合セルのインデックスを返す
そうでない場合は負の値を返す
InMergeRange(ACol, ARow) Integer 結合する前のセル (ACol, ARow) が,結合セルのエリア内にあれば,結合セルのインデックスを返す
結合セルエリアにない場合は負の値を返す


Options プロパティで goRowSelect を追加し,行選択を有効にした場合の,結合セルの動作を確認するための参考コードです.


図13
結合セルの行選択
  • 結合した行数分が選択状態となる

リスト8
結合セルがある場合の goRowSelect プロパティ動作テスト
procedure TForm1.FormShow(Sender: TObject);
begin
  //セルを結合して,OptionsプロパティのメンバにgoRowSelectを追加
  ZCGrid1.MergeCells.AddRectXY(3, 2, 4, 3);
  ZCGrid1.Options := ZCGrid1.Options + [goRowSelect];

  //これ以降は他のセルへのデータのセット




10_イベント


このコンポーネントで追加されているイベントです.結合セルと通常のセルとでは別のイベントとなっています.


表8

イベント 説明
OnBeforeTextDrawCell セルに文字列を描画する前に発生
OnBeforeTextDrawMergeCell 結合セルに文字列を描画する前に発生
OnDrawMergeCell 結合セルの描画の際に発生
標準の TStringGrid の OnDrawCell の結合セル用版


イベントのテスト用コードです.固定セルグラデーションにしてみました.また,グリッド線も淡い灰色にしています.結構体裁がよくなっているのではないかと思われます.


図14
イベントの使用例
  • 固定セルをグラデーションにしてみた

リスト9
OnBeforeTextDrawCell イベントの使用例
標準の TStringGrid の OnDrawCell イベントと違い,この後に文字列の描画コードは必要ない
procedure TForm1.ZCGrid1BeforeTextDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if gdFixed in State then begin
    //Rectの矩形領域内をグラデーションで塗り潰す
    //usesにGraphUtilが必要
    GradientFillCanvas(ZCGrid1.Canvas,
                       ZCGrid1.GradientStartColor,
                       ZCGrid1.GradientEndColor,
                       Rect,
                       gdVertical);
  end;
end;




11_コンポーネントをインストールしないでテスト


[派生元のコンポーネントと交換する方法] で説明しているユニットを使用すると,このコンポーネントをインストールしないでテストできます.
当然ですが,このコンポーネントで追加されたプロパティやイベントは,オブジェクト・インスペクタでは設定できません.


図15
設計時画面
  • Delphi 標準の TStringGrid を配置
図16
実行結果

リスト10
コンポーネントをインストールしないでテストするためのコード
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Grids, ZColorStringGrid, StdCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    ZCGrid1 : TZColorStringGrid;
    procedure ZColorStringGrid1BeforeTextDrawCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState);
    procedure ZColorStringGrid1BeforeTextDrawMergeCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState;
      var CellCanvas: TCanvas);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses  plChgCompo, GraphUtil;

{$R *.dfm}

//=============================================================================
//  フォーム作成時にコンポーネントの入れ換え
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  //フォーム作成時にコンポーネントの機能を入れ替え
  ZCGrid1 := TZColorStringGrid(ChangeComponent(StringGrid1, TZColorStringGrid));

  //標準のStringGridにないイベントは再定義が必要
  ZCGrid1.OnBeforeTextDrawCell      := ZColorStringGrid1BeforeTextDrawCell;
  ZCGrid1.OnBeforeTextDrawMergeCell := ZColorStringGrid1BeforeTextDrawMergeCell;
end;

//=============================================================================
//  ZColorStringGridのテスト用初期設定とデータのセット
//=============================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
  ZCGrid1.UseCellSizingWidth := False;
  ZCGrid1.SizingWidth        := True;

  //テスト用の値をセット(タイトル行)
  ZCGrid1.Cells[1,0] := '調査番号';
  ZCGrid1.Cells[2,0] := '都道府県';
  ZCGrid1.Cells[3,0] := '予想値';
  ZCGrid1.Cells[4,0] := '結果値';

  //テスト用の値をセット
  ZCGrid1.Cells[1,1] := 'A-100';
  ZCGrid1.Cells[1,2] := 'A-200';
  ZCGrid1.Cells[1,3] := 'A-300';
  ZCGrid1.Cells[1,4] := 'A-400';

  ZCGrid1.Cells[2,1] := '東京都' + sLineBreak + '千代田区秋葉原5丁目';
  ZCGrid1.Cells[2,2] := '大阪府';
  ZCGrid1.Cells[2,3] := '京都府';
  ZCGrid1.Cells[2,4] := '長野県';

  ZCGrid1.Cells[3,1] := '5000';
  ZCGrid1.Cells[3,2] := '8000';
  ZCGrid1.Cells[3,3] := '3000';
  ZCGrid1.Cells[3,4] := '2000';

  ZCGrid1.Cells[4,1] := '5500';
  ZCGrid1.Cells[4,2] := '8300';
  ZCGrid1.Cells[4,3] := '3100';
  ZCGrid1.Cells[4,4] := '3000';

  ZCGrid1.ColWidths[0] := 20;
end;

//=============================================================================
//  セルの文字列描画前に発生するイベント
//=============================================================================
procedure TForm1.ZColorStringGrid1BeforeTextDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
//
end;

//=============================================================================
//  結合セルの文字列描画前に発生するイベント
//=============================================================================
procedure TForm1.ZColorStringGrid1BeforeTextDrawMergeCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState; var CellCanvas: TCanvas);
begin
//
end;

end.