TDBCtrlGrid

Hoje, tive um sério problema ao utilizar o TDBCtrlGrid. Eu precisava que o foco dos controles que ele contem fosse modificado para o próximo componente quando a tecla Enter fosse pressionada. Procurei muito em fóruns, e não encontrei nenhuma resposta, resolvi com esta função e resolvi compartilhar. Bom, ta ai o código. Aquele abraço. Código recomendado para chamada. procedure TForm.DBCtrlGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); if Key = VK_RETURN then begin NextFocus(DBCtrlGrid); Key := 0; end; end E finalmente o código da procedure:

(* Procedure que controla o próximo foco *) function NextFocus(ADBCtrlGrid : TDBCtrlGrid; NextInDataSet : boolean = true) : boolean; var ct : integer; DataSet : TDataSet; Form : TForm; FirstControl : TWinControl; begin result := false; DataSet := ADBCtrlGrid.DataSource.DataSet; Form := TForm(ADBCtrlGrid.Owner); FirstControl := nil; for ct := 0 to Form.ComponentCount-1 do if (Form.Components[ct] is TWinControl) and (Form.ActiveControl.Parent = TWinControl(Form.Components[ct]).Parent) then begin if (not result) and (Form.ActiveControl.TabOrder+1 = TWinControl(Form.Components[ct]).TabOrder) then begin TWinControl(Form.Components[ct]).SetFocus; result := true; end; if TWinControl(Form.Components[ct]).TabOrder = 0 then FirstControl := TWinControl(Form.Components[ct]); end; if (not result) and (NextInDataSet) then begin DataSet.Next; if DataSet.Eof then DataSet.Append; FirstControl.SetFocus; end; end;