Supongo que será errores de copiar y pegar, pero tienes 3 parámetros que se llaman "valor".
Lo normal es hacerlo así:
Código Delphi
[-]
procedure TDatos.DetFactura(id, id2, obs: string; idC: integer);
begin
Actualizar.SQL.Clear;
with Actualizar.SQL do
begin
Add('UPDATE DetFactura SET Id =: prId, IdFact =: prIdFac, Observaciones =: prObservaciones');
Add('WHERE IdDetFact =: prIdDetFact');
Actualizar.Parameters.ParamByName('prId').Value:=id;
Actualizar.Parameters.ParamByName('prIdFac').Value:=id2;
Actualizar.Parameters.ParamByName('prObservaciones').Value:=obs;
Actualizar.Parameters.ParamByName('prIdDetFact').Value:=idC;
end; Actualizar.ExecSQL;
end;
Ya que al dar valores a cada parámetro se tiene que hacer un parser de la cadena SQL para averiguar los parámetros, así que solo lo hacemos una sola vez.