Friday, December 21, 2012

Tuesday, December 11, 2012

Submitting a C++Builder XE3 application to the Mac AppStore

Yesterday, I filled a hole in the schedule with an impromptu session on visualization of mathematical functions. At the end I also showed how to submit the application to the Mac AppStore.

At the end I ran into an error saying "Invalid Binary" and I filled in the details for my contact information that it asked me for.

However, this didn't solve the entire problem.

You also need to turn off Dynamic RTL and Run Time Packages. Unless you code sign them manually on the Mac side.

Finally, in order to bypass an issue with the Incremental Linker for Mac, you will need to turn off the Incremental Linker.

Doing these three things in addition gave me a successful submission to the AppStore.


C++Builder R&D sessions at CodeRage 7 tomorrow

Don't miss these R&D sessions tomorrow (Wednesday) at CodeRage 7:

9am PST - Migrating C++Builder Code to 64-bit

This session will cover differences between the Embacadero Win32 and Win64 C++ compilers, comparing keywords, macros, extensions and standards conformance of bcc32 and bcc64. The focus will be on strategies to port existing C++ Projects (ActiveX, WebBroker, SOAP, etc) and writing new code in a way that works for both Platforms.

Bruneau Babet - Embarcadero

12pm PST - C++Builder 64-bit Windows Compiler: Supporting the Delphi Extensions Including RTTI

The C++ language standard provides a naming convention to identify language extensions using the double underbar (__) in front of any extensions. This session will discuss the language and runtime extensions added to the new C++Builder 64-bit Windows compiler to support Delphi language, types, components and enhanced RTTI.

Eli Boling - Embarcadero

