Category Archives: All posts

Anatomy Of A Delphi XE8 Firemonkey App On Android, IOS, Windows, And Mac

Delphi XE8 Firemonkey Anatomy Of A Cross Platform App

If you are new to working with a full featured framework like Firemonkey you may be wondering at the size of the apps that Delphi XE8 Firemonkey generates. The Firemonkey Framework has hundreds of thousands of lines of code that allows you to jump ahead and start building the app you want to build now instead of the bricks in the road to get there. Hopefully this infographic will provide some insight into what makes up an APK/IPA cross platform application deployed from Delphi XE8 with the FMX framework. The infographic covers Android, IOS, Windows, and Mac OSX apps/packages/libraries/archives created using the Firemonkey framework. Tools that utilize the Firemonkey framework are Delphi XE8, C++Builder XE8, Rad Studio XE8, and Appmethod. The infographic only covers Release mode (something you could deploy to your customers). I have also included a VCL section in the infographic so that you can compare the Windows only VCL framework to the cross platform FMX framework. Also keep in mind that when you use debug information or are in Debug mode your file could be significantly larger. The sizes of the generated files are included in the green circles. There is the normal compiled size and then there is the compressed or packaged size. APK and IPA files are packaged and compressed. The compressed sizes for Windows and Mac OSX were achieved using the 7Zip format. Here is some information directly from the infographic as well about what units are included in a FMX app on Android (it is slightly different on each platform) and how those units effect the size of the deployable file.

Let’s start off with a Hello World app which is basically a FMX form with a TLabel on the form. This comes out to around ~4.97MB when deployed to Android as an APK. Even though this is a Hello World app there is already much more functionality here than just the ability to print out ‘Hello World’ to the screen. A true ‘Hello World’ would be much smaller because it would lack these Firemonkey framework units. The FMX and RTL units included are:

System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls

Next up I’ve listed what I call a Basic App  that clocks in at ~5.50MB. A basic app has some more visual controls available to it like a TListView, a TListBox, a TTabControl, a TMemo, and even some access to advertising. Here are the FMX units included (in addition to the units from the Hello World app):

FMX.ListView.Types, FMX.Objects, FMX.ListView, FMX.Edit, FMX.ScrollBox, FMX.Memo, FMX.Layouts, FMX.ListBox, FMX.DateTimeCtrls, FMX.Advertising, FMX.TabControl

This next tier of app size I’ve termed Services because it is basically some Android JAR files which when fully included bring the app up to around ~6.40MB. These services are basically helper services for Android (some of which are provided by Google) like Google IAP, GCM, and Analytics. You can include and exclude each of these files from your APK separately. Here is a list of the additional files:

android-support-v4.dex.jar, apk-expansion.dex.jar, cloud-messaging.dex.jar, google-analytics-v2.dex.jar, google-play-billing.dex.jar, google-play-licensing.dex.jar, google-play-services.dex.jar

Next up we have what I have termed the Consumer App style app tier which rings in at around ~8.91MB. Obviously if you add more or differently functionality the size of your app can fluctuate greatly. You could also build games and they might fall in this size range depending on how many external graphics and sound you used. This type of app includes more functionality like the RESTClient, the in app purchases unit, sensors, a grid component, and the camera component. Here are the additional FMX and RTL units included by the IDE when these new components (in addition to all of the above) were added:

IPPeerClient, System.Sensors, System.Rtti, FMX.Grid, System.Sensors.Components, FMX.Media,REST.Response.Adapter, REST.Client, Data.Bind.Components, Data.Bind.ObjectScope, System.Actions, FMX.ActnList, FMX.InAppPurchase

Lastly we have the Enterprise and Database App tier which comes in at around ~10.4MB+ but can increase size from here the more you add to your app. This includes FireDAC functionality for accessing an SQLite database, LiveBindings to bind the data to a grid, accessing various path utility functions, and creating ini files for settings storage. At this level you can add tens of thousands of lines of code and lots of forms and the app could still be around this size. The RTL and FMX units included when this functionality was added (in addition to all of the above units) are as follows:

System.IniFiles, System.IOUtils, FireDAC.Stan.Intf, FireDAC.Stan.Option,FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs, Data.DB, FireDAC.Stan.Param,FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Data.Bind.EngExt,Fmx.Bind.DBEngExt, Fmx.Bind.Grid, System.Bindings.Outputs, Fmx.Bind.Editors, Data.Bind.Grid, Data.Bind.DBScope, FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.Phys.SQLiteVDataSet;

You can find out more about the Firemonkey Framework on the Embarcadero DocWiki and on the FiremonkeyX website.

