可以这样实现,dbgrideh1增加一列作为第一列,它不指向任何字段然后在dbgrideh1的自画时画上就可以了,用一个全局的List来记录当前选中的行,我这里用记录号,实际使用时你可以用其它主键就可以了.var Form1: TForm1; FList: TStrings; //用来记住哪些行是选中了implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);begin FList:= TStringList.Create;end;procedure TForm1.FormDestroy(Sender: TObject);begin FList.Free;end;procedure TForm1.DBGridEh1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var k: integer; s: string;begin //这里用记录号只是为了测试,实际使用时应该用唯一的主键字段值, if DBGridEh1.SelectedIndex <> 0 then exit; s:= IntToStr(DBGridEh1.DataSource.DataSet.RecNo); k:= FList.IndexOf(s); if k>=0 then FList.Delete(k) else FList.Add(s);end;procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumnEh; State: TGridDrawState);var k: integer; s: string;begin if Column.Index <> 0 then exit; with DBGridEh1 do begin Canvas.FillRect(Rect); s:= IntToStr(DataSource.DataSet.RecNo); if FList.IndexOf(s)>=0 then //选中了就自已画上一个打勾的图标 Canvas.StretchDraw(Rect, image1.Picture.Bitmap) end;end;