1pm PST - Using the C++ Standard and Boost Libraries in your 32-bit & 64-bit Applications
The C++ Standard library is a set of classes and functions that are part of the ISO standard for C++. The Boost C++ libraries include a collection of portable C++ source libraries created by Boost community members (, some of which are now included as part of the C++ Standard library. In this session you will learn how you can use the C++ Standard and Boost libraries in your C++ applications for Windows and Mac OS X.

Lee Cantey - Embarcadero


C++Builder XE3 64-bit and Update 1 for Delphi, C++Builder and RAD Studio XE3 released!

Yesterday we released the 64-bit compiler for C++Builder XE3.

At the same time, we also released Update 1 for Delphi, C++Builder and RAD Studio XE3. More details in Tim's post here.

Specific links: Delphi XE3 Update 1 C++Builder XE3 Update 1 RAD Studio XE3 Update 1

Fix List for Update 1


Friday, December 7, 2012

MVP Nuggets #2

Primoz Gabrijelcic led a workshop on Visual LiveBindings last week

Danny Wind wrotes an article "Why I Like FireMonkey"

Salvador Jover wrote a recap of the XE3 Tour that Danysoft hosted - Spanish - English (Google Translate)

I'd like to celebrate Salvador Jover in particular - he re-blogs and re-tweets just about anything that is Delphi related in the blogosphere! Thank you so much Salvador!

Zarko Gajic wrote about "Understanding Owner Drawing in Delphi"

He also wrote about "Understanding and Processing Keyboard events in Delphi"

He also wrote about "Understanding and Using Windows Callback Functions in Delphi"


Wednesday, December 5, 2012

Components vs Children in FireMonkey

You have probably iterated through the Components array many many times as a Delphi developer.

Consider this simple application:

It's probably no surprise that listing the Components of the form like this...

procedure TForm2.Button1Click(Sender: TObject);
i: Integer;
for i := 0 to ComponentCount-1 do
Memo1.Lines.Add(Components[i].ClassName+' (Name = "'+Components[i].Name+'")')
end; you the following output, which is very similar to the Structure View in the IDE, except that it doesn't show the relationships between the components.

Listing the children, and the children of all children (recursively) is simply done by using this procedure:

procedure TForm2.ListChildren(Obj : TFMXObject; Level : Integer);
i: Integer;
for i := 0 to Obj.ChildrenCount-1 do begin
Memo2.Lines.Add(StringOfChar(' ',2*Level)+
' (Name = "'+

procedure TForm2.Button2Click(Sender: TObject);

The above code will give us a tree output with indentation to show us the children, grandchildren, etc, like this:

The list of children is much longer than you would possibly except at first. We see for instance that in FireMonkey a TButton consists of a TLayout, a TSubImage and a TText. The TSubImage and the TText in turn have 4 animations each to handle hover-in/hover-out and pressing/releasing. Likewise the TMemo holds scrollbars, a popup context menu, and much more.

The entire output from ListChildren follows below:
TSubImage (Name = "")
TButton (Name = "Button1")
TLayout (Name = "")
TSubImage (Name = "")
TRectAnimation (Name = "")
TRectAnimation (Name = "")
TRectAnimation (Name = "")
TRectAnimation (Name = "")
TText (Name = "")
TColorAnimation (Name = "")
TColorAnimation (Name = "")
TColorAnimation (Name = "")
TColorAnimation (Name = "")
TMemo (Name = "Memo1")
TLayout (Name = "")
TSubImage (Name = "")
TRectAnimation (Name = "")
TLayout (Name = "")
TSmallScrollBar (Name = "")
TSmallScrollBar (Name = "")
TScrollBar (Name = "")
TScrollBar (Name = "")
TBrushObject (Name = "")
TBrushObject (Name = "")
TFontObject (Name = "")
TScrollContent (Name = "")
TPopupMenu (Name = "")
TPopupMenuContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TEdit (Name = "Edit2")
TLayout (Name = "")
TSubImage (Name = "")
TRectAnimation (Name = "")
TLayout (Name = "")
TLayout (Name = "")
TBrushObject (Name = "")
TBrushObject (Name = "")
TFontObject (Name = "")
TPopupMenu (Name = "")
TPopupMenuContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TMenuItem (Name = "")
TMenuItemContent (Name = "")
TContentEdit (Name = "")
TClearEditButton (Name = "ClearEditButton1")
TLayout (Name = "")
TSubImage (Name = "")
TRectAnimation (Name = "")
TRectAnimation (Name = "")
TRectAnimation (Name = "")
TSubImage (Name = "")
TRectAnimation (Name = "")
TRectAnimation (Name = "")
TRectAnimation (Name = "")
TButton (Name = "Button2")
TLayout (Name = "")
TSubImage (Name = "")
TRectAnimation (Name = "")
TRectAnimation (Name = "")
TRectAnimation (Name = "")
TRectAnimation (Name = "")
TText (Name = "")
TColorAnimation (Name = "")
TColorAnimation (Name = "")
TColorAnimation (Name = "")
TColorAnimation (Name = "")
TViewport3D (Name = "Viewport3D1")
TDummy (Name = "")
TDummy (Name = "")
TCamera (Name = "")
TSphere (Name = "Sphere1")
TCube (Name = "Cube1")
TTextureMaterialSource (Name = "TextureMaterialSource1")


Friday, November 30, 2012

MVP Nuggets #1

In "MVP Nuggets" I will be highlighting things that some of our MVPs have done in the last week or so.

Luciano Pimento wrote a tips and tricks article about improving performance and maintenance of your client/server applications.

Marcos Antonio Moreira did a Delphi multi-platform lecture at a university. He also did a University TV interview ahead of his talk. He blogs about it here.

Pedro Bento published an article "Introduction to Generics in Delphi" in Active Delphi (print magazine). His blog post.

Zarko Gajic wrote an article on "Creating, Parsing and Manipulating XML Documents with Delphi"

Juan Antonio Castillo wrote an article "Creating stylish applications in Delphi"

Alexander Bozhko celebrates the 3 year anniversary of DelphiFeeds.RU

Vladislav Bajenov writes about how to work with email attachements in Delphi

Nick Hodges writes about "Why You Should Choose Delphi"

Thanks to all active MVPs, and I look forward to highlighting more next time!

CodeRage 7 for C++ takes place December 10-12. Don't miss it.

CodeRage 7 for C++ takes place December 10-12. Don't miss it. It will be 3 days totally dedicated to C++!

Don't miss the special session with Bjarne Stroustrup. Much more details in David I's blog post here.

Register for CodeRage 7 for C++ now.

David I posted a great blog post on Embarcadero's continued commitment to C, C99 and C++ here.


EKON16 and Mobile Studio

This post is a little late. My apologies. :)

I had the great honor of keynoting at EKON16 in Dusseldorf earlier in November. I presented RAD Studio XE3 and our RAD Studio road map.

I also did a well attended session "What's Cooking in the Labs". I gave a sneak preview of Mobile Studio for about 45 minutes and showed where we're going with it. I showed the seamless integration of writing your code, designing your UI, debugging and deploying your app. I showed our use of some native controls, like the the date picker for selecting dates and even custom pickers (TComboBox in Delphi). I showed our native use of the notification dialog for ShowMessage instead of a custom window as before.

Mobile Studio is going to be very cool.

Thanks to the EKON16 crew in Germany!

Wednesday, October 31, 2012

CodeRage is next week! Register NOW!

CodeRage is less than a week away. If you haven't registered yet, why not just do it right now?

Register for CodeRage
Learn more about CodeRage

If you’re a software developer, this is your kind of conference.  It’s technical. It’s flexible. It’s free!
CodeRage serves up real-world technical sessions designed to provide you with information you can put to work immediately in your projects, in your environment.

CodeRage brings you top industry speakers and technologists presenting on a wide variety of topics, all geared toward maximizing your productivity. Session and presenter highlights include:

•    Delphi Product Address - John Thomas
•    What's New in the Delphi Language - Bob Swart
•    IDE Productivity Tips & Techniques - Brian Long
•    New Features of FireMonkey FM2 - Darren Kosinski
•    Building Scalable, Multi-tier Systems with DataSnap XE3 - Paweł Głowacki
•    Discover LiveBindings Advanced Features - Jim Tierney

...and so much more!

Attend the live online sessions and interact with session leaders and your peers.  Can’t make a session? No problem, return at your convenience and watch a video replay on-demand.

See you there!

Tuesday, October 30, 2012

BVS Solitaire Collection for Mac

BVS Solitaire Collection for Mac is written in Delphi XE3 using FireMonkey, and was approved a couple of weeks ago. It is available in the Mac App Store at


Thanks DAPUG and Jens Fudge!

I had the pleasure of speaking at a 2-day DAPUG workshop in Denmark on October 23-24. The work shop was a full house and sold out. I enjoyed the interactive crowd very much.

Very special thanks go out to Jens Fudge (MVP) and his family. They were awesome hosts for a couple of days after the workshop.

Thursday, October 4, 2012

Product or License Validation Error

If you ever see the error "Product or License Validation Error" pop up, the first thing you should do is Google the exact error message. If you do so, you will find the first hit to be exactly what you want - Starting RAD Studio 2010/XE/XE2/XE3 results in Product or License Validation Error.

Friday, September 21, 2012

Thanks Nirav Kaku, Embarcadero MVP!

Nirav is on FIRE!

Check these blogs out:

How I used Delphi’s RTTI Context with Custom Attributes using Datasnap + REST

Why you should use Delphi’s Unit Testing – DUNIT

Lot's of JSON, REST, JavaScript - Check out INDUG's blog for more of Nirav's posts!

Nirav also did a great presentation today on Web application development using Delphi, Datasnap, JavaScript, JSON and UniGUI (extJS).

Thanks Nirav!

Looking forward to CodeRage 7!!!

Thursday, September 20, 2012

RAD Studio Mobile Roadmap Published

For those of you chomping at the bit for information about our mobile plans for RAD Studio - here is the RAD Studio Mobile Roadmap as published today!


10,000 Developers Flock to Embarcadero RAD Studio XE3 World Tour

"We develop desktop, web and mobile software solutions for many different businesses that run on XP, Vista, Windows 7, Windows 8 and OS X," said Andrew Tierney, CEO CastleSoft. "We found that the new RAD Studio XE3 gives you an edge over your competition. We can quickly produce cross-platform Windows 8 style applications using its rich framework."

"I have worked with Delphi for the last 17 years, since Delphi 1," said Guinther Pauli, Software Engineer. "Without a doubt, Delphi XE3 is one of the best versions of Delphi of all time."

"With RAD Studio XE3 we can create and test all kinds of applications," said Adriano Santos, Operations Director, Get It! Technology. "RAD Studio XE3 is the tool that was needed to boost my sales, streamline the development process and raise the technical level of my startup."

Full article

Wednesday, September 19, 2012

Thank you Primoz Gabrijelcic!

Primoz Gabrijelcic, Embarcadero MVP in Slovenia, did an awesome job on the RAD Studio XE3 Launch in Ljubljana yesterday!

Thanks Primoz!

Brazil: Official FaceBook page and YouTube channel

We have a new Facebook page and a new YouTube channel for our community members in Brazil as follows.

Embarcadero Delphi Brasil Facebook page: Find out what's new with Embarcadero such as promotions, events, technical articles and videos.

Embarcadero do Brasil YouTube channel: Watch videos in Portuguese: product demos, tutorials and events such as webinars.


Thanks Juan Antonio Castillo!

Juan Antonio Castillo, Embarcadero MVP in Guatemala, did a great job presenting the RAD Studio XE3 Product Address today in a webinar. He gave people a quick intro to RAD Studio XE3, Windows 8, Metropolis, FireMonkey, Visual LiveBindings and more.

Thanks Juan!

Monday, September 17, 2012

Follow me

Shameless plug - follow @suited_aces on Twitter, please. Yep, that's me.



Sunday, September 16, 2012

EKON 16 November 5-7 in Düsseldorf, Germany

[caption id="attachment_39320" align="alignnone" width="300" caption=" "]EKON 16[/caption]

I'll be at EKON 16 doing the keynote and two more sessions.

Hope to see you there!

New MVP members

Please join me in welcoming the following nine new members of the Embarcadero MVP Program:

Bruno Fierens, Belgium
Francois Piette, Belgium
Kelyn Pena, Dominican Republic
Jim McKeeth, USA
Nirav Kaku, India
Martin Strohal, Germany
Mike Sutton, United Kingdom
Xavier Martinez, Spain
Zarko Gajic, Croatia

Thanks for your support guys! Looking forward to many awesome blogs, articles, etc. :)

