NAh you are wrong here
I just doublechecked, and the VCL first sends the OnDestroy event, and only after that it begins destroying the owned components.
Also, the AV was caused because your Finalize procedure already freed a few objects and interfaces, and didn't check if it could 'free' them again. One way to solve this is by adding the FInitialized and FDeviceActive checks, another would be to set every handle to nil (but would be a more dirty tho). Feel free to try again, but I am not convinced yet; there should be a simple if-check to prevent the AV from occuring.

(Or did you see other VCL controls give an AV because you did something that's not possible? For as far I know they always check if they can do it.)

Another reason I just came up with : Finalize is a public property, so it should be possible to call it whenever I would like to. (My choice: OnDestroy )

Thanks for fixing the VTDb bug, and for this nice conversation heh