Nice trick!
However, because these classes inherit from TStream but hold a private TStream field internally, these read/write classes themselves seem to have potential issues. While modifying each stream class directly would be the proper approach—since each has its own implementation—doing so might introduce larger regressions.
What is the actual use case for this event? Wouldn't we get the same result by simply checking the stream's Position property inside a loop? The loop will be required in order to track progress.