RAD Studio XE3 World Tour in Full Force

Hopefully you've come to an event near you, or you're planning on coming to an event near you, to see what's new in RAD Studio XE3.

We're about half-way through the list of cities, but there are plenty left. :)

You can catch a glimpse of the excitement from Pawel's blog - Prague and Bratislava, as well as Stephen's blog - Oslo.

David I will be in London, Amsterdam, Warsaw and Heidelberg this coming week!

Don't miss the most exciting RAD Launch ever!

And don't forget - order XE3 in the next 12 days and you get the Bonus Pack - $250 worth of cool add-ons for free!

Record Helpers and Function Discovery

Rodrigo Ruz has written a whole bunch of great XE3 articles recently. He has a three part series on Winapi.Functiondiscovery and an article on Record Helpers for Simple Types here:

Winapi.Functiondiscovery Part 1

Winapi.Functiondiscovery Part 2

Winapi.Functiondiscovery Part 3

Record Helpers for Simple Types


Thursday, September 13, 2012

Embarcadero Affiliate Program - Make Money on Referrals!

Yes, you read that correctly. If you sign up as an Embarcadero Affiliate, use our banners and make sales happen, you will earn money!

What are you waiting for? Sign up now!


Monday, September 3, 2012

RAD Studio XE3: Laguna Hills, CA and Santa Monica, CA

