[Lazarus] Raw TBitmap objects vs LCL TBitmap properties inconsistencies

Giuliano Colla giuliano.colla at fastwebnet.it
Wed Sep 12 17:47:37 CEST 2018

Hi Lazarus experts,

I have noticed a number of apparent inconsistencies which make life a 
bit complicate if you need to play with visual properties of LCL components.

If you need a different canvas brush, you need to change a button glyph, 
or to dynamically change a TImage (just to make a few examples), you 
create your TBitmap, and with a simple assignment instruction you pass 
it to the component. It works and it's Ok.

But then you're faced with a problem: what to do with the TBimap object 
you have created?

Coming from Delphi I had assumed that a TBitmap is not copied on another 
one, but just the pointer to the underlying Handle is copied. This means 
that you should never free a TBitmap after copying.

But if you use heaptrc you discover that a number of your TBitmaps are 
still there after closing all the forms.

On the other hand, in some cases if you FreeAndNil a TBitmap which has 
just been copied to an LCL component you get a crash with an AV.

Up to now my solution has been to enable heap trace, let heaptrc tell me 
what I need to free, and do it just for those bitmaps.

Is there a better way? i.e. what is the logic behind some LCL components 
just taking the pointer of a TBitmap and some to create their own 
internal bitmap leaving the original TBitmap untouched?


Do not do to others as you would have them do to you.They might have different tastes.

More information about the Lazarus mailing list