Download the full Anatomy of a Firemonkey Framework Multi Platform App infographic for future reference.

Tags: , , , , , , , , , , , , ,

Ten Tips For Building Stunning Professional Android Apps With Firemonkey

#1. Secure Your App’s Data Connections With SSL

If you are using the REST client or the TIdHTTP component in your mobile apps you should encrypt your connection with SSL to keep your user’s data secure. You can utilize services like CloudFlare and MaxCDN to simplify implementing SSL on your web servers. Or encrypt your data manually with these free components.

#2. Reduce Your Mobile App Data Usage With Data Compression

With mobile service providers charging by the gigabyte lowering data usage is important. If you are making any kind of HTTP connection to a web server from your Firemonkey apps you should enable GZIP compression on both your server and client. There is also an open source compression library for files available.

#3. Save A Shortcut To The Home Screen After Install

If you want users to be able to find your app again after they first install it you should add your icon to the user’s home screen. The user can remove it or it will automatically be removed if they uninstall your app.

#4. Create And Deploy Icons For Your App

You will need to create quite a few different icon sizes to deploy with your app and to upload to the app stores. Each of the four major app stores (Google, Apple, Amazon, and Samsung) have their own icon size requirements. There is a free utility available which makes this easier. A second free tool will help you make all the splash screen images you need.

#5. Handle App Activate And Deactivate System Events

Take action when the lifecycle of your app changes in events like FinishedLaunching, BecameActive, and EnteredBackground. Users multitask using Android these specific system events (and others) will be fired. You should add these events to your app and take action as needed. There is also a bonus component called TfgApplicationEvents which gives you OnIdle, OnOrientationChanged, and OnStateChanged.

#6. Keep The Focused Edit Field Visible Above The Virtual Keyboard

If the virtual keyboard pops up over your memo or edit control in the lower half of the device screen you will need to implement a solution to scroll the field into view. There is a demo included with the latest version of Delphi called ScrollableForm which demonstrates another way of doing it.

#7. Keep Your Mobile Apps Responsive With Native Progress Dialogs

While your app is doing work that the user must wait for you should display a native progress or activity dialog to keep the app responsive. Your app will do it’s work in the main app thread (or your own custom threads) and the native progress or activity dialogs will animate seamlessly in the foreground.

#8. Check Network Connectivity Before Trying To Connect

You should check if a user is connected to the internet before making any opening any connections that attempt to connect using the internet. This way you can notify the user if they do not have connectivity and your app can handle that accordingly.

#9. Handle The Android Hardware Buttons

Android devices have a back button which you should handle so your users will have an intuitive flow inside of your apps. On Android devices there is also the VK_MENU button which you can handle in the OnKeyDown and OnKeyUp events as well.

#10. Automatically Save Form State Between Sessions

A new event is available in Delphi XE7 called TForm.OnSaveState which gets called when your app is going to be hibernated by Android. There is a free class helper available that will loop through the controls on your from in the OnSaveState event and save them out to JSON. When you form is created you can load up the previous saved form state.

BONUS TIP: Google Cloud Messaging Push Notifications

If you want to keep connected to your users and increase retention you can use push notifications. On Android there is a push notification API from Google called Google Cloud Messaging. It is pretty closely tied to Google and you have to have API keys but keeping connected to your users is worth it. Push notifications are similar to an email newsletter. You can also do push notifications through the BaaS components via Parse and Kinvey.

DOUBLE BONUS TIP: Apply Premium Styles For A Professional Look

Delphi XE7 comes with 7 premium styles for Firemonkey that look fantastic. You can give your users the option to choose which style they want to use at runtime. The Jet style works particularly well in direct sunlight.

Finally, check out the older version of this post for Delphi XE5. Check out twelve tips for IOS. And find out tips for building games with Delphi Firemonkey.

Tags: , , , , , , , , , , , , , , , , , , , , , , , ,

Ten Tips For Creating Professional Android Apps With Firemonkey

#1. Save A Shortcut To The Home Screen After Install

If you want users to be able to find your app again after they first install it you should add your icon to the user’s home screen. The user can remove it or it will automatically be removed if they uninstall your app.

#2. Secure Your App’s Data Connections With SSL

Users are connecting from public hotspots these days and you need to secure those data connections to keep the data safe. Some app stores like Amazon App Store will deny your app if you don’t use secure connections for your user’s login data.

#3. Create And Deploy Icons For Your App

You will need to create a good number of different icon sizes to deploy with your app and to upload to each different app store. There is a free utility available which makes this easier.

#4. Handle App Activate And Deactivate System Events

When users multitask using Android there are specific system events that will be fired. You should add these events to your app and take action as needed.

#5. Add An App Loading Splash Screen

Android apps can take a few seconds to load where the user may be confused on what your app is doing. You can set up a splash screen so the user sees your logo or something similar while your app loads. You can also try this new method of using the Android Manifest to add a splash screen.

#6. Keep The Focused Edit Field Visible Above The Virtual Keyboard

When the virtual keyboard pops up it will by default cover the box that is being edited if it is below the bottom half of the screen. You can scroll your form so that the field being edited stays visible.

#7. Use Progress Dialog Boxes To Keep Your App Responsive

If your app is doing a task which will take some time like downloading or saving a file you should show a progress dialog to the user so that your app doesn’t look frozen. You can use either a multithreaded, native dialogs, or single threaded dialog.

#8. Check Network Connectivity Before Trying To Connect

You should check if a user is connected to the internet before making any opening any connections that attempt to connect using the internet. This way you can notify the user if they do not have connectivity and your app can handle that accordingly.

#9. Handle The Android Hardware Back Button

Android devices have a back button which you should handle so your users have a correct flow inside of your application.

#10. Save Settings Between Sessions

You can use both TIniFile and TMemIniFile to save settings on Android just like you would on Windows. Be sure to use TPath.GetDocumentsPath + PathDelim to get the right location to save your Ini file to. A second way to save settings would be with SQLite.

BONUS TIP: Google Cloud Messaging Push Notifications

If you want to keep connected to your users and increase retention you can use push notifications. On Android there is a push notification API from Google called Google Cloud Messaging. It is pretty closely tied to Google and you have to have API keys but keeping connected to your users is worth it. Push notifications are similar to an email newsletter.

Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Polish Your Firemonkey Apps For IOS With These Twelve Tips

#1. Monetize With In App Payments And/Or Ads Like Admob And Iads

There are a number of free and commercial components which handle in app payments and ads for you on IOS with Delphi XE5 Firemonkey. Check out DPF for IOS which has both in app payments and Iads components for free. The other components are from JVESoft and from Flash AV Software.

#2. Secure Your App’s Data Connections With SSL

Users are connecting from public hotspots these days and you need to secure your data connections to keep your user’s data safe from snooping. You can use the free OpenSSL components with Indy or there are two other commercial SSL components here and here.

#3. Encourage Users To Rate Your App

Usually only people who want to give your app a low rating end up on the App Store rating page and rate your app down. In order for you to encourage users who also really like you app to rate your app you can use a component like this or build your own using dialog boxes. DPF for IOS has a free component and JVESoft has a commercial rating component.

#4. Create And Deploy Icons For Your App

There are around 30 different icon sizes that you need to create to handle both Iphone and Ipad icons with your IOS app. There is a free utility which will take your logo and turn it into all off the icon sizes that you need.

#5. Use Premium Styles In Your App

Embarcadero provided some additional premium styles which you can download and use with your apps. There is a dark style and a light style for both IOS6 and IOS7. You can provide both to your users and they can choose for themselves which one they like on your app best.

#6. Handle App Activate And Deactivate Lifecycle Events

The lifecycle events are really important on IOS (much more so than on Android). There is no functionality to exit your app on IOS so you need to use those backgrounding lifecycle events to take care of saving your settings etc.

#7. Add Google Analytics To Your App

If you are building a professional commercial app you will want to collect usage data so that you can find out how your users are using your app and use that data to guide how you upgrade your app and add new features.

#8. Keep The Focused Edit Field Visible Above The Virtual Keyboard

When the virtual keyboard pops up it will by default cover the box that is being edited if it is below the bottom half of the screen. You can scroll your form or tabcontrol so that the field being edited stays visible. Make sure to implement a version of the code that handles multiline edit controls like TMemo as well.

#9. Setup Apple Push Notifications

If you are building a long term commercial app for IOS one way you will want to keep in touch with your users is through Push Notifications. It is always easier (and cheaper) to re-connect with existing users than it is to get new users. Push Notifications can help your achieve that.

#10. Use Threads To Keep Your App Responsive

There is a multithreaded progress dialog which is the main link of this tip but in addition to that there are two native progress dialogs for IOS here. And there is the anonymouse thread unit called AnonThread which comes in the samples section of Delphi XE5 Firemonkey. You can read this blog post on how to use it. Lastly you can use the ExecuteAsync function with TRESTRequest to do asynchronous REST calls.

#11. Handle Device Idle Time Out

If you are doing any kind of downloading using your app you will want to handle the idle time out of the device so that your app doesn’t dim out and go into the background when it is actually working. You can disable the idle time out, finish your downloading, and then re-enable the idle time out to conserve the user’s battery.

