Una solución mixta puede ser llenar una lista de componentes asociados a los campos del dataset
Código:
//Definimos las variables y las funciones
private
Lista:TstringList;
procedure CanvioFoco(NombreCampo:string);
//llenamos la lista con los objetos y los nombre del campo
//si hay diferentes dataset con nombres de campo igual se deberá cambiar un poco el código
procedure TForm1.FormCreate(Sender: TObject);
Var
i:integer;
begin
Lista:=TstringList.Create;
For i:=0 to ComponentCount-1 do
if Components[i] is TDbEdit then
Lista.AddObject(TDbEdit(Components[i]).DataField,Components[i]);
end;
//en el código original añadimos tan solo una línea
for datos := 0 to tabla.FieldCount-1 do
if (tabla.Fields[datos].Required) and (tabla.Fields datos].Text '') then begin
showmessage('Debe introducir un valor en '+ tabla.Fields datos].DisplayName);
//cambiamos el foco
TDbEdit(Lista.Objects[Lista.IndexOf(tabla.Fields[datos].FieldName)]).setfocus;
exit;
end;
//liberamos la lista al cerrar
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Lista.Free;
end;
si el código no es correcto ahora me tocará aprender a escribir