Tienes razón @olbeup. El campo debe devolverse como entero mediante .AsInteger. He adaptado a mano un código similar que tengo para obtener descripciones de cosas dado un código.
Lo de capturar la excepción depende del contexto. En este caso en particular yo prefiero dejar que la excepción llegue a evitar que se ejecute lo que venga dentrás.
Es más fácil que hacer if resultado <> -1 then ... para cada petición.
Código Delphi
[-]
function crear_cabecera_factura(...) : integer;
var
...
begin
Result := 0;
try
id := DameId('ID_CABECERA');
FormaPago := DameFormaPagoDefecto(...);
Cliente := DameClienteDefecto(...);
Almacen := DameAlmacenDefecto(...);
...
xCabecera.Insert;
... Asigno parámetros
xCabecera.Post;
Result := id;
except
on e:Exception do
ShowMessage('Fallo al crear cabecera' + sLineBreak + e.Message);
end;
end