Some great news recently – InterBase has been shortlisted for the 2nd annual IoTA awards for Most Innovative Use of Data.
InterBase offers a brand new approach to data movement thanks to its patent pending Change Views technology, dramatically reducing the cost of keeping data up to date on the edge of IoT, coupled with a strong data security model to distributed systems with encryption at its heart across all major platforms.
This year the winners will be announced on the 1 December 2015 at the iconic Wembley Stadium as part of the World Communication Awards. Winners will be named in 9 defining categories in front of an audience of around 500 of the most senior executives in the communications industry.
This is the third post of a series looking at using VCL and LiveBindings. This posts will expand on post 2 and dynamically create via code the LiveBindings at run time.
In my second blog post on Using LiveBindings in a VCL application, I looked at using the Prototype bind source for the first time and how it can be used to link objects to screens. But what if you need to work this out dynamically?
Dynamically linking to objects is possible if you create the LiveBindings at run time and in this video I show how to easily work out the components and properties you need to setup. This post builds on what was learned in the previous posts VCL LiveBindings and DataSets and VCL LiveBindings to Objects
In FireMonkey, Bitmap is the common currency for working with images. If you want to send an image via Stream using LiveBindings or want to save an Image to disk or into a database on a device with limited storage however, they are quite large.
Thankfully FireMonkey has a really easy to use CodecManager that allows you to SaveToFile or SaveToStream and convert to PNG or JPG across all platforms (which are vastly smaller in size).
Creating a PNG, JPG/JPEG is as simple as calling the Bitmap.SaveToFile with the correct file extension. This works really well with even more extensions supported.
Personally I would use PNG as the JPG formats are around the same size on some test I’ve run, but produce a better quality of image, especially when grabbing screenshots.
SaveToStream and TBitmapCodecManager
Bitmap.SaveToStream doesn’t expose the CodexManager in the same way as it is available automatically with the SaveToFile option so takes a little more work to get a compressed image into the memory stream.
This is done using the TBitmapCodecManager class. A simple screen test has gone from over 1mb as a bitmap to around 6kb when saved to PNG using this approach.
The following code is an example using two image viewers (and a few save to files to help demonstrate the difference in file size). The key part is the TBitmapSurface and TBitmapCodecManager.
procedure TForm1.Button1Click(Sender: TObject);
aFile : string;
// Comparison save file as BMP
aFile := 'c:\test\myImage';
Stream := TMemoryStream.Create;
Stream.Position := 0;
Surf := TBitmapSurface.Create;
// use the codec to save Surface to streamifnot TBitmapCodecManager.SaveToStream(
'.png') thenraise EBitmapSavingFailed.Create(
'Error saving Bitmap to png');
// do something with the png stream image
Stream.Position := 0;
// comparison output as PNG from the stream
Stream.Position := 0;
Now, you can obviously save as a ‘PNG’ from the bitmap, but the above code shows how to avoid saving a file to disk unless you really need to.
This is the first post of a series looking at using VCL and LiveBindings. This posts will cover using LiveBindings with TDataSet.
Post two will look at using Objects, and Post 3 will look at dynamic creating bindings at runtime.
Apple have released a new OS update yesterday called El Capitan.
As with most OS updates, things change, and this is no exception. Thankfully, when it comes to Delphi and C++ Builder running on El Capitan, its pretty straight forward, the only thing required is to update the PAServer. The update is available from Code Centralhttp://cc.embarcadero.com/item/30398.
Privacy & Cookies Policy
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.