I found this tip over on a Portuguese Delphi Forum and the idea is to use a TRectangle with a bitmap fill instead of a TImage. According to the forum poster a TRectangle is much much lighter resources wise than a TImage and you can accomplish almost the same thing with a TRectangle bitmap fill brush. The drawback to using a TRectangle is that there are only three different display options (wmTile, wmTileOriginal, and wmTileStretch). wmTile will tile the bitmap brush regardless the size of the TRectangle. wmTileOriginal will just show the bitmap once regardless of the TRectangle size. And finally wmTileStretch will stretch the bitmap to the height and width of the rectangle. TImage has a few other different settings for formatting the display of a bitmap but for most uses the TRectangle bitmap fill is probably enough. You could use this idea with the Progress Bar Asynchronous Image Loader instead of it’s current TImage to make it lighter. Here is some sample code that shows how to load a TRectangle Fill with a bitmap using code:
// set the rectangle to the size of your bitmap
Rectangle1.Width := 300;
Rectangle1.Height := 300;
Rectangle1.Stroke.Kind := TBrushKind.bkNone;
Rectangle1.Fill.Kind := TBrushKind.bkBitmap;
//Rectangle1.Fill.Bitmap.WrapMode := TWrapMode.wmTile;
Rectangle1.Fill.Bitmap.WrapMode := TWrapMode.wmTileOriginal;
//Rectangle1.Fill.Bitmap.WrapMode := TWrapMode.wmTileStretch;
Rectangle1.Fill.Bitmap.Bitmap.LoadFromFile('myfile.jpg');
Head over and read the full forum post which also contains some other Firemonkey tips.
Your article is great, so i used a lot of TRectangle in my programs
But now, width Upgrading to DELPHI XE8, i have some issue
http://stackoverflow.com/questions/29584789/delphi-xe8-no-refresh-for-trectangle-on-android-during-oncreate-event
What do you thinks ?
This is a workaround we used to address an issue like this. It backs up the image on the first paint and then loads it again in a timer. There has to be a better way? Whether it works or not in your instance I’m not sure: