I finally managed to help my self out. I changed that TStringList to Tlist type. I also made a record which holds the texture, filename and reference count in it. When new texture is loaded a new pointer to that record (which stores the texture itself) is made and that record pointer is stored in a Tlist.

I also build one procedure to SpriteManager class which is used to release sprite. That procedure has argument for releasing the texture from memory among the sprite itself (if there's no more sprites pointing to texture).

Finally when spritemanager is freed and if there's any pending textures in TList, it releases them in destructor and frees Tlist itself.

I stress tested this with hundreds of sprites. Some of them refenced to same texture and some of them had texture for that specific sprite only. When textures was released, created, released, created and so on memory changed (I was interrupting with debugger and watching memory usage from process list) and everything worked just fine.

Now I can finish the sprite engine. Still I want to thank you guys (or gals). Without your help I would never manage to do anything like this.