根据  DBGrid中插入DateTimePicker(08)  类似 改编

 

procedure TForm13.ComboBox1Change(Sender: TObject);   //ComboBox1  写回  数据库
begin
    DBGrid1.DataSource.Edit;
    DBGrid1.Columns[1].Field.Value  := ComboBox1.Items[ComboBox1.ItemIndex ];    //1 为 ComboBox1 所在的列序号
    fdquery1.Post;
end;


procedure TForm13.DBGrid1ColExit(Sender: TObject);
begin
  if DBGrid1.SelectedField.FieldName = 'username' then  ComboBox1.Visible := False;
end;

procedure TForm13.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (gdFocused in State) then
  begin
    if (Column.Field.FieldName = 'username') then
    with ComboBox1 do
    begin
      Left := Rect.Left + DBGrid1.Left + 1;
      Top := Rect.Top + DBGrid1.Top + 1;
      Width := Rect.Right - Rect.Left + 2;
      Width := Rect.Right - Rect.Left + 2;
      Height := Rect.Bottom - Rect.Top + 2;

     ComboBox1.ItemIndex  := ComboBox1.Items.IndexOf( Column.Field.Value);  //  从 数据库 中读 并 设置   ComboBox1
      Visible := True;
    end;
  end
end;

procedure TForm13.FormCreate(Sender: TObject);
var
  i: Integer;
  aStringList: Tstringlist;
begin  FDQuery1.Open('select *  from userinfo ');

  aStringList := Tstringlist.Create;
  aStringList.Sorted := True;
  aStringList.Duplicates := dupIgnore;  //去重
  while not FDQuery1.Eof do
  begin
    aStringList.Add(FDQuery1.Fields[1].AsString); // 要从 字典表 中 加载, 这里 只从 数据中 提取
    FDQuery1.next;
  end;
  ComboBox1.Items.Assign(aStringList);
  aStringList.Free;
end;