Self-tuning preact
To build further on Tom's suggestions:
You can make your pre-act self-adjusting. Use a register to store your preact. When the valve is closed, compare the tank level to setpoint. If it's outside of some tolerence level, then adjust your preact by a percentage of the error. You may even want to use two different percentages - a large one if overshooting and a smaller one if undershooting.
With this kind of arangement, if circumstances change gradually over time (in warmer weather, the stuff flows faster), the system will continually compensate for the changes.
Tom's gross/fine valve setup is great for discrete valves. If you have an analog valve, you can treat it like a gross/fine. Open the valve 100%. When at an overly large preact, bring the valve to 1% (or whatever produces a "trickle" flow. When at Preact2, close the valve completely (which should be fast, since it's not open very much).
A third technique I've used with discrete valves is to close them at just before preact, intentionally undershooting, but not by much. Then pulse the valve openclosed, and measure the change. The pulses can be repeated, and perhaps the pulse width changed, to get to your target.
I've seen this method fill a Dixie cup to where the water was OVER the top, yet not spilling a drop. (surface tension)