If you're anywhere near Laguna Hills, CA or Santa Monica, CA, please consider coming to the RAD Studio XE3 Launch events!

The Laguna Hills event is 7pm-9pm on September 4th, and the Santa Monica event is 7pm-9pm on September 6th.

Please pre-register here for Orange County (Laguna Hills)

Please pre-register here for Los Angeles (Santa Monica)

See you there! :)

Thanks Australia and India!!!

Many thanks to our Australian and Indian crews for making my APAC Tour fun and rewarding!

Damien Bootsma and myself launched RAD Studio XE3 in Sydney, Melbourne and Brisbane. Anil Mahadev and myself launched it in Bangalore and Mumbai.

Thanks to everyone who came to the event. Lots of great conversations and interest!

Get involved!

If you're a Delphi Developer in Australia you should join ADUG - Australian Delphi Users Group - your local Delphi user group in Australia.

If you're a Delphi Developer in India you should join INDUG - India Delphi User Group - your local user group in India.

Thanks again to Australia and India!

Tuesday, August 21, 2012

The Embarcadero MVP Program

You may have heard of this program under the working name of "Embarcadero Evangelist Program". The official name will be "The Embarcadero MVP Program". It's a program tailored to recognizing our awesome advocates in our great community.

An official landing page with links to everyone's pages etc, as well as official logos, and other materials are in the works, but I wanted to take this opportunity to preview the program if you will, just like we're starting off the XE3 World Tour as preview events.

It brings me great pleasure to announce this program, and to give you the list of the current MVPs. Some of them have already blogged and/or tweeted. More people are in the queue for sure, and I'm hereby asking anyone that wants to, to send me name and contact information for anyone that you believe should be an MVP. An MVP is someone who is a well known advocate in the community, and does great stuff for everyone's benefit.

Without further ado, here is the current list of MVPs ordered by country:


Glenn Stephens
Lachlan Gemmell


Filip Lagrou


Adriano Santos
Alan Glei
Caique Rodrigues
Carlos Agnes
Daniel Wildt
Guinther Pauli
Luciano Pimenta
Marcelo Nogueira
Marcelo Varela
Marcos Antonio Moreira
Marcos Gomes
Newton Michel de Oliveira
Pedro Bento
Ricardo Boaro
Rodrigo Carreiro
Samuel David
Victory Fernandes


Radek Cervinka


Jens Fudge


Didier Cabale
Felix Colibri


Daniel Magin
Daniel Wolf
Uwe Raabe


Juan Castillo


Marco Cantu


Eliseo Gonzalez
Marco Santin


Bob Swart
Danny Wind


Alister Christie


Jose Castillo


Alexander Alexeev
Alexander Bozhko
Andrey Terekhov
Vladislav Bajenov


Primoz Gabrijelcic


Germán Estévez Ruiz
Luis Alfonso Rey
Salvador Jover


Magnus Flysjö


Brian Long


Alan Fletcher
Cary Jensen
Nick Hodges
Ray Konopka
Robert Love
Olaf Monien


Luis Felipe González Torres

Thanks again to all these great folks, and everyone else for their support. As I said, please remember, this is not an exhaustive list by any means, but I think it's a great start for the program. More names will be added over time, and assets to recognize these great folks will be forthcoming.


Monday, August 20, 2012

XE3 and Beyond

JT just blogged "XE3 and beyond" where he goes into detail about our upcoming Mobile Tool Chain.

A must read, folks!


Wednesday, August 15, 2012

RAD Studio XE3 World Tour - Get a look under the surface

2012 World Tour Image

Come see what’s new in RAD Studio XE3 at a free World Tour event near you!

Exciting new versions are coming soon. Be among the first to see what's new in RAD Studio XE3 – including Delphi, C++Builder, Prism, InterBase and the new HTML5 Builder at one of these live launch tour events.

Get ready to develop apps for Windows 8. Learn how to give your existing VCL and FireMonkey apps a new Windows 8 look and functionality. See what's new in FM2, the next generation FireMonkey application platform. And get a first look at the newest member of the RAD Studio family – HTML5 Builder!

Yours truly will be in Sydney, Melbourne, Brisbane, Bangalore and Mumbai as follows:

Sydney - August 22, 2012 at 8:30am-12:30pm
Melbourne - August 23, 2012 at 8:30am-12:30pm
Brisbane - August 24, 2012 at 8:30am-12:30pm
Bangalore - August 27, 2012 at 4:00pm-9:00pm
Mumbai - August 29, 2012 at 4:00pm-9:00pm

See you soon!

Wednesday, August 1, 2012

FireMonkey eBook coming!

Graeme Chandler has spilled some beans! He's coming out with a FireMonkey eBook at the end of August according to this comment on my blog!

Friday, July 27, 2012

Thursday, July 26, 2012

Book: Delphi XE2 Foundations by Chris Rolliston

