{"id":735,"date":"2011-08-04T19:10:59","date_gmt":"2011-08-04T07:10:59","guid":{"rendered":"https:\/\/www.deltics.co.nz\/blog\/?p=735"},"modified":"2011-08-04T19:10:59","modified_gmt":"2011-08-04T07:10:59","slug":"rad-studio-xe2-launch-event-report","status":"publish","type":"post","link":"https:\/\/www.deltics.co.nz\/blog\/posts\/735\/","title":{"rendered":"RAD STUDIO XE2: Launch Event Report"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">[Estimated Reading Time: <\/span> <span class=\"rt-time\">12<\/span> <span class=\"rt-label rt-postfix\">minutes]<\/span><\/span><p>Today I was fortunate to be present in Auckland at the World Premier of the launch event for RAD Studio XE2. \u00a0There is so much good to report that I really don&#8217;t know where to begin, so apologies if this post is a bit of a disorganised ramble. \u00a0But here goes.<\/p>\n<p><!--more--><\/p>\n<h2>Executive Summary<\/h2>\n<ul>\n<li><em>FireMonkey<\/em> &#8211; a scalable vector graphics based GUI framework exploiting GPU capabilities for hardware accelerated cross platform GUI&#8217;s.<\/li>\n<li><em>Cross-Platform support<\/em> &#8211; Target Win32 and Win64 with single-source VCL applications or Win32, Win64 and <strong><span style=\"text-decoration: underline;\">MORE<\/span><\/strong> using FireMonkey.<\/li>\n<li><em>iOS support for native code FireMonkey apps !!<\/em> &#8211; Yes folks &#8211; use Delphi to build iPhone and iPad apps that even Steve Jobs will be happy to have in his Store!<\/li>\n<li><em>LiveBindings<\/em> &#8211; a way to create &#8216;live&#8221; relationships not just between objects but between individual properties of objects.<\/li>\n<li><em>Native Android apps<\/em> &#8211; using PhoneGap in RadPHP<\/li>\n<li><em>Native Android apps<\/em> &#8211; to come in the future for Delphi (as well as Linux)<\/li>\n<li><em>DataSnap client proxy generation<\/em> &#8211; for Android, .NET, Objective-C, Blackberry, iOS etc etc<\/li>\n<li>Starter Edition will be available right from the start along with Pro, Enterprise and Architect.<\/li>\n<li>ALL platforms supported by the cross-platform capabilities will be in ALL editions, <span style=\"text-decoration: underline;\">including<\/span> Starter!<\/li>\n<\/ul>\n<p>That&#8217;s a lot to cover, even in one whole day. \u00a0<strong>FireMonkey<\/strong> alone is such a huge advance for Delphi that I could spend this entire post talking about it (even as I sit here wearing the <strong>FireMonkey<\/strong> T-Shirt that I got for attending the event).<\/p>\n<p>Yes folks &#8211; <strong>FireMonkey<\/strong> is big enough to warrant a t-shirt of it&#8217;s own! \u00a0Get used to hearing that name because I think we are going to hear a LOT more about <strong>FireMonkey<\/strong> not just from Embarcadero but from the industry in general. \u00a0It is a potentially game-changing technology imho.<\/p>\n<h2>Apologies<\/h2>\n<p>Before I get stuck into the meat of the event however, first a couple of apologies.<\/p>\n<p><strong>1) No pictures or video.<\/strong><\/p>\n<p>I tried, but sitting at the back and with the lighting in the room the way it was, I couldn&#8217;t get a decent picture or video and frankly I was too busy concentrating on the content to fiddle too much to try to capture pictures of the content. \u00a0As a result this blog post is heavy on words and light on pictures. \u00a0But I heartily recommend that you get along to a launch event in your area to see this stuff for yourself. \u00a0It will be well worth the effort, I assure you.<\/p>\n<p><strong>2) Heavy on the Delphi, light on C++, Prism, PHP and indeed DataSnap<\/strong><\/p>\n<p>I am a Delphi developer. \u00a0I don&#8217;t use RadPHP, C++ Builder or Prism, and I don&#8217;t use DataSnap. \u00a0Consequently I was not paying as much attention to those areas when they came up, nor does it particularly excite me to talk about those things. \u00a0Accordingly the focus in this post will be on Delphi. \u00a0And to be fair, most of the event content was focussed on Delphi. \u00a0C+ Builder was mentioned primarily in the context of &#8220;this stuff in Delphi is also in C++ Builder (and this stuff isn&#8217;t, yet)&#8221;. \u00a0There was quite a lengthy session on RadPHP and deploying a native code Android app derived from a RadPHP project. \u00a0Similarly there was a quite detailed session on generating proxies for DataSnap servers for various platforms, including RIM\/BlackBerry etc, as well as .NET and Objective-C.<\/p>\n<p>Again, if those areas interest you, you will get even more from the event than I did. \u00a0\ud83d\ude42<\/p>\n<p>So with those apologies out of the way let&#8217;s get stuck in&#8230;<\/p>\n<h2 style=\"font-size: 1.5em;\">Hang On! \u00a0Did you say iOS ?!<\/h2>\n<p>Absolutely! \u00a0This was the big surprise of the event. \u00a0Not only do we get <strong>Win32<\/strong>, <strong>Win64<\/strong> and <strong>OSX<\/strong> in this release but also <strong>iOS<\/strong>!!<\/p>\n<p>The iOS support isn&#8217;t yet in as finished state as the <strong>OSX<\/strong> support, but it is more than good enough to be usable imho, and improvements to this are high on the list, being expected in the first update pack or not long there-after.<\/p>\n<p>To be clear, the shortcomings are not in the compiler technology but in the integration with the debugger &#8211; at the moment you can compile, run and test\/debug your <strong>iOS<\/strong> app as a Win32 app in the IDE, but if you want to test and debug on the <strong>iPhone<\/strong>\/<strong>iPad<\/strong> simulator itself (or deploy to an actual device) then you have to compile the project in <strong>xcode<\/strong> on an actual Mac. \u00a0I am not entirely clear on how this works, but suffice to say there is no translation to <strong>Objective-C<\/strong> going on &#8211; the <strong>xcode<\/strong> compiler takes the ObjectPascal from Delphi, compiles it and then allows you to run and debug that ObjectPascal source in the <strong>xcode<\/strong> environment itself.<\/p>\n<p>Also, just as with OSX, the iOS support builds on the <strong>FireMonkey<\/strong> framework. \u00a0This means that &#8211; with a little care &#8211; you can write an <strong>iPhone<\/strong> app today (100% native and thus entirely welcome in the <strong>Apple Store<\/strong> &#8211; no if&#8217;s or but&#8217;s) and when the <strong>Android<\/strong> compiler support is delivered simply recompile for <strong>Android!<\/strong>!<\/p>\n<h2><strong>64-bit Windows?<\/strong><\/h2>\n<p>So, right out the gate I think the first question will be whether or not we finally have the long promised 64-bit Windows support in Delphi. \u00a0The answer to that is a resounding YES. \u00a0Rather anti-climactically though, the demonstrations of 64-bit&#8217;ness are spectacular non-events. \u00a0It. \u00a0Just. \u00a0Works.<\/p>\n<p>In the \u00a0<strong>Project Explorer<\/strong> there is now a new node under each project, entitled &#8220;<strong>Target Platforms<\/strong>&#8220;. \u00a0Here you will find an entry initially for <strong>32-bit Windows<\/strong> for existing projects. \u00a0Whether you can specify multiple targets when a project is created I am not sure, but even if not, adding a new target is as simple as adding the relevant node to the Target Platforms. \u00a0Just add the 64-bit Windows platform, make that the current selection (if not already), recompile and your work is done!<\/p>\n<p>Well, you may have a bit more work ahead of you if you have 32-bit assumptions built into your code, and those will need to be addressed, but other than that, switching a Delphi application from 32-bit to 64-bit really is that simple.<\/p>\n<p>There are some technical considerations that mean you may have to make some adjustments in your code, and I am sure these will be covered in more detail by numerous people over the coming weeks so shall not go into them here (if you know even a little about pointers and integer types then you can guess, or already know, what <span style=\"text-decoration: underline;\">most<\/span> of those potential problems are).<\/p>\n<h2>Mac OSX ?<\/h2>\n<p>Of course, one reason we have had to wait so long for the 64-bit Windows support was the decision to also address Mac support. \u00a0Was it worth the wait?<\/p>\n<p>I should Cocoa!! \u00a0[sic]<\/p>\n<p>Add <strong>Mac OSX<\/strong> to the <strong>Target Platform<\/strong>&#8216;s, recompile and off you go. \u00a0Right?<\/p>\n<p>Well, no. \u00a0Actually in this case things are a little more complicated since the VCL has not been ported to the Mac platform. \u00a0Yes, you heard that right. \u00a0The VCL is and remains specifically and firmly targeted at Windows. \u00a0This means that you will not be able to take an existing VCL application and simply recompile for OSX.<\/p>\n<p>FireMonkey is the new cross-platform GUI framework for building apps that support OSX. \u00a0FireMonkey also supports Win32 and Win64, as well as iOS and other platforms to come in the future. \u00a0So if you have an existing application that you wish to deploy to OSX you will first have to convert that application&#8217;s GUI to FireMonkey.<\/p>\n<p>I will say at this point that I think was the smartest decision Embarcadero have made but will talk about FireMonkey in more detail later.<\/p>\n<p>For now, once you have an application that can target Mac OSX, you compile it in Delphi and can then run it on a Mac to test\/debug. \u00a0Delphi itself remains a Win32 application, so debugging your Mac OSX app involves deploying the binaries to a Mac host and using the remote debugger (now called: <strong>Platform Assistant<\/strong>). \u00a0However, with a &#8220;Remote Profile&#8221; &#8211; a configuration entry attached to your OSX Target Platform &#8211; identifying a valid Mac host running the Platform Assistant server, this is all entirely seamless from within the Delphi IDE.<\/p>\n<p>&#8220;F9 to run and debug&#8221; was the goal and it has been achieved.<\/p>\n<p>Describing all this in words makes it sound very mundane and work-a-day ordinary.<\/p>\n<p>Actually seeing it in action is of course very much more exciting. \u00a0\ud83d\ude42<\/p>\n<h2>So just what is FireMonkey ?<\/h2>\n<p>As already mentioned, <strong>FireMonkey<\/strong> is an entirely new GUI framework. \u00a0I mentioned previously that it replaces the VCL for cross platform applications. \u00a0This is not strictly accurate. \u00a0The VCL is of course far more than just a GUI framework &#8211; all of those classes so familiar to use, such as <strong>TStringList<\/strong>, <strong>TList<\/strong> etc are strictly speaking part of the non-visual aspect of the VCL, and of course those elements are just as accessible from a <strong>FireMonkey<\/strong> application as they are today.<\/p>\n<p>Similarly things like <strong>DBExpress<\/strong> are all accessible from <strong>FireMonkey<\/strong>.<\/p>\n<p>Indeed, the root class in the <strong>FireMonkey<\/strong> framework extends <strong>TComponent<\/strong>, not <strong>TObject. <\/strong>But a\u00a0<strong>TButton<\/strong> in\u00a0<strong>FireMonkey<\/strong> is a very, very different animal from a\u00a0<strong>TButton<\/strong> in the VCL. (for one thing it resides in the unit <strong>FMX.Buttons<\/strong>, as opposed to <strong>VCL.Buttons<\/strong> &#8211; new namespaces keep the two frameworks apart).<\/p>\n<p>Also, whilst certain components in <strong>FireMonkey<\/strong> are provided in the form of specific root classes, the framework also makes extensive use of interfaces to establish contracts, not inheritance. \u00a0For example, an interactive control in <strong>FireMonkey<\/strong> does not have to extend any specific control base class, but it must implement the <strong>IControl<\/strong> interface, which provides methods necessary for focus and input in the <strong>FireMonkey<\/strong> framework.<\/p>\n<p>Similarly any component that implements <strong>IRoot<\/strong> may act as a top level container, <strong>IScene<\/strong> for providing a 2D surface and <strong>IViewport3D<\/strong> for implementing a 3D container.<\/p>\n<p>Yes, <strong>FireMonkey<\/strong> has 3D support built right in, and this includes being able to apply 3D transforms to 2D surfaces, even if those surfaces contain interactive controls &#8211; these aren&#8217;t just cosmetic 3D tricks. \u00a0You can take a <strong>FireMonkey<\/strong> form, rotate it in about the Y-axis (rotating the form surface &#8220;into&#8221;\/&#8221;out of&#8221; the screen) and it remains fully interactive and fully animated.<\/p>\n<p>Also built in are styles and filters. \u00a0You want to make your main form appear visually out of focus when presenting a modal dialog for the user to respond to? \u00a0Just go ahead and apply the Gaussian Blur filter on your form at a strength you deem appropriate. \u00a0It&#8217;s like having PhotoShop built in to your app, except that it doesn&#8217;t just work with images but with any element of your GUI, including the GUI itself!<\/p>\n<p><strong>FireMonkey<\/strong> also supports things call &#8220;Animations&#8221; (and on this point I agree with Malcolm Groves : this name is not very good &#8211; at best it isn&#8217;t quite accurate). \u00a0A <strong>FireMonkey<\/strong> isn&#8217;t an &#8220;animation&#8221;, although what they can used to achieve will &#8211; more often than not &#8211; be graphical animation.<\/p>\n<p>An animation is simply an object attached to some other component which &#8211; when activated &#8211; will change one of the components properties in some specified way and doing so over a period of time (independent on speed of the underlying hardware) in response to some event (or continuously, if you prefer). \u00a0The sorts of transformations that can be applied to the property being &#8220;animated&#8221; will vary according to the type of animation you configure.<\/p>\n<p>So, for example, you might attach an animation to a button control to change it&#8217;s <strong>Color<\/strong> property in response to a <strong>MouseEnter<\/strong> event, and a second animator to change it back again on <strong>MouseExit<\/strong>. \u00a0Or you might gradually increase the <strong>Width<\/strong> of a panel to cover a larger area.<\/p>\n<p>You can quickly see I think\u00a0(or rather <em>envision<\/em>, given the absence of actual pictures in this report! :)) how very slick and sophisticated GUI&#8217;s can be readily assembled using <strong>FireMonkey<\/strong>.<\/p>\n<p>You can also hopefully see how over-doing animations, filters and the other tricks at your disposal in <strong>FireMonkey<\/strong> could quickly result in the worst sort of garish and flamboyant interfaces.<\/p>\n<p>All good things in moderation! \u00a0\ud83d\ude42<\/p>\n<h2>And what is FireMonkey not ?<\/h2>\n<p><strong>FireMonkey<\/strong> is for building rich and dynamic business applications. \u00a0If you want a desktop app that has all the flair and panache of apps on the latest glossy touch based devices, the FireMonkey is the way to go.<\/p>\n<p>But it is not managed code. \u00a0It is 100% ObjectPascal and is therefore fully compiled to whatever target platform the Delphi compiler supports. \u00a0Under-the-hood it exploits GPU power to deliver it&#8217;s capabilities, but it accesses the GPU in a platform specific but portable fashion. \u00a0On <strong>Windows<\/strong> this means that it utilises <strong>Direct2D<\/strong> and <strong>Direct3D<\/strong>. \u00a0On OSX and iOS it uses <strong>OpenGL<\/strong>. \u00a0You, as an application developer, do not need to concern yourself with this level of detail however (there is a caveat to that statement which I shall come to in a moment).<\/p>\n<p>It is also not trying to be a platform for RIA (Rich Internet Applications). \u00a0<strong>FireMonkey<\/strong> does not try to compete with \u00a0<strong>Air<\/strong> or <strong>Silverlight<\/strong>. \u00a0It is not a framework for entire applications, nor does it spit out <strong>HTML 5<\/strong> or <strong>CSS<\/strong>.\u00a0\u00a0\u00a0<strong>FireMonkey<\/strong> is for desktop &#8211; and mobile &#8211; native code applications.<\/p>\n<p>Similarly it is not trying to be a platform for building games, although depending on the type of game you had in mind, it could be used for that of course. \u00a0But this is no different from simply stating the fact that ObjectPascal itself is not designed to build games &#8211; there are no language primitives or design tools in the language for creating sprites or isometrics worlds, but this doesn&#8217;t stop someone from using ObjectPascal to do those things if they wish.<\/p>\n<p>Similarly there are no such things in <strong>FireMonkey<\/strong>. \u00a0And no mention was made of any physics engine support in the framework, for example.<\/p>\n<p><strong>FireMonkey<\/strong> is for building applications.<\/p>\n<h2>Sounds great! \u00a0Why not put all this in the VCL ?<\/h2>\n<p>Those familiar with the recent history of Delphi will perhaps be aware that when the cross-platform project was started, the original intention was to build a cross platform derivative of the VCL, very similar to the approach in the ill-fated CLX of Kylix. \u00a0Indeed, it was realised only quite late in the day that if they were to continue down that path then the result would be a Curates Egg. \u00a0It would involve compromise both by those who had no interest in cross platform development, but also by those who did. \u00a0At the same time it was recognised that some existing technologies could be acquired and built upon to deliver something that would be a compelling replacement for the VCL.<\/p>\n<p>If people were going to have to change, give them very good reasons to do so.<\/p>\n<p>When you see what <strong>FireMonkey<\/strong> can do and the way is is put together, you will understand completely why the VCL had to be &#8220;left behind&#8221;. \u00a0But when I say that, I do not mean that the VCL is now a dead technology, far from it. \u00a0It shall continue to evolve and be supported for a long time to come I am sure. \u00a0But I am equally sure that once you see <strong>FireMonkey<\/strong> you will never want to write a VCL application again, even if you never intend writing for anything other than the Windows platform.<\/p>\n<h2>GPU Acceleration ? \u00a0But I\/my users don&#8217;t have a GPU !<\/h2>\n<p>A valid concern, and even worse, you may have a GPU but sometimes it can&#8217;t be accessed. \u00a0Some VM and\/or RDP platforms for example render the GPU inaccessible. \u00a0In those circumstances <strong>FireMonkey<\/strong> reportedly (these scenarios were not actually demonstrated) degrades. \u00a0I use that word advisedly. \u00a0There is no graceful &#8220;downgrade&#8221; built into <strong>FireMonkey<\/strong>. \u00a0If you use some element of <strong>FireMonkey<\/strong> in your application that relies on a GPU then those elements of your GUI will run, but they will not render. \u00a0They will be invisible to your users.<\/p>\n<p>So if those scenarios are important to you, you will have to avoid those aspects of <strong>FireMonkey<\/strong>. \u00a0Again, I am sure\u00a0more specific details and guidance on this issue will emerge over the next few weeks and months.<\/p>\n<h2 style=\"font-size: 1.5em;\">So I can gradually move to FireMonkey in my VCL app ?<\/h2>\n<p>Sadly not. \u00a0Well, not officially.<\/p>\n<p>Being platform independent, the <strong>FireMonkey<\/strong> framework does not rely on &#8211; nor indeed even directly use &#8211; the Windows message loop. \u00a0Or rather the way that is uses that message loop is completely and very technically different from the way that the VCL already does. \u00a0Also, the VCL contains several architectural aspects which are built very heavily and specifically on that messaging infrastructure in Windows.<\/p>\n<p>Consequently the two do not co-exist very happily. \u00a0Apparently it is technically possible to contrive to incorporate <strong>FireMonkey<\/strong> in an otherwise VCL application, but it is potentially unstable and &#8211; more important &#8211; not officially supported. \u00a0So if you do try it, good luck and well done if you can make it work, but you won&#8217;t get any help from <strong>Embarcadero<\/strong> if you can&#8217;t and it all blows up in your face.<\/p>\n<p>But whilst <strong>FireMonkey<\/strong> cannot site happily alongside the VCL in an application, a lot of the patterns that you are familiar with from the VCL have been respected in <strong>FireMonkey<\/strong> where-ever it has made sense to do so, to try to ease the transition from one to the other as much as anything I imagine.<\/p>\n<h2>So FireMonkey Means Lots of Change in our GUI ?<\/h2>\n<p>Yes. \u00a0Being an entirely new framework and being incompatible with the VCL (in terms of co-existence in the same app) means that if you have an existing app and wish to move it to <strong>FireMonkey<\/strong> then you will have to rewrite it&#8217;s GUI.<\/p>\n<p>I for one think this was the right move. \u00a0It means that <strong>FireMonkey<\/strong> is architecturally &#8220;clean&#8221; and not weighed down by any of the baggage that clinging to the VCL would have brought, and this should only continue to deliver huge rewards and benefits in the future.<\/p>\n<h2>But what About DataAware Controls ? \u00a0Does FireMonkey at least have those ?<\/h2>\n<p>No.<\/p>\n<p>Instead we now have <strong>LiveBindings<\/strong>. \u00a0These are not exclusive to <strong>FireMonkey<\/strong> &#8211; <strong>LiveBindings<\/strong> work in all Delphi code, be that old VCL or shiny new <strong>FireMonkey<\/strong>.<\/p>\n<p>Simply put, <strong>LiveBindings<\/strong> provide a connection between two properties on separate objects. \u00a0So you can for example bind the &#8220;<strong>Caption<\/strong>&#8221; property of a <strong>TLabel<\/strong> to the &#8220;<strong>DisplayName<\/strong>&#8221; of a <strong>TDBColumn<\/strong>.<\/p>\n<p>But these aren&#8217;t just simply property-to-property mappings. \u00a0<strong>LiveBindings<\/strong> employs an expression engine to evaluate the bound property values, so you could bind that label\u00a0<strong>Caption<\/strong> property to the expression &#8220;<strong>&#8216;Column Name is :&#8217; + Uppercase( DisplayName )<\/strong>&#8220;, for example. \u00a0Obviously such a binding is unidirectional &#8211; you could use it to set the label caption to the column name, but you could not use it to update the column name from the label as there is no way to easily &#8220;unwind&#8221; the expression.<\/p>\n<p>But where a simple property-to-property binding is created, these are &#8211; or can be (you decide) &#8211; bi-directional.<\/p>\n<p>Clearly, with such a framework a specialised &#8220;data aware&#8221; control hierarchy is unnecessary. \u00a0Not only can <strong>LiveBindings<\/strong> be used in place of such a specialised data aware framework (removing the need for separate, data aware versions of controls) but you can use these bindings for all sorts of purposes, not just data awareness.<\/p>\n<p>You want to display the value of a selected item in a listbox in the dialog caption ? \u00a0Go ahead, make a binding.<\/p>\n<p>And as a bonus, the expression engine that <strong>LiveBindings<\/strong> employs can be used stand-alone to evaluate any ObjectPascal expression, dynamically at runtime.<\/p>\n<h2>In Other News<\/h2>\n<h3><strong>RADPHP and PhoneGap<\/strong><\/h3>\n<p>Using <strong>jQuery<\/strong> in <strong>RADPHP<\/strong> and a technology called <strong>PhoneGap<\/strong>, you can now package up a PHP application and deploy it as a native Android application. \u00a0I am not entirely clear as to how this works, but it may be of some interest to those using PHP and wishing to target Android.<\/p>\n<h3>DataSnap Client Proxies<\/h3>\n<p>As briefly mentioned, <strong>DataSnap<\/strong> now provides a facility for automatically generating proxies for you to deploy to developers of client applications wishing to access your <strong>DataSnap<\/strong> server applications from a variety of other languages: \u00a0<em>Objective-C<\/em>, <em>C#<\/em>, <em>Delphi Prism<\/em>, <em>RIM BlackBerry<\/em> and others.<\/p>\n<p>Probably quite cool if you use <strong>DataSnap<\/strong>.<\/p>\n<h2 style=\"font-size: 1.5em;\">Colour me Excited!<\/h2>\n<p>Whew! \u00a0That was a mammoth post, and I am sure I have forgotten to mention something even in all that.<\/p>\n<p>Suffice to say that I was not alone among the 60-70 people attending today&#8217;s event to be heard saying &#8220;this is exciting&#8221;. \u00a0Everyone there was giving up and entire working day to hear the news of this release, and every single person I think stayed for the entire day and left very, very happy indeed.<\/p>\n<p>These could at last be the exciting times for Delphi that we have long been hoping for.<\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">[Estimated Reading Time: <\/span> <span class=\"rt-time\">12<\/span> <span class=\"rt-label rt-postfix\">minutes]<\/span><\/span> Today I was fortunate to be present in Auckland at the World Premier of the launch event for RAD Studio XE2. \u00a0There is so much good to report that I really don&#8217;t know where to begin, so apologies if this post is a bit of a disorganised ramble. \u00a0But here goes.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":[]},"categories":[4],"tags":[292,135,137,138,116,27,139,136],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1TKYv-bR","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":760,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/760\/","url_meta":{"origin":735,"position":0},"title":"Platform Independence Version Dependencies in the XE2 RTL","date":"14 Sep 2011","format":false,"excerpt":"So I have spent about a week now with XE2 and FireMonkey and thought I would share some of the experience so far. After an initial peek and poke around, the first order of business for me was to migrate some of my existing code to the new RTL. First\u2026","rel":"","context":"In &quot;Delphi&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1068,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/1068\/","url_meta":{"origin":735,"position":1},"title":"Info From the World Tour (Hamburg)","date":"22 Aug 2012","format":false,"excerpt":"In the Embarcadero forums, Roland Kossow posted his report on the first of the \"RAD Studio World Tour\" events in Hamburg yesterday, reporting on what's new in XE3 and adding some more detail to the \"XE3 And Beyond\" blog post. In a nutshell we have \"FM2\" (FireMonkey 2 - no\u2026","rel":"","context":"In &quot;Delphi&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":791,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/791\/","url_meta":{"origin":735,"position":2},"title":"Why Does My OSX FireMonkey App Think It Is a Console App ?","date":"15 Sep 2011","format":false,"excerpt":"Because System.IsConsole is hardwired to TRUE on MAC OS: This is actually also the case for $ifdef LINUX, but nobody is likely to notice that, at least not just yet. :) But it caused me no end of confusion when my FireMonkey app behaved one way on Windows and a\u2026","rel":"","context":"In &quot;Delphi&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1974,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/1974\/","url_meta":{"origin":735,"position":3},"title":"Improved Quality in Delphi &#8211; Yeah Right","date":"28 Oct 2013","format":false,"excerpt":"Here in Aotearoa there is a beer company called \"Tui\", named in turn for a native bird. As well as a series of TV ads voiced by the great Tom Baker, Tui are famous here for their \"Yeah, right!\" billboard ads. I felt compelled to make one for Delphi. I\u2026","rel":"","context":"In &quot;Delphi&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.deltics.co.nz\/blog\/wp-content\/uploads\/tui.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":936,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/936\/","url_meta":{"origin":735,"position":4},"title":"A Pain In The Butt","date":"31 Jul 2012","format":false,"excerpt":"This post is one of those classic double-entendres for which us Brits are (in)famous, involving as it does both an actual Pain In The Butt and a euphemistic one. I have been incapacitated recently by a sudden onset of sciatica caused - so my physio seems to think - by\u2026","rel":"","context":"In &quot;Delphi&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":843,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/843\/","url_meta":{"origin":735,"position":5},"title":"XE2 Update #4 On The Horizon","date":"19 Jan 2012","format":false,"excerpt":"The release notes for Update #4 have appeared online, signalling the imminent arrival no doubt of the update itself. The good news if you are using FireMonkey is that this is a significant update, including functionality for printing. The bad news is that like update #1, this update is not\u2026","rel":"","context":"In &quot;Delphi&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/posts\/735"}],"collection":[{"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/comments?post=735"}],"version-history":[{"count":11,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/posts\/735\/revisions"}],"predecessor-version":[{"id":746,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/posts\/735\/revisions\/746"}],"wp:attachment":[{"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/media?parent=735"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/categories?post=735"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/tags?post=735"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}