Otra idea:
El formulario tiene una propiedad ActiveControl, cuyo valor es el control activo en cada momento. En el evento OnExit de un control, ActiveControl contiene ya el control al que se va a desplazar el foco mientras que (Sender as TWinControl) contiene el control que se está abandonando. Entonces, podemos comparar la propiedad TabOrder de ambos controles para saber si estamos avanzando o retrocediendo:
Código Delphi
[-]
procedure TForm1.EditExit(Sender: TObject);
begin
if ((Sender as TEdit).Text = '') and ((Sender as TWinControl).TabOrder < ActiveControl.TabOrder) then
begin
ShowMessage('Falta capturar el dato');
(Sender as TWinControl).SetFocus;
end;
end;
// Saludos