I've been super busy lately, and just caught up on some newsgroup postings, and found this gem!

Delphi XE2 Foundations

If I were you, I'd buy this book purely based on the 5-star ratings!


Monday, July 23, 2012

Webinar: VCL to FireMonkey migration

Register for my VCL to FireMonkey migration webinar and get a free copy of Mida Converter!

The webinar takes place three different times on July 25th. See above link for details.


Wednesday, June 13, 2012

Replay for "Creating iOS Apps Using Delphi XE2" is up

The replay

In other news, the app update I submitted during this webinar (Anders' Analog Clock) was approved last night and is available in the AppStore now.


Monday, June 4, 2012

Webinar: Creating iOS Apps Using Delphi XE2

Join me for my webinar "Creating iOS Apps Using Delphi XE2" on Wednesday June 6th at 6am, 11am and 5pm PDT.

PS: MathViz 1.1 for iOS is now free in the AppStore. Enjoy!

Thursday, May 24, 2012

Reflection for Mac

Just bought this brilliant piece of software -

Now I can demo iPhone/iPad apps on the Mac without cables.

It works over AirPlay with no software needed on the iPhone/iPad.

Works with iPhone 4S and iPad 2+.

I've already made sure that Camtasia can screen record the iPad screen on the Mac as well. Looking forward to using this in upcoming webinars!

Tuesday, May 15, 2012

MathViz for iOS updated and free for two days!

MathViz 1.1 update has been approved. I added gesture support and a reset button.

Pardon me while I play around and get a feel for how pricing campaigns work... ;)

MathViz 1.1 is free for two days. I believe I exhausted the potential for new customers (without doing any marketing) so the party right now is up to just a couple of pizzas (if I do Papa Murphy's Take'n'Bake)... ;)

Please feel free to download MathViz in the next couple of days while it's free. Please consider reviewing it as well.

BTW, MathViz will be permanently free at some point, and the source code will be freed at some point as well.

Thanks for playing! Enjoy!

Tuesday, May 8, 2012

Playing sound on iOS? Anyone have a working Delphi XE2 FireMonkey sample?

I wish I had time for everything... I've tried this one a couple of times, but have run into issues with parsing framework this and that... ;)

So, here it is... Anyone got a simple example that plays a single sound effect and/or plays a background track?

From files that you deploy with the app (resources).

Background track from existing music library on device would be a sweet bonus.

I'll make sure you get credit if I use it in upcoming blogs, webinars, etc.


Monday, May 7, 2012

3 more iOS components added - Pinch/Zoom/Rotate gesture recognizers plus a custom switch

I've uploaded three more components to CodeCentral. There are now 13 components and 8 demos in my submission.

The three components added:

PinchGestureRecognizer - zoom/pinch

RotationGestureRecognizer - rotation

Switch - custom labels for TSwitch - ON/OFF or YES/NO (or any 1-4 letter words you want)


Modifying FMX_Platform_iOS.pas to support surface mainWindow and add device orientation support

Here are the steps that I use in order to surface a couple of things that some of my custom iOS components and apps need.

These modifications are not supported by anyone. Except maybe me. You apply them entirely at your own risk.

Modify FMX_Platform_iOS.pas on your MAC as below. It's typically located in the /Developer/Embarcadero/fmi directory.

CAUTION: Save a copy of FMX_Platform_iOS.pas FIRST!
CAUTION: Any update of XE2 will delete your changes, so keep this file around if you have to redo the changes.


unit FMX_Platform_iOS;




// TUIViewController and TUIWindow declarations moved from implementation to interface section

{ TUIViewController }

TUIViewController = objcclass(UIViewController)
function shouldAutorotateToInterfaceOrientation(AinterfaceOrientation: UIInterfaceOrientation): Boolean; override;
procedure didReceiveMemoryWarning; override;
procedure didAnimateFirstHalfOfRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation); override;
procedure didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation); override;

{ TUIWindow }

TUIWindow = objcclass(UIWindow)
Text: UITextField;
mainView: UIView;
mainController: TUIViewController;

// mainWindow moved from implementation to interface section
// currentOrientation added to give current device orientation
// supportsPortrait etc added. You simply change these in your app code to False if not needed

mainWindow: TUIWindow;
currentOrientation : UIInterfaceOrientation;
supportsPortrait : Boolean = True;
supportsPortraitUpsideDown : Boolean = True;
supportsLandscapeRight : Boolean = True;
supportsLandscapeLeft : Boolean = True;



function TUIViewController.shouldAutorotateToInterfaceOrientation(
AinterfaceOrientation: UIInterfaceOrientation): Boolean;
Result := ((AinterfaceOrientation = UIInterfaceOrientationLandscapeRight) and supportsLandscapeRight) or
((AinterfaceOrientation = UIInterfaceOrientationLandscapeLeft) and supportsLandscapeLeft) or
((AinterfaceOrientation = UIInterfaceOrientationPortrait) and supportsPortrait) or
((AinterfaceOrientation = UIInterfaceOrientationPortraitUpsideDown) and supportsPortraitUpsideDown);

if Result then
currentOrientation := AinterfaceOrientation;


Saturday, May 5, 2012

iOS Formula Keyboard