#12. Check Network Connectivity Before Trying To Connect

With mobile devices your app could lose connectivity at any time as the user travels around while using your app. You need to build that connectivity detection in your app from the start so if connectivity does drop you can handle it gracefully either by queuing up actions or sending your users notifications that they need connectivity to continue.

Tags: , , , , , , , , , , , , , , , , , , , , , ,

Massive Roundup Of Video Tutorials, Sessions, And Demos For Firemonkey

Embarcadero has a page up on their developer network site which links to all of their video sessions, tutorials, and demos for Firemonkey and mobile. This includes links to CodeRage 8 and CodeRage 7 sessions, CodeRage Mobile sessions, lots of different videos about Firemonkey, videos on building cross platform applications with Delphi XE5 Firemonkey, and even a few videos for HTML5 and C++Builder. The videos cover building applications for Android, IOS, Windows, and OSX. There are twenty eight different links and each link usually provides more than one video. As you may have noticed by now this is a massive collection of content you can use to bring yourself up to speed on building apps using Delphi XE5 Firemonkey. Since Embarcadero’s latest offering, AppMethod, runs Firemonkey all of these videos can be used if you are looking to learn how to use AppMethod as well. Most of the videos require that you register before you and start viewing.

Head over and browse the 28 different Delphi XE5 Firemonkey video sessions, tutorials, and demos.

Tags: , , , , , , , , , , , , , , , , ,

Full Android SDK Interface Files In Object Pascal For Firemonkey

Some APIs in the Android SDK are not fully exposed to Delphi XE5 and XE6 Firemonkey (and AppMethod) by default. The Android SDK needed Object Pascal interface files created to make it easier to access those APIs. There are three different automated solutions available to make this happen. I went ahead and used Java2pas against the entire set of android.jar files for Android 7, Android 8, Android 10, Android 12, Android 14, Android 15, Android 16, Android 17, and Android 19. Java2pas automatically created 3,412 interface files for Android 19 which is Android 4.4 Kitkat. Depending on which Android version you want to target you should use the interface files from that version of Android. I took all of the generated interface files from all of the Android SDK versions and uploaded them to Github. There is everything from android.security.KeyChain to android.speech.tts.TextToSpeech to android.nfc.NfcAdapter to android.opengl.GLES30 to android.os.Vibrator to android.provider.ContactsContract and literally thousands of more interfaces. What is awesome about all of these interfaces is that you can access all of them without having to modify the classes.dex file which you would have to do if this was a third party JAR.

Head over and check out the full set of Android SDK Object Pascal interface files on Github.

Tags: , , , , , , , , , , , , ,

Convert Delphi VCL Apps To Firemonkey Android And IOS Apps With Mida Converter

The Mida Team has released an updated version of the Mida Converter with support for Delphi XE6 Firemonkey. What Mida Converter does is take your existing VCL app and convert it to a Firemonkey app which can either be for desktop or mobile devices. There are quite a few new features in this release which look pretty useful for mobile developers building apps for Android and IOS devices. Mida Studio now supports the option to convert a VCL app to a mobile app and use either the DPF for IOS or the DPF for Android controls. What this might allow you to do might be to have one VCL codebase that you convert into Android and IOS versions that use the native components of each platform. It also might be easier to build a VCL app and then convert it to a Firemonkey app for IOS and target the DPF for IOS controls without having to build up the whole DPF IOS control setup yourself. It is also able to target the TMS iCL native components for IOS in addition to DPF. The new feature list claims it can do a total conversion from VCL to Firemonkey without having to add exceptions for specific components. It does mention however that single click conversion may not be possible with all applications because of the complexities involved. Some of the features that pertain to converting mobile apps are only in Mida Studio which is the more expensive version of this commercial utility.

Head over and read the full release notes for Mida Converter 4.2 on the Embarcadero forum. Or head directly to the Mida Converter website to purchase the utility and begin converting your VCL apps to run cross platform.

Tags: , , , , , , , , , , , , , , , ,

Ten Tips And Tricks For Building Games With Delphi XE5 And XE6 On Android And IOS

Game Loop. Using a game loop to handle game state updates is one method for architecting your game. The basic idea behind a game loop is that you have one function that executes each frame and inside of that function you handle character movements, projectile movements, enemy movements, collision detection, and pretty much every other action that needs to happen at an interval within your game. There are two different Flappy Firemonkey game loop examples with source code. The original example that I created uses a timer for the game loop and the second modified example uses a thread for the game loop function.

