没必要动态插入吧?你加入一个CheckBox。visible = false;
需要用的时候显示出来。不用的时候隐藏就好了。
显示之前获得Cell的Rect。改变一下CheckBox的位置。

解决方案 »

  1.   

    参考以下程序:1.//在StringGrid: SpaceGrid中指定的Col, Row嵌入一个ComboBox: SpacingCombo 
    var 
    Rect: TRect; 
    Pnt: TPoint; 
    begin 
    with SpaceGrid do 
    begin 
    Rect := CellRect(Col, Row); 
    with Rect do 
    begin 
    Pnt := SpacingCombo.Parent.ScreenToClient((SpaceGrid.ClientToScreen(Point(Left, Top)))); 
    SpacingCombo.SetBounds(Pnt.X, Pnt.Y, Right - Left, Bottom - Top); 
    SpacingCombo.Show; 
    end; 
    end; 
      

  2.   

    //***********************************使StringGrid中的一列具有Check功能,和CheckBox效果一样//***********************************unit Unit1;interfaceuses
      Windows, Messages, SysUtils, 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
      i:SmallInt;
      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.