Just a teaser. I'll probably add this as an InAppPurchase for MathViz when I make MathViz free. ;)

Thanks to those who bought MathViz already! 25 copies sold for $0.99 each in 4 days! Enough for a couple of six packs for the office. ;)

PS: Source code for this one coming too. Mainly custom style work in this one.

Friday, May 4, 2012

May the Force be with you! (and MyEDN for iOS)

Happy Star Wars Day!

MyEDN was originally submitted to the AppStore for review on April 9th.

My first mistake was not including, setting up and populating a test account for Apple to test MyEDN. DOH!

That cost me about a week, because the review process is clocking at about 6-7 days it seems.

They sent me a request to update the review notes with a test account and test instructions, and finally submit the new meta data. Unfortunately the reviewer had put MyEDN in the wrong state, and it took me a while to figure out that the only way to get it back into Waiting for Review was to submit a new binary (actually the same one).

About a week later it was rejected with some unspecific pointers about the UI. This was the login screen at this point:

I asked for clarification, and got another couple of messages back from the reviewer that weren't specific enough for me to figure out what exactly they wanted instead.

I decided to use the Appeal option, and while waiting for that process I ripped the UI apart and recreated it from the ground up. I added info screens throughout as well as more functionality.

Yesterday I got a call back from a very nice person of the App Review Board, and it became clear that the issue wasn't UI at all. I had a link to in my description of MyEDN. This is considered disallowed marketing, even though my phrasing was specifically "PS: An EDN account is required to use this app. If you don't have one, you can create one here..." - in retrospect a link to would probably have worked better, but I opted to remove the link completely. I don't foresee anyone that isn't already an EDN member downloading MyEDN anyway. Finally, Apple had also found a crash bug, which is now addressed.

By this time I already had the new UI ready to go. My plan was to make it an update, but since MyEDN still wasn't approved I simply uploaded it as a new binary and it's now pending review in this form:

I'm much happier with this look and feel, and my hope is that the Force is with MyEDN this time. If the review cycle stays on it's current 6-7 day schedule MyEDN should go into review by the end of next week, and hopefully I've knocked out all issues and it will be approved so that you guys can have at it. I can't stand the fact that Cleggy teases me on a daily basis that EDN Mobile has been in Google Play for weeks and that he's updated it multiple times in the last couple of days. I told him that in his case no review was required, and that his UI is still nowhere near mine. Apple is holding MyEDN to a much higher standard than that! So there, Cleggy... ;)


PS: All this experience with App Review feedback, Appeal etc will be awesome fodder for upcoming webinars as well, so that all of you can create awesome iOS apps.

Tuesday, May 1, 2012

MathViz 1.0 for iOS approved and in the AppStore now!!!

MathViz 1.0 AppStore link

Before you ask why it's $0.99 and not free - I wanted to see if I could get a FireMonkey paid app approved, and I'm very happy to say that I could. And anyone can, of course!

I will leave it at $0.99 for the next couple of weeks, and anyone that wants to "donate" to a lunch, dinner, party or whatever it turns out to be, can do so in the next couple of weeks. After that it will become free for all.

The link above is live, but it will take up to 24 hours for MathViz to be searchable in the AppStores world wide.

Your purchases of MathViz will go to a couple of things - Apple, the IRS and finally some kind of FireMonkey party of some kind - total volume of paid sales and actual payouts from Apple will determine what will happen.

Now that MathViz is available I will use it for blog fodder, webinar fodder, and I will of course publish the source code.

Thanks everyone in advance for playing and giving feedback!

MathViz 1.0 is powered by TExpressionParser - a flexible and fast expression parser for logical and mathematical functions by Egbert van Nes, with contributions by John Bultena and Ralf Junker. Thanks for Egbert van Nes' explicit permission to use it in a paid app. :)

Sunday, April 15, 2012

Delphi Developer Days and Free Evening Events this week

I'm headed to Delphi Developer Days to do the Embarcadero keynote as well as a free evening event in each city - Washington DC (BWI area) and Chiacgo. Don't miss free food, drink and potentially valuable discounts at these events!

See you there!

Friday, April 13, 2012

Math parsing function/component anyone?

I'm looking for a reasonably light-weight, simple and fast math function parser. It should not be a DLL. I need it to work on Windows, MacOSX and iOS. I would use it in a demo I want to build.

It must be able to parse and evaluate functions of (at least) two variables, for instance f(x,y) = sin(x^2+y^2)/(x^2+y^2).

I would use it like this (pseudo code):
FuncTree := BuildEvalTree('f(x,y) = sin(x^2+y^2)/(x^2+y^2)'); // Or whatever it needs
for x := x_min to x_max do
for y := y_min to y_max do
z[x,y] := Evaluate(FuncTree,[x,y]); // Or whatever it needs...


Thursday, April 12, 2012

Solution: armv7 validation errors when submitting FireMonkey iOS apps to the AppStore

EDIT: This post is now outdated. HotFix 1 addresses this issue, and these steps are no longer needed!

I was trying to record the process of submitting an app last Friday. My EDN app was ready for the AppStore. I ran into this:

iPhone/iPod Touch: application executable is missing a required architecture.
At least one of the following architecture(s) must be present: armv7

