Хотелось бы сделать столбец с CheckBox'ами, не связанными с БД.
Работает как описано здесь 
http://wiki.freepascal.org/Grids_Reference_Page/ru    "Selecting Records in a DBGrid using checkboxes"
через RBookmarklist. Но при сортировке сбивается отображение CheckBox'ов.
в этом месте что-то пошло не так
procedure TForm1.DBGrid1UserCheckboxState(sender: TObject; column: TColumn; var AState: TCheckboxState);
begin
  if RecList.CurrentRowSelected then
    AState := cbChecked
  else
    AState := cbUnchecked;
end;
Может быть есть другой способ?
Использую с zeos TZQuery, TZConnection, firebird.
Добавлено спустя 4 часа 49 минут 16 секунд:Переделал как-то так (может есть более изящный способ?):
Добавить RxMemoryData
TZQuery столбец с FieldKind=Calculated
ZQuery событие OnCalcFields:
procedure TForm1.ZQuery1CalcFields(DataSet: TDataSet);    
var
id:integer;
begin
id:=dataset.FieldByName('ID').AsInteger;
if RxMemoryData1.Active then
if RxMemoryData1.Locate('ID',id,[])
then dataset.FieldByName('Checked').AsBoolean:=  RxMemoryData1.FieldByName('Checked').AsBoolean
else dataset.FieldByName('Checked').AsBoolean:=false;  
end;
RXDBgrid событие OnCellClick:
if Column.Title.Caption='Выбор' then     begin
  with rxdbgrid1.DataSource do     begin
    if    RxMemoryData1.Locate('ID',dataset.FieldByName('ID').AsInteger,[]) then
    begin
      RxMemoryData1.Edit;
      RxMemoryData1.FieldByName('Checked').AsBoolean:=dataset.FieldByName('Checked').AsBoolean;
    end else
      RxMemoryData1.AppendRecord(   [dataset.FieldByName('ID').AsInteger,
     dataset.FieldByName('Checked').AsBoolean] );
  end;
end;
соответственно в БД и RxMemoryData колонки ID integer, Checked boolean