Решил одну задачку, думаю другим не помешает
Иногда надо , чтоб в DBGrid ячейках были многофункциональные компоненты типа DBLookupCombobox и подобное
Чтоб не заморачиваться есть функция которая выставляет компонент поверх нужной ячейки DBGrid
Цепляем эту функцию на событие OnPrepareCanvas DBGrid
- Код: Выделить всё
- procedure set_DBLookupComboBox_cell_pos(column_name:string; object_:TDBLookupComboBox;db_grid:TDBGrid);
 var
 rect_:TRect;
 i:integer;
 found_field_flag:boolean;
 begin
 // Для установки положения данного поля в ячейке DBGrid
 // Вешать на OnPrepareCanvas
 // set_DBLookupComboBox_cell_pos('vozvratnost',DBLookupComboBoxVosvratnost,TDBGrid(sender))
 if object_.DataSource.DataSet.Active then
 if object_.DataSource.DataSet.RecordCount>0 then object_.Visible:=true else object_.Visible:=false
 else
 begin object_.Visible:=false; Exit; end;
 found_field_flag:=false;
 for i:=0 to db_grid.Columns.Count-1 do if db_grid.Columns.Items[i].FieldName=column_name then begin found_field_flag:=true; break; end;
 if found_field_flag=false then begin ShowMessage(SysToUTF8('Поле в DBGrid не найдено')); exit; end;
 if dgIndicator in db_grid.Options then inc(i); //dgIndicator тоже считается за колонку
 rect_:=db_grid.SelectedFieldRect;
 rect_.Left:=db_grid.CellRect(i,0).Left;
 rect_.Right:=db_grid.CellRect(i,0).Right;
 object_.Left:=db_grid.Left+rect_.Left+1;
 object_.Top:=db_grid.Top+rect_.Top+2;
 object_.Width:=rect_.Right-rect_.Left;
 object_.Height:=rect_.Bottom-rect_.Top;
 end;