This happens on the validation step of submitting an app to the AppStore. The reason is that the validation step for AppStore submissions has changed. Support for *only* armv6 is no longer allowed. You have to support armv7, either by itself or have dual support (armv6 and armv7). This is a recent change, since I was able to submit my previous Analog Clock app in late October last year.

I've spent much of the last week trying to solve this problem. I did a bunch of research, but there was no single magic bullet anywhere. I finally cracked it. And here is the solution. I apologize in advance if some steps are missing. I tried to capture every single step I had to take.

STEP 1: Rebuilding iPhoneAll for armv7

Phil Hess has an excellent page that explains this process -

You don't actually need to parse anything for this purpose. You can jump directly to Phil's Step 4 and build iPhoneAll for armv6/armv7 as follows:

./ iPhoneAll.pas

Then Phil's Step 5 from the link above (this moves the compiled targets in place):
mv iPhoneAll.o /usr/local/lib/fpc/2.6.0/units/arm-darwin/cocoaint/
mv iPhoneAll.ppu /usr/local/lib/fpc/2.6.0/units/arm-darwin/cocoaint/
mv AnonClassDefinitionsUikit.o /usr/local/lib/fpc/2.6.0/units/arm-darwin/cocoaint/
mv AnonClassDefinitionsUikit.ppu /usr/local/lib/fpc/2.6.0/units/arm-darwin/cocoaint/

STEP 2: Rebuilding the FPC RTL for armv7

We'll use the following link as a base line -

We need to modify the steps for iOS5.0 as follows:

Jump into Super User mode:

sudo bash

export IPHONEPLATFORMBASEDIR=/Developer/Platforms/iPhoneOS.platform/Developer

make clean

make FPC=/usr/local/lib/fpc/2.6.0/ppc386 CPU_TARGET=arm CROSSOPT="-FD${IPHONEPLATFORMBASEDIR}/usr/bin -XR${IPHONEPLATFORMBASEDIR}/SDKs/iPhoneOS5.0.sdk/ -ap -Cparmv7 -Cfvfpv3" all

sudo make FPC=`pwd`/compiler/ppcrossarm OPT="-ap" CPU_TARGET=arm CROSSOPT="-FD${IPHONEPLATFORMBASEDIR}/usr/bin -XR${IPHONEPLATFORMBASEDIR}/SDKs/iPhoneOS5.0.sdk/ -ap" install CROSSINSTALL=1

sudo ln -sf ../lib/fpc/2.5.1/ppcrossarm /usr/local/bin/ppcarm

STEP 3. Modify the Run Script for project under Build Phases for your Target in Xcode

Replace the -Cfvfpv2 flag with both of these flags -Cparmv7 -Cfvfpv3. A typical excerpt from the Run Script will now say:

/usr/local/lib/fpc/2.6.0/ppcrossarm -gw -g -godwarfsets -Xg -O1 -Cparmv7 -Cfvfpv3 -MDelphi -B -o$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH -Fu/usr/local/lib/fpc/2.6.0/units/arm-darwin/fmi -Fu/Developer/Embarcadero/fmi -Fu/Developer/Embarcadero/fmi/coretext -Fu/Developer/Embarcadero/fmi/fpclib -XR$SDKROOT -FD$PLATFORM_DEVELOPER_BIN_DIR "$PROJECT_DIR/../$PROJECT.pas"

Drop armv6 from Architectures under Build Settings for your Project if it's set.

Good luck!

Thursday, March 29, 2012

Who would pay $0.99 for my iOS app?

I've been hacking away at my EDN iOS app. Here are a few screen shots of what it looks like in development. I have a few things I need to polish and then I will submit it to the AppStore.

Technical details:

* Communicates with the EDN MemberShip Services DataSnap REST Server

* You can log in, view your details, edit your details and post changed details back

* You can get all your registered products and serial numbers

* You can choose to persist username/password or not

* Works on all iOS devices and all device rotations!

Maybe it's worth more than $0.99? Especially if you get the full source code... ;)

This is what my app looks like when you launch it:

[caption id="attachment_39242" align="alignnone" width="200" caption="Just need a password..."]Just need a password[/caption]

This is what it looks like when you fail to login:

[caption id="attachment_39241" align="alignnone" width="200" caption="Access denied!"]Access denied![/caption]

This is what my user details look like:

[caption id="attachment_39243" align="alignnone" width="200" caption="My user details"]My user details[/caption]

Friday, March 16, 2012

FireMonkey and iOS 5.1

I finally upgraded to Lion and Xcode 4.3. Also iOS 5.1 on my iPhone 4.

I can happily confirm that FireMonkey apps work great on iOS 5.1 devices.

I already had Snow Leopard and Xcode 4.2 before. All it took was upgrading to Lion and then getting Xcode 4.3. That's it. I did not have to reinstall FPC or FMI at all.

Thursday, March 15, 2012

This, ladies and gentlemen, is a working iOS DataSnap client for EDN services!

In the coming weeks, I will be blogging about how to create your own iOS client to access any DataSnap server.

Did someone say we don't have TDataSet on iOS? Yeah, that might have been me. So wrong! We do!

