2012/03/20

使StringGrid中的一列具有Check功能,和CheckBox效果一樣

從CSDN上找到的,感覺還不錯
來源:在StringGrid控件的单元格中动态插入CheckBox?


{//***********************************

  使StringGrid中的一列具有Check功能,和CheckBox效果一樣

//***********************************}

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    grid: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure gridDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure gridClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  fcheck, fnocheck: tbitmap;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  bmp: TBitmap;
begin
  FCheck := TBitmap.Create;
  FNoCheck := TBitmap.Create;
  bmp := TBitmap.create;
  try
    bmp.handle := LoadBitmap(0, PChar(OBM_CHECKBOXES));
    with FNoCheck do
    begin
      width := bmp.width div 4;
      height := bmp.height div 3;
      canvas.copyrect(canvas.cliprect, bmp.canvas, canvas.cliprect);
    end;
    with FCheck do
    begin
      width := bmp.width div 4;
      height := bmp.height div 3;
      canvas.copyrect(
        canvas.cliprect,
        bmp.canvas,
        rect(width, 0, 2 * width, height));
    end;
  finally
    bmp.free
  end;

end;

procedure TForm1.gridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if not (gdFixed in State) then
    with TStringGrid(Sender).Canvas do
    begin
      brush.Color := clWindow;
      FillRect(Rect);
      if Grid.Cells[ACol, ARow] = 'yes ' then
        Draw((rect.right + rect.left - FCheck.width) div 2,
          (rect.bottom + rect.top - FCheck.height) div 2,
          FCheck)
      else
        Draw((rect.right + rect.left - FCheck.width) div 2,
          (rect.bottom + rect.top - FCheck.height) div 2,
          FNoCheck);
    end;

end;

procedure TForm1.gridClick(Sender: TObject);
begin
  if grid.Cells[grid.col, grid.row] = 'yes ' then
    grid.Cells[grid.col, grid.row] := 'no '
  else
    grid.Cells[grid.col, grid.row] := 'yes ';
end;

end.

沒有留言:

張貼留言