Your guess about sizeof is correct - all classes are implicit pointers, so sizeof will get you the size of a pointer (4 bytes in other words).

About your question: consider having a manager class. If you have 20 different sprites that look identical, there's no need to store the surface in each class instance wanting that pic. Instead, you would store what pic it has as an index (usually just an integer, string or enum'd type), and when you needed it you'd go to the manager class and say "give me bitmap 'whatever'. The manager would be responsible for loading, creating, and freeing the objects on demand (possibly lazily or maybe at load time). As a result, only one of each surface would be required for the animations by the manager. You could apply this to the animation class itself instead of to the surfaces, depending on your needs.

Alternatively, you could simply chuck an implementation-level surface or array of surfaces (or anims again) and reference count it, although that depends on your chosen design a little. It'd be simpler and can be a quite handy solution. The finalization section can be used to get rid of any created-but-not-yet-killed anims.

Storing a TAnimation in your sprites won't be a major problem if it's a reference to a pre-created anim, since many references will use the same anim object (with only one surface). However, if you create many of those objects then you'll end up wasting a lot of memory, since each anim object will contain a surface. Again, this can be alleviated either by storing references to the animations in your sprites or references to the surfaces in your animations.

You can get the amount of memory taken up by a surface by locking it and checking the pitch (remembering to unlock it later!). The amount of mem is about surface_height * surface_pitch bytes. I couldn't tell you how to lock a surface with DelphiX since I've never used the thing, but somebody else will, I'm sure! :batman: There's probably a way to the IDirectDrawSurface[whatever] interface, in which case you'd use the lock and unlock functions in the usual fashion. DelphiX probably has a wrapper property or function for that task, mind you.

A surface will pretty much take up its expected size or a bit more per scanline, depending on whether the graphics card decides to pad the surface. The main thing to watch out for is how much video memory you want for your surfaces - could be a problem on older kits, I guess.