In fact, here's a (condensed) code snippet from this app:
Proxy := CreateProxy;
DS := Proxy.GetRegistrations(Session);

while not DS.EOF do begin
Memo1.Lines.Add(DS.FieldByName('TITLE').AsString+' '+DS.FieldByName('REGISTRATIONS').AsString);

Once the app is finished, my goal is to upload it to the AppStore and record the whole process so that I can publish the video as a tutorial on AppStore submission for FireMonkey apps as well. All it takes is time... ;)

Friday, March 9, 2012

iOS Camera/Photo demo - PREVIEW - AS-IS

I'm only posting this because a lot of folks have been asking for it.

This demo is provided as-is with no guarantees of working on any device whatsoever.

You have been warned. It's by no means complete. Not even tested since 10/11/2011 - not tested on iOS 5.0 or 5.1. Last I tested it was on 4.3 I think.

I'll replace it when I get time to finish it. Feel free to send me back a 10x better version.

BTW - you *have* to hack FMX_Platform_iOS.pas and know what you're doing to use this demo. You have to surface mainwindow and whatever else Xcode tells you is missing. You can do so by moving the declarations from the implementation section to the interface section. All warranties may very well be void by doing so, so back the file up before breaking it.

Disclaimer done... ;)


Monday, February 20, 2012

Camera.Target fix

There's a missing call to MatrixChanged(Self) in TCamera.SetTarget. Without this second line, setting the Target does nothing.

procedure TCamera.SetTarget(const Value: TControl3D);
FTarget := Value;

This fix is required for my upcoming Kepler System demo.

Wednesday, February 1, 2012


[caption id="attachment_39211" align="alignnone" width="164" caption="FireMonkey Pool Table"]FireMonkey Pool Table[/caption]

Tuesday, January 24, 2012

iOS Address Book fun

Getting data out of the iOS address book is a lot harder than I thought... Must make component... ;)

Here's a Q&D routine I managed to eek out today. It simply prints all contacts and all their numbers to the log console.

iPhoneAll, AddressBook, CFArray, CFBase;

procedure DumpAddressBook;
addressBook : ABAddressBookRef;
allPeople : CFArrayRef;
nPeople : CFIndex;
ref : ABRecordRef;
i, j : Integer;
firstName : CFStringRef;
lastName : CFStringRef;
phoneNumber : CFStringRef;
l, v : CFStringRef;
S : NSString;
addressBook := ABAddressBookCreate;
allPeople := ABAddressBookCopyArrayOfAllPeople(addressBook);
nPeople := ABAddressBookGetPersonCount(addressBook);

for i:=0 to nPeople-1 do begin
ref := CFArrayGetValueAtIndex(allPeople,i);

firstName := ABRecordCopyValue(ref,kABPersonFirstNameProperty);
lastName := ABRecordCopyValue(ref,kABPersonLastNameProperty);
if firstName <> nil then
if lastName <> nil then
S := NSString.stringWithFormat(NSSTR(PChar('%@, %@')),lastName,firstName)
S := NSString.stringWithFormat(NSSTR(PChar('%@')),firstName)
if lastName <> nil then
S := NSString.stringWithFormat(NSSTR(PChar('%@')),lastName);

phoneNumber := ABRecordCopyValue(ref, kABPersonPhoneProperty);
for j:=0 to ABMultiValueGetCount(phoneNumber)-1 do begin
l := ABMultiValueCopyLabelAtIndex(phoneNumber,j);
v := ABMultiValueCopyValueAtIndex(phoneNumber,j);
S := NSString.stringWithFormat(NSSTR(PChar('%@: %@')),l,v);

if phoneNumber <> nil then
if firstName <> nil then
if lastName <> nil then

Handling Swipe Gestures in FireMonkey for iOS

I've added a component to handle left, right, up and down swipe gestures to my set of iOS components.

Here's the full set!

NOTE: This component requires that you edit the FMX_Platform_iOS.pas file on the Xcode side to surface mainWindow and a few other things.

Once installed, this component is extremely easy to use. Simply hook up the OnSwipe events that you'd like to handle and you're done!
TSwipeEvent = procedure of object;

TiOSSwipeGestureRecognizer = class(TFmxObject)
FOnSwipeRight : TSwipeEvent;
FOnSwipeLeft : TSwipeEvent;
FOnSwipeUp : TSwipeEvent;
FOnSwipeDown : TSwipeEvent;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property OnSwipeRight: TSwipeEvent read FOnSwipeRight write FOnSwipeRight;
property OnSwipeLeft: TSwipeEvent read FOnSwipeLeft write FOnSwipeLeft;
property OnSwipeUp: TSwipeEvent read FOnSwipeUp write FOnSwipeUp;
property OnSwipeDown: TSwipeEvent read FOnSwipeDown write FOnSwipeDown;


Friday, January 6, 2012

Job Opening at Embarcadero! Come join me!

We're looking for an Architect to join the RAD Studio Team.

Embarcadero Technologies is seeking an Architect to join the leadership staff of FireMonkey, Embarcadero’s next generation business application platform. The FireMonkey platform helps you build spectacular applications that are faster, more visually stunning, and more connected – all with native performance on Windows, Mac, and iOS.