Hola,
Bueno. Tal como planteas el código:
Código Delphi
[-]
if not Assigned(FFacturarPresupuesto) then
presupuesto:=FFacturarPresupuesto.DataSource2.DataSet.FieldValues['codigo']
else
presupuesto:='';
Creo que debería ser al revés:
Código Delphi
[-]
if Assigned(FFacturarPresupuesto) then
presupuesto:=FFacturarPresupuesto.DataSource2.DataSet.FieldValues['codigo']
else
presupuesto:='';
Es decir, "si FFacturarPresupuesto contiene un objeto, entonces usamos FFacturaPresupuesto".
La violación de acceso se produce porque tu código dice algo como "Si FFacturarPresupuesto no contiene un objeto, lo usaré de todas formas...". Y lógicamente no puedes usar un objeto (ni ninguno de sus métodos o propiedades) si el objeto no existe.