I see. Seems to be that the duplicate records are caused by the calculated fields. When I exit qCurveCalcFields immediately after the "begin", or when I unhook the OnCalcFields handler altogether, the fields are unique again (this is most easily seen when one of the "*Number" fields is added to the query).
It would be interesting to investigate whether this issue is due to Access/ODBC or due to a bug in the field calculation. Both are not heavily used features in this community... I think there was a bug report about calculated fields sometimes, but I am not sure. I ran the test program also under FPC/main, and the issue remains - this means that this bug has not yet been fixed.
I would recommend to do the calculation within the SELECT SQL, e.g.
qCurve.SQL.Text := 'SELECT Moisture, Moisture*Moisture AS MoistureSquare, Absorbance, (1.0 - Absorbance) AS Residual FROM CURVE';