In terms of object orientated programming, the most widely used way is to do what Paul has suggested. Declare the method in the base class as 'virtual' and then override it in the child classes.

By doing it that way, if your base class has functionality in it that will also be needed for the children, you can use the 'inherited' keyword to call the common functionality.

To use the procedure variable method (which is the standard eventing mechanism), you should really handle the situation where the variable is not initialised, which would result in an additional 'if assigned()' or 'if collide<>nil' style check to avoid attempting to call a routine at address 0x00000000 (which I'm guessing is why your code isn't working using that method). If the routine is being called alot, then those checks create an overhead that can be avoided by using real overrides.