Sprite Animation. One method of doing fast image animation is with sprite sheets. Sprite sheets are all of the frames of an animation contained within the same image. The sprite component copies each frame from the bitmap and paints it in the same place over and over creating an animation. There is a TSprite component for Delphi Firemonkey that does this for you. Bitmaps are generally faster than vector drawing every frame on mobile devices.

Drawing & OpenGL. Most games have custom drawing of some kind. If you are looking to do any kind of custom drawing with Delphi Firemonkey there is a drawing example app available with quite a few functions implemented and there is also a native drawing API demo for IOS. If you want to do drawing using OpenGL directly and not just the Firemonkey functions Jim McKeeth has a blog post up with a roundup of using OpenGL with Delphi XE6. Lastly the Box2D physics engine for Firemonkey has extensive drawing examples using a TPaintBox.

Bitmap Caching. Whether you are moving one Firemonkey control around the screen or hundreds of controls around the screen you can probably benefit from image caching. On mobile devices moving bitmaps around is generally faster than letting Firemonkey manually draw every frame when nothing changed from the previous frame. Drawing your control once and then caching it as a bitmap for each additional draw is one method to accomplish this. There is a component called TImageCacheLayout that does this for you automatically. One other trick you might try to get faster drawing with Firemonkey is using a TRectangle instead of a TImage for a lighter bitmap control.

Collision Detection. Collision detection is the backbone game mechanic behind a lot of games. Every time two different objects intersect each other collision detection occurs. There are three different collision detection examples which include point based collision detection, rectangle based collision detection, and finally automatic collection detection with the Box2d for Firemonkey physics engine.

Physics Engine. Using a physics engine can greatly speed up game development because you don’t have to manually code things like gravity, buoyancy, and collision detection. You can also build complex objects that mimic real world functionality. There is a Firemonkey version of the Box2d physics engine with over 60 different demos to base a game off of including vehicle simulations, bridge simulations, an Arkanoid demo, and many more. There is a visual world editor for Box2d called RUBE which exports it’s world as JSON which can easily be imported into Delphi Firemonkey.

Artificial Intelligence. If you are looking for the characters in your games to have some kind of intelligent response to the players you need artificial intelligence algorithms. There are two different Delphi Firemonkey component suites that implement artificial intelligence functionality like neural networks. One component suite is called IntelligenceLab and the other is called Inference Engine from RiverSoftAVG.

Data Files. Most games use data files of some kind to either store levels, save the game state between play sessions, or even just storing settings of the player. In Delphi Firemonkey there are a lot of choices on how you can store your data. You can read and write simple text based files using TIniFile or you can use robust databases like SQLite for reading and writing blob data like images using FireDAC. If your game has some kind of online element to it you can use the TRESTClient controls for loading and saving data from a server.

Monetization. If you want to be able to monetize your games on mobile there are two different methods for doing so which are ads and in app payments. In Delphi XE5 there are some third party ad components for IOS and an AdMob component for Android. There is also a third party in app payment component for IOS. Delphi XE6 ships with AdMod and iAd components for Android and IOS in addition to an in app payment component which works for both Android and IOS.

High Score Systems. One thing that keeps players interested in a game is being able to compare their score against other player’s scores. Once a player has mastered a game a high score system can still keep them coming back again and again to see if they can beat the high score of other players. There is a Firemonkey example for saving user scores in the cloud using the Delphi XE5 TRESTClient components. There is also a PHP or ASP.NET server side high score system you can host yourself that can save and retrieve user scores from a MySQL database. Lastly on IOS you can plug into the Apple GameCenter API for storing high scores and other game data.

BONUS TIP: Third Party Libraries. You can always augment your Object Pascal development on Android and IOS by using existing third party libraries which may have been written in a lower level language. There are literally hundreds of existing third party libraries out there for you to access from Delphi Firemonkey. For Android devices you can load JAR files which contain Java libraries (.jar) and Android NDK libary files (.so). On IOS devices you can load static libraries (.a) to get access to additional functionality. For example, you could rapidly prototype with Box2d for Firemonkey and then if you need more speed you could import the Java version of Box2d or the C++ version of Box2d on Android.

Finally I have some advice for you on what kind of games you should build with Delphi XE5/XE6. Don’t try to build the next big 3D shooter or other super high frame rate games for hard core gamers because there are better tools to build those kinds of games (like Unity3D or Adobe Flash). Instead focus on casual games for mobile devices that Delphi Firemonkey can build well like dress up games, turn based games, classic adventure games, hidden object games, basic arcade games, drawing games, or board games using the camera. Delphi Firemonkey can excel at doing rapid application development for these types of games.

Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , ,