Решил одну задачку, думаю другим не помешает
Иногда надо , чтоб в 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;