<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8837899541977019574</id><updated>2025-01-18T00:28:55.503+01:00</updated><category term="delphi"/><category term="reusable code"/><category term="programming philosophy"/><category term="Generics"/><category term="fdclib"/><category term="anonymous methods"/><category term="Google+"/><category term="custom grid"/><category term="FireMonkey"/><category term="XE2"/><category term="blog"/><category term="community"/><category term="optimize"/><category term="pricing"/><category term="book"/><category term="case"/><category term="porting"/><category term="vcl"/><category term="Android"/><category term="Blogger"/><category term="Embarcadero"/><category term="Enumerated types"/><category term="LiveBinding"/><category term="RAD Studio"/><category term="RESTful"/><category term="RTTI"/><category term="WinRT"/><category term="Windows 7"/><category term="Windows 8"/><category term="Wishlist"/><category term="XAML"/><category term="about"/><category term="binary"/><category term="bind"/><category term="bug"/><category term="cache"/><category term="compiler"/><category term="cross platform"/><category term="database"/><category term="debugging"/><category term="eurekalog"/><category term="fmx"/><category term="forms"/><category term="frames"/><category term="input"/><category term="java"/><category term="logging"/><category term="management"/><category term="native code"/><category term="noteworthy"/><category term="pointers"/><category term="popularity"/><category term="process"/><category term="questions"/><category term="review"/><category term="search"/><category term="snippet"/><category term="soapbox"/><category term="social"/><category term="software"/><category term="source"/><category term="strings"/><category term="syntax highlight"/><category term="time"/><category term="usability"/><category term="validation"/><category term="web services"/><category term="wishful"/><category term="wizard"/><category term="wp7 microsoft ebook"/><title type='text'>program begin end. // comments?</title><subtitle type='html'>Delphi Programming - Real programmers write comments mostly in or about other peoples code.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>63</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-3388840939651980475</id><published>2014-11-11T01:06:00.000+01:00</published><updated>2014-11-11T01:06:37.183+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="management"/><category scheme="http://www.blogger.com/atom/ns#" term="process"/><category scheme="http://www.blogger.com/atom/ns#" term="programming philosophy"/><category scheme="http://www.blogger.com/atom/ns#" term="software"/><title type='text'>My Job Is To Meet Expectations</title><content type='html'>&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;i&gt;This is a reply to the article &lt;a href=&quot;https://medium.com/@lauraklein/your-job-is-not-to-write-code-d002609b117a&quot; target=&quot;_blank&quot;&gt;Your Job Is Not to Write Code&lt;/a&gt; by&amp;nbsp;&lt;a class=&quot;g-profile&quot; href=&quot;https://plus.google.com/109689049773311040486&quot; target=&quot;_blank&quot;&gt;+Laura Klein&lt;/a&gt;.&lt;/i&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;b&gt;It IS my job to write code.&lt;/b&gt; That code has to meet the expectations of the end users, the product manager (PM), the Quality Assurance Manager (QM), the support team, and myself.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;The PM has to set the bar. Functionally and performance wise. If the PM leaves it up to me to decide what the code should run on, on what kind of hardware, that PM is not filling the role. The PMs are the ones that set the targets.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;In a proper development team, it is NOT the developers job to test that the code runs on all variants of hardware. This is where you have testers, and a PM and a QA Manager (QM) that define the bar of what is acceptable function and performance in accordance with the specification you created.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;The developer may be given his/her own test machine which can be used for “worst case” scenarios, but it is the test team that has to validate on a decent sample set of environments.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;I might be a hired hand, and probably do not know all there is about the trade that the software is developed for, nor do I know the clients or how they actually use the software. Over time, I might learn this, but only as far as the PM lets me.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;It is my job to think of the what-if’s. Actually, writing code is all about what-if’s. However, it is the specifications that decide the scope of the what if’s.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Should I recognize different number formats? Date formats? International characters? Right to left text? What should the default value be when a calculation fails due to a division by zero? What should the correct behavior be when a criteria is not met? All these things are about specifications defined by the PM according to the needs of the clients.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;When I “check in code”, I should NEVER EVER check it into production. I should push it to a proper staging environment, and write roll out documentation, then the test team should roll it out on a test environment, validate that it works, refine documentation and then hand it to the support team for rollout to production.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;If the PM did not ensure that there is proper QA, it is that PM that is responsible for the shitty code in production. If the product doesn&#39;t do what the customer expects, it’s the PM that did not write proper use cases and proper specifications and operational parameters, and it would be the PM that did not ensure that the QM had created the necessary test cases and functional specifications.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;My skill is not customer management. My skill is not necessarily to know the business that the client is in. My skill is to transform various degrees of incomplete specifications into something that resembles what the customer wants, within reasonable time, and with a reasonably high quality.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;The PMs are the ones that defines what the customer wants.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;The QMs decide if what I wrote, meets that definition.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;The support team will be the ones that verify that the definition actually was complete and correct.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Good software meets expectations. Good software is a process. Good process depends on team work. Team work depends on a certain degree of separations of roles. Roles are defined by responsibilities.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;My role as a developer is to write code that meets expectations.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;In some companies, these roles may boil down to just a few people — or even just a single individual. The roles are still there. The responsibilities are still there.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;If the CEO doesn&#39;t understand or care about these roles and allot the necessary time and/or resource — that company will be fighting fires, playing blame games, and losing clients.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Sincerely,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Your Developer&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Lars Fosdal&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/3388840939651980475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2014/11/my-job-is-to-meet-expectations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/3388840939651980475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/3388840939651980475'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2014/11/my-job-is-to-meet-expectations.html' title='My Job Is To Meet Expectations'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-2397370100993028369</id><published>2014-08-15T09:25:00.000+02:00</published><updated>2014-08-15T09:27:56.946+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="community"/><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Google+"/><title type='text'></title><content type='html'>&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.2000007629395px;&quot;&gt;The Google+&amp;nbsp;&lt;a href=&quot;https://plus.google.com/u/0/communities/103113685381486591754&quot; target=&quot;_blank&quot;&gt;Delphi Developers&amp;nbsp;Community&lt;/a&gt;&amp;nbsp;has reached 3300 members, as well as 800+ members in the&lt;a href=&quot;https://plus.google.com/u/0/communities/107332833200594894879&quot; target=&quot;_blank&quot;&gt;&amp;nbsp;Delphi iOS &amp;amp; Android Community&lt;/a&gt;.&amp;nbsp;The&amp;nbsp;&lt;a href=&quot;https://plus.google.com/u/0/communities/112415006900724346099&quot; target=&quot;_blank&quot;&gt;Delphi Component Directory&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.2000007629395px;&quot;&gt;&amp;nbsp; also carries posts about component updates. FYI, there is a &lt;a href=&quot;https://plus.google.com/communities/118315259185736124693&quot; target=&quot;_blank&quot;&gt;C++Builder Developers&lt;/a&gt;&amp;nbsp;group as well, where Brett Wilton is primus motor&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.2000007629395px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.2000007629395px;&quot;&gt;In case you have withdrawal symptoms from the EMBT official forums, you know where to find us ;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.2000007629395px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.2000007629395px;&quot;&gt;Please note that the Delphi groups are &lt;b&gt;strictly&lt;/b&gt; for development related discussions, and that if you have a need to vent about prices, EMBT, policies, or other non-technical issues, you should &lt;a href=&quot;https://plus.google.com/communities/107051189935796169205&quot; target=&quot;_blank&quot;&gt;post in this group instead.&lt;/a&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/2397370100993028369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2014/08/the-google-delphi-developers-reached.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/2397370100993028369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/2397370100993028369'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2014/08/the-google-delphi-developers-reached.html' title=''/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-2684649978829930353</id><published>2013-12-09T13:44:00.003+01:00</published><updated>2013-12-09T13:50:23.584+01:00</updated><title type='text'>Google+ Delphi Developers Community: 2400 members and wishlist for 2014!</title><content type='html'>&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigrYV87nt1WkxnboiqP05MODlpwBnQo8aDWRZ6uU1fXxIzZ35QX6wmZXg5ZbiDC7zm0WcKDmYIO_32tTm-cS8Zk36QoCPKHLuFgLnkVpOXwxkFBs-aWCQYNsaMcH6CVqc0cEoJx5gDHopg/s1600/DelphiSanta.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;304&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigrYV87nt1WkxnboiqP05MODlpwBnQo8aDWRZ6uU1fXxIzZ35QX6wmZXg5ZbiDC7zm0WcKDmYIO_32tTm-cS8Zk36QoCPKHLuFgLnkVpOXwxkFBs-aWCQYNsaMcH6CVqc0cEoJx5gDHopg/s1600/DelphiSanta.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;In January, the Google+ &lt;a href=&quot;https://plus.google.com/u/0/communities/103113685381486591754&quot; target=&quot;_blank&quot;&gt;Delphi Developers&amp;nbsp;Community&lt;/a&gt; will have it&#39;s one year anniversary. With 2400 members, as well as 300+ members in the&lt;a href=&quot;https://plus.google.com/u/0/communities/107332833200594894879&quot; target=&quot;_blank&quot;&gt; Delphi iOS &amp;amp; Android Community&lt;/a&gt; and the&amp;nbsp;&lt;a href=&quot;https://plus.google.com/u/0/communities/112415006900724346099&quot; target=&quot;_blank&quot;&gt;Delphi Component Directory&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;, I really appreciate and enjoy the posts and discussions about my favorite tool! &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot; /&gt; &lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;As you know, in the Yule time it is not unusual to send off a wish list to Santa, &lt;/span&gt;&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;so here are my wishes for Santa (&lt;a class=&quot;g-profile&quot; href=&quot;https://plus.google.com/100444051178499170499&quot; target=&quot;_blank&quot;&gt;+David Intersimone&lt;/a&gt;)&amp;nbsp;and&amp;nbsp;the Code Elfs at Embarcadero for 2014.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;Make 2014 a year for improving what exists!&lt;/span&gt;&lt;/h3&gt;&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;It has been said before, but I cannot help but repeat my burning desire for having the list of &quot;old sins&quot; significantly shortened, instead of even more new features. Many&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;posts during 2013 has been about performance issues or missing implementations, and to mention some: Generics weirdness, threading related issues, efficiency of generated code, lack of newer Windows APIs, lack of ready made wrappers for Android Java APIs, &amp;nbsp;IDE memory management and debugger/emulator stability, IDE features such as code insight and error insight which behave erratically, ...I&#39;ll stop myself here ;)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot; /&gt; &lt;h3&gt;&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;Make 2014 a year for &amp;nbsp;engaging the communities!&lt;/span&gt;&lt;/h3&gt;&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;We have a lot of awesome people making awesome fixes, improvements and workarounds for known Delphi issues. &amp;nbsp;I would love to see these people be given some love from EMBT and their excellent work adopted and integrated into Delphi. &amp;nbsp;We also have the open source efforts for creating regression tests for the Delphi libs, and it would be awesome if this effort would be adopted and supported by EMBT. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot; /&gt; &lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;To sum it up:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;&lt;b&gt;2014: No new platforms and lots of fixes!&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot; /&gt; &lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;That was &lt;i&gt;my&lt;/i&gt; wish list.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;W&lt;/span&gt;&lt;span style=&quot;font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18.200000762939453px;&quot;&gt;hat would be &lt;i&gt;your&lt;/i&gt; Xmas wishlist for Embarcadero?&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/2684649978829930353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2013/12/google-delphi-developers-community-2400.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/2684649978829930353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/2684649978829930353'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2013/12/google-delphi-developers-community-2400.html' title='Google+ Delphi Developers Community: 2400 members and wishlist for 2014!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigrYV87nt1WkxnboiqP05MODlpwBnQo8aDWRZ6uU1fXxIzZ35QX6wmZXg5ZbiDC7zm0WcKDmYIO_32tTm-cS8Zk36QoCPKHLuFgLnkVpOXwxkFBs-aWCQYNsaMcH6CVqc0cEoJx5gDHopg/s72-c/DelphiSanta.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-3902410129432684556</id><published>2013-10-10T15:55:00.002+02:00</published><updated>2013-10-10T15:55:55.534+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="community"/><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Google+"/><title type='text'>Welcome to the Delphi iOS &amp; Android Developers Community on Google+!</title><content type='html'>The &lt;a href=&quot;https://plus.google.com/u/0/communities/103113685381486591754&quot;&gt;Google+ Delphi Developers Community&lt;/a&gt; sprung another sibling!&lt;br /&gt;
Feel free to join up with the &lt;a href=&quot;https://plus.google.com/u/0/communities/107332833200594894879&quot;&gt;Delphi iOS &amp;amp; Android Developers Community&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The Delphi Developers Community is a &lt;i&gt;relatively&lt;/i&gt; whine free place to discuss our programming challenges, and has just passed 2200 members, and our new iOS and Android offspring focuses on the finer details of getting the most out of the FireMonkey mobile platform - already have 125 people participating.&lt;br /&gt;
&lt;br /&gt;
Then there is the growing &lt;a href=&quot;https://plus.google.com/u/0/communities/112415006900724346099&quot;&gt;Delphi Component Directory&lt;/a&gt;, where a steady flow of posts are highlighting the good stuff we may need to solve our challenges.&lt;br /&gt;
&lt;br /&gt;
There even is a place to vent your anger with Delphi and Embarcadero without detracting focus from solving programming issues.  If you need to rant and rage - people are all ears in &lt;a href=&quot;https://plus.google.com/u/0/communities/107051189935796169205&quot;&gt;Unit Number 5&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;!-- Place this tag in your head or just before your close body tag. --&gt;&lt;br /&gt;
&lt;script src=&quot;https://apis.google.com/js/plusone.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;!-- Place this tag where you want the widget to render. --&gt;&lt;br /&gt;
&lt;div class=&quot;g-post&quot; data-href=&quot;https://plus.google.com/103128232230617819686/posts/fdDH4CPWTeq&quot;&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/3902410129432684556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2013/10/welcome-to-delphi-ios-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/3902410129432684556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/3902410129432684556'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2013/10/welcome-to-delphi-ios-android.html' title='Welcome to the Delphi iOS &amp; Android Developers Community on Google+!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-7444450964990818929</id><published>2013-09-26T14:19:00.005+02:00</published><updated>2013-09-27T09:53:27.295+02:00</updated><title type='text'>RAD Studio XE5 Easter Egg</title><content type='html'>I am the curious kind, so armed with experience from earlier versions and the will to do a little experimentation, I brought up this photo:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Within RAD Studio XE5, do&lt;i&gt; Help|About&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Hold down the Alt-key and type &lt;i&gt;TEAM&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Double-click&lt;/i&gt;&amp;nbsp;in the scrolling list of names&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://2.bp.blogspot.com/-QlU9-aT0xIA/UkQbbIVOixI/AAAAAAAAmsA/B71oHt-PxRQ/s1600/XE5EasterEgg.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;247&quot; src=&quot;http://2.bp.blogspot.com/-QlU9-aT0xIA/UkQbbIVOixI/AAAAAAAAmsA/B71oHt-PxRQ/s400/XE5EasterEgg.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Click to enlarge - I can see Marco Cantù :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Also posted to the &lt;a href=&quot;https://plus.google.com/u/0/b/100042627440164265581/communities/103113685381486591754&quot; target=&quot;_blank&quot;&gt;Google+ Delphi Developers Community&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/7444450964990818929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2013/09/rad-studio-xe5-easter-egg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/7444450964990818929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/7444450964990818929'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2013/09/rad-studio-xe5-easter-egg.html' title='RAD Studio XE5 Easter Egg'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-QlU9-aT0xIA/UkQbbIVOixI/AAAAAAAAmsA/B71oHt-PxRQ/s72-c/XE5EasterEgg.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-1585752048511918620</id><published>2013-09-12T10:54:00.001+02:00</published><updated>2013-09-12T10:54:18.544+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><title type='text'>Android Application Events</title><content type='html'>There are a few differences between a Windows App and an Android App that puzzled me initially.  Why doesn&#39;t my application get FocusChanged Activate/Deactivate or Close when switching between or terminating apps on Android?&lt;br /&gt;&lt;br /&gt;
&lt;script src=&quot;https://apis.google.com/js/plusone.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;div class=&quot;g-post&quot; data-href=&quot;https://plus.google.com/103128232230617819686/posts/e6VGscmDAX1&quot;&gt;&lt;/div&gt;&lt;br /&gt;
In this post I also test out Google+&#39;s new support for embedding G+ posts in blogs and web pages.</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/1585752048511918620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2013/09/android-application-events.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/1585752048511918620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/1585752048511918620'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2013/09/android-application-events.html' title='Android Application Events'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-3706157068088881487</id><published>2013-08-13T13:27:00.003+02:00</published><updated>2013-08-13T13:29:58.114+02:00</updated><title type='text'>A Delphi Component Directory on Google+</title><content type='html'>Now that &lt;a href=&quot;https://plus.google.com/u/0/communities/103113685381486591754&quot;&gt;Delphi Developers Community&lt;/a&gt; is inching towards 2000 members, the component update posts are perhaps not taking over, but there certainly is a bit more activity.&lt;br /&gt;
&lt;br /&gt;
So - I decided to make another crowd sourced community for sharing components and resources.  I hope my fellow Delphi developers will add posts about their components as well as web sites, blogs or communities, so that we can grow this into a useful and up-to-date &lt;b&gt;&lt;a href=&quot;https://plus.google.com/u/0/communities/112415006900724346099&quot;&gt;Delphi Component Directory&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
A great way to kickstart it, is that &lt;i&gt;you&lt;/i&gt; post a link to your favorite component or component vendor, after you have checked that it hasn&#39;t already been posted.  Select the right component group, or suggest a new group, and add tags for platform (#vcl, #firemonkey, #ios, #android) or other features.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://plus.google.com/u/0/communities/112415006900724346099&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;563&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiegMBw8-dvH0qhaL8CiGy0OC-zhDGjZdl8-2YCgqNQwSoTBfcZ-MHyY2FeUENeQ89iokyXjsURiwK4c4BCwLbpHQZo4zQexO-ZvIoIgYYJ6VihoGiDUOJzpsMw7NukEHxSQXUdDqbO49fK/s640/DCDEncouragePosts.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/3706157068088881487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2013/08/a-delphi-component-directory-on-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/3706157068088881487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/3706157068088881487'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2013/08/a-delphi-component-directory-on-google.html' title='A Delphi Component Directory on Google+'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiegMBw8-dvH0qhaL8CiGy0OC-zhDGjZdl8-2YCgqNQwSoTBfcZ-MHyY2FeUENeQ89iokyXjsURiwK4c4BCwLbpHQZo4zQexO-ZvIoIgYYJ6VihoGiDUOJzpsMw7NukEHxSQXUdDqbO49fK/s72-c/DCDEncouragePosts.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-8826295210003928794</id><published>2013-04-19T09:38:00.000+02:00</published><updated>2013-04-19T11:22:39.807+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Blogger"/><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Google+"/><title type='text'>Delphi Developers on G+ has passed 1500 members</title><content type='html'>With Blogger&#39;s ability to +mention people, and now also sharing the blog comments on Google+, I&#39;d say that you would have a hard time finding something that can beat it the Google+/Blogger combo for impact.  Perhaps this can reignite the Delphi blogosphere, as it has never been so easy to create content and reach a targeted audience.  &lt;br /&gt;
&lt;br /&gt;
So, why don&#39;t you put on your writer&#39;s hat, write about your Delphi experience, and share it with us at the &lt;a href=&quot;https://plus.google.com/communities/103113685381486591754&quot;&gt;Delphi Developers Community&lt;/a&gt;?&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVXMe74HytH0ax5hrbp7ILOSYjHocg42QtPwW3iGC0k-LpSttf-vBH_7Zux0YfYL_zd6X1QyRaz0pXp1gkAujoee_PrqBsBhStHL1U81fnSHRPD0jDl6_pxq42BwtmK-zWPpsNw-5i7-Bf/s1600/DelphiTroyShield.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVXMe74HytH0ax5hrbp7ILOSYjHocg42QtPwW3iGC0k-LpSttf-vBH_7Zux0YfYL_zd6X1QyRaz0pXp1gkAujoee_PrqBsBhStHL1U81fnSHRPD0jDl6_pxq42BwtmK-zWPpsNw-5i7-Bf/s320/DelphiTroyShield.png&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/8826295210003928794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2013/04/delphi-developers-on-g-has-passed-1500.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/8826295210003928794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/8826295210003928794'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2013/04/delphi-developers-on-g-has-passed-1500.html' title='Delphi Developers on G+ has passed 1500 members'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVXMe74HytH0ax5hrbp7ILOSYjHocg42QtPwW3iGC0k-LpSttf-vBH_7Zux0YfYL_zd6X1QyRaz0pXp1gkAujoee_PrqBsBhStHL1U81fnSHRPD0jDl6_pxq42BwtmK-zWPpsNw-5i7-Bf/s72-c/DelphiTroyShield.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-8104420029615844038</id><published>2012-12-18T00:47:00.002+01:00</published><updated>2012-12-18T00:47:49.940+01:00</updated><title type='text'>The G+ Delphi Community just hit 700 members!</title><content type='html'>I am thrilled to see that there really is a Delphi Community out there.&lt;br /&gt;
If you make third party components, I&#39;d like to see you post about them there. Perhaps not as a sales pitch, but a little information what they can do and how they may help a Delphi user.&lt;br /&gt;
&lt;br /&gt;
Please, join up at the &lt;a href=&quot;https://plus.google.com/communities/103113685381486591754&quot;&gt;Google+ Delphi Developer community&lt;/a&gt; :)&lt;br /&gt;
&lt;br /&gt;
Brgds,&lt;br /&gt;
Lars F.</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/8104420029615844038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2012/12/the-g-delphi-community-just-hit-700.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/8104420029615844038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/8104420029615844038'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2012/12/the-g-delphi-community-just-hit-700.html' title='The G+ Delphi Community just hit 700 members!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-2905192039262961666</id><published>2012-12-07T10:33:00.002+01:00</published><updated>2012-12-07T10:33:30.098+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="community"/><category scheme="http://www.blogger.com/atom/ns#" term="social"/><title type='text'>New Delphi Developer Community on Google+!</title><content type='html'>Google just added Communities to Google+, so if you are a G+ addict like myself, you are very welcome to the new open &lt;a href=&quot;https://plus.google.com/communities/103113685381486591754&quot;&gt;Delphi Developer community&lt;/a&gt; :)&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/2905192039262961666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2012/12/new-delphi-developer-community-on-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/2905192039262961666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/2905192039262961666'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2012/12/new-delphi-developer-community-on-google.html' title='New Delphi Developer Community on Google+!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-4448947568410934859</id><published>2011-11-08T21:23:00.001+01:00</published><updated>2011-11-08T21:23:25.586+01:00</updated><title type='text'>Google+ Delphi User Groups</title><content type='html'>A suggestion for self-curating the Delphi content on Google+!  Why? Because although we all are lovable developers, we can only handle that many photos, reshares and caturday gifs!&lt;br /&gt;
&lt;br /&gt;
Using Google+ allows us to have a unified comment system, and a loosely coupled Delphi community where you can actually pick and chose among who you want to follow.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Here is how:&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 1: Create your Google+ Delphi Page.&lt;/b&gt; With Google+ adding pages, we now can self-curate our content.  This means that each of us can create our own Delphi page, which can be used to promote our blog posts, or our Delphi musings directly in the page stream.  Note that we would need to refrain from posting caturday gifs, or reshares of the events of all world+dog on our Delphi page.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 2: From your Delphi Page, Follow the &lt;a href=&quot;https://plus.google.com/u/0/b/110596121596810737893/110596121596810737893/posts&quot;&gt;Delphi User Group&lt;/a&gt; and/or &lt;a href=&quot;https://plus.google.com/u/0/b/107333015498745476386/107333015498745476386/posts&quot;&gt;Firemonkey User Group&lt;/a&gt; pages&lt;/b&gt; This will make your page visible to other Delphi users, assuming you also complete step 3.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 3: Ensure that you show in public on your Delphi page profile that you follow the page(s) above.&lt;/b&gt; This because a Google+ page will NOT show you as a follower, &lt;a href=&quot;http://www.google.com/support/plus/bin/answer.py?hl=en&amp;answer=1047299&quot;&gt;unless you follow it in public&lt;/a&gt;.  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 4: Pick the &lt;a href=&quot;https://plus.google.com/u/0/103128232230617819686/posts/3aQmbSsGxRf&quot;&gt;pages and/or users you want to follow&lt;/a&gt; from the User Group pages.&lt;/b&gt; As people publicly add (i.e. follow with) their Delphi pages, the user groups will automatically grow the list of available pages and visible for all.  &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 5: Enjoy a &quot;spam free&quot; Delphi circle!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Step 6: Optionally, reshare your old personal Delphi posts on your Delphi page.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The generic Delphi and Firemonkey user groups are just a start. Anybody can create their own topic-centric User Group page as well. &lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;If you want to help grow the Delphi community:&lt;br /&gt;
Create your own Delphi page, and follow the User Groups!&lt;/h2&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/4448947568410934859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/11/google-delphi-user-groups.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/4448947568410934859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/4448947568410934859'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/11/google-delphi-user-groups.html' title='Google+ Delphi User Groups'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-5570506742786195676</id><published>2011-11-08T12:13:00.000+01:00</published><updated>2011-11-08T12:16:26.323+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="compiler"/><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="optimize"/><category scheme="http://www.blogger.com/atom/ns#" term="wishful"/><title type='text'>Compile time ordered vectors</title><content type='html'>I would like to have support for ordering content of a constant array at compile time.  &lt;br /&gt;
&lt;br /&gt;
I would like to have optimized lookup function for such an ordered constant array (binary search, hash index, etc, - whatever fits the purpose) to check if a variable has a match in the ordered constant array.  The code generator could inline the lookup function if so was desired. &lt;br /&gt;
&lt;br /&gt;
I guess you can say that I am looking for something like the &quot;in&quot; keyword for sets, but extended to work with any constant array (string, array of enumerable, array of number, or array of other constants such as class type references). &lt;br /&gt;
&lt;br /&gt;
A specification syntax could look something like: &lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;lt;arraytype&amp;gt; = {ordered {ascending | descending}} Vector&amp;lt;T&amp;gt; &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Implicit methods associated with the type: &lt;br /&gt;
&lt;i&gt;
&amp;nbsp;&amp;nbsp;Vector&amp;lt;T&amp;gt;.Contains(const element: T):Boolean; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;Vector&amp;lt;T&amp;gt;.ContainsAny(const array of T):Boolean; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;Vector&amp;lt;T&amp;gt;.ContainsAll(const array of T):Boolean; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;Vector&amp;lt;T&amp;gt;.Include(const element: T); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;Vector&amp;lt;T&amp;gt;.Exclude(const element: T); &lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
Example declaration: &lt;br /&gt;
&lt;i&gt;type &lt;br /&gt;
&amp;nbsp;&amp;nbsp;TMyType = ordered ascending Vector&amp;lt;Char&amp;gt;; &lt;br /&gt;
const &lt;br /&gt;
&amp;nbsp;&amp;nbsp;InvalidChars : TMyType = [&#39;\&#39;, &#39;:&#39;, &#39;.&#39;, &#39;(&#39;, &#39;)&#39;]; // I don&#39;t want to worry about order here
&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;
Example of use: &lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;if InvalidChars.Contains(SomeCharacter)  then  ... &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Today, I can create singleton objects that are ordered as part of the initialization code, but it becomes a lot of micro management code which isn&#39;t optimized for call performance, instead of easy to use code like &quot;element in set&quot; style code.</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/5570506742786195676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/11/compile-time-ordered-vectors.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/5570506742786195676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/5570506742786195676'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/11/compile-time-ordered-vectors.html' title='Compile time ordered vectors'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-4752151957997562668</id><published>2011-10-25T09:07:00.000+02:00</published><updated>2011-10-25T09:17:52.565+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blog"/><category scheme="http://www.blogger.com/atom/ns#" term="Google+"/><title type='text'>Blog++ / Google+ Delphi Circle</title><content type='html'>I just connected my Blogger ID to my Google+ account, and according to the &lt;a href=&quot;http://buzz.blogger.com/2011/10/use-your-google-profile-with-your.html&quot;&gt;update at the Blogger site&lt;/a&gt;, I&#39;ll be getting access to the new G+ integration stuff as it is rolled out.  Can&#39;t wait to see G+ as the commenting system! I also tried out the new dynamic template, and you can see it live on the &quot;Tools and Books&quot; section, but that is not quite ready for prime time use yet. I like my gadgets and syntax highlighting... speaking of - I think I lost the booklist :( *sigh*
&lt;br /&gt;&lt;br /&gt;
BTW: I already have over 200 people in my Google+ Delphi circle.  Look me up at &lt;a href=&quot;http://plus.lars.fosdal.com&quot;&gt;plus.lars.fosdal.com&lt;/a&gt; and drop me a comment to be circled!</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/4752151957997562668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/10/blog-google-delphi-circle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/4752151957997562668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/4752151957997562668'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/10/blog-google-delphi-circle.html' title='Blog++ / Google+ Delphi Circle'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-3585025678770585691</id><published>2011-10-03T18:23:00.000+02:00</published><updated>2011-10-03T18:26:23.175+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows 8"/><category scheme="http://www.blogger.com/atom/ns#" term="WinRT"/><category scheme="http://www.blogger.com/atom/ns#" term="XAML"/><title type='text'>A Windows 8 / Win RT Application in Delphi!</title><content type='html'>Thom Gerdes @ Embarcadero just posted about his first Delphi / XAML application for Windows 8 and WinRT on Google+.

&lt;a href=&quot;https://plus.google.com/101466385048851863100/posts/26z7Pk9Hipo&quot;&gt;https://plus.google.com/101466385048851863100/posts/26z7Pk9Hipo&lt;/a&gt;

Blatant plug: If you have not signed up for Google+ yet, you should!&lt;br /&gt;
&lt;a href=&quot;http://plus.lars.fosdal.com/&quot;&gt;&lt;img alt=&quot;Follow me on Google Plus&quot; src=&quot;http://www.fosdal.com/images/gplusbutton1.png&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/3585025678770585691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/10/windows-8-win-rt-application-in-delphi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/3585025678770585691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/3585025678770585691'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/10/windows-8-win-rt-application-in-delphi.html' title='A Windows 8 / Win RT Application in Delphi!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-6873892869530980371</id><published>2011-09-21T13:53:00.002+02:00</published><updated>2011-09-21T13:53:51.717+02:00</updated><title type='text'>A Delphi road map preview from the new product manager.</title><content type='html'>While we wait for a Delphi roadmap, a &quot;roadmap preview&quot; is available from the new RAD Studio product manager.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://blogs.embarcadero.com/files/2011/09/image002_4485-300x225.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;225&quot; src=&quot;http://blogs.embarcadero.com/files/2011/09/image002_4485-300x225.png&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Frequent and regular FireMonkey updates
&lt;li&gt;A Next Generation Delphi Compiler with multiple hardware/OS targets
&lt;li&gt;Next Generation RAD C++ Compiler with multiple hardware/OS targets
&lt;li&gt;64bit RAD C++
&lt;li&gt;Delphi and C++ iOS support
&lt;li&gt;Expanded Mobile UI and Device support like Location, Camera, Accelerometers etc
&lt;li&gt;Delphi and C++ ARM Support
&lt;li&gt;Extended iOS Support
&lt;li&gt;Android Support
&lt;li&gt;Win8/Metro Support - Intel and ARM&lt;/li&gt;
&lt;/ul&gt;

See &lt;a href=&quot;http://blogs.embarcadero.com/jtembarcadero/2011/09/17/may-the-roadmap-rise-with-you/&quot;&gt;May the road(map) rise with you&lt;/a&gt; for more.</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/6873892869530980371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/09/delphi-road-map-preview-from-new.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/6873892869530980371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/6873892869530980371'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/09/delphi-road-map-preview-from-new.html' title='A Delphi road map preview from the new product manager.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-956324254018051880</id><published>2011-09-12T10:12:00.001+02:00</published><updated>2011-09-12T10:12:54.576+02:00</updated><title type='text'>Off-season easter egg hunt</title><content type='html'>In the Rad Studio XE2  &quot;Help|About&quot; dialog - the good old Alt-TEAM shortcut Easter egg still works, and brings out the list of RAD Studio team members.  

But - are there other eggs as well?
(Yeah, I am that childish ;) )</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/956324254018051880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/09/off-season-easter-egg-hunt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/956324254018051880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/956324254018051880'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/09/off-season-easter-egg-hunt.html' title='Off-season easter egg hunt'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-914727167925884501</id><published>2011-09-02T11:33:00.000+02:00</published><updated>2011-09-02T11:33:21.933+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="anonymous methods"/><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="FireMonkey"/><category scheme="http://www.blogger.com/atom/ns#" term="forms"/><category scheme="http://www.blogger.com/atom/ns#" term="Generics"/><category scheme="http://www.blogger.com/atom/ns#" term="input"/><category scheme="http://www.blogger.com/atom/ns#" term="LiveBinding"/><category scheme="http://www.blogger.com/atom/ns#" term="validation"/><category scheme="http://www.blogger.com/atom/ns#" term="vcl"/><title type='text'>Forms and Data Entry Validation - Part 1</title><content type='html'>This is not an article about LiveBinding.  I was once hoping it was going to be, but instead it has become an alternative to LiveBinding.  If anything, it is about compile-time binding and quality assuring the data input from of your users. &lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Forms, forms, forms...&lt;/h2&gt;How many forms have you created? &amp;nbsp;Chance is - quite a few - and what do they have in common? &amp;nbsp; If people type rubbish, your data becomes rubbish. &amp;nbsp;So - what do you do? &amp;nbsp;You validate the input to prevent rubbish getting into the system. &amp;nbsp;You do... don&#39;t you? Sure you do!&lt;br /&gt;
&lt;br /&gt;
When do you validate it? &amp;nbsp;When someone clicks Submit or OK? &amp;nbsp;Right - then you have to go through the input, field by field, and first ensure that what the user typed in actually is understandable in the current context - such as no funny characters in an integer - and sometimes you have to check &amp;nbsp;the values against each other for logical states. If someone said they took three melons, their combined weight should at least be bigger than zero, and blue shirts don&#39;t go well with pink pants, and what else not.&lt;br /&gt;
&lt;br /&gt;
If the user typed in rubbish - you have to inform him or her so that it can be corrected.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Been there, done that&lt;/h2&gt;There is a certain amount of logic in this scene that we keep recreating scaffolding for. &amp;nbsp;Stuffing things into listboxes, formatting and filling in the values, validation of numbers and dates, converting enumerated types into strings (and back again).&amp;nbsp;If you want the dialog to be slick - you might even want to validate as you go, which means eventhandlers for focus changes, keys pressed, UI items clicked, dropped down and selected, also adding to all the scaffolding code.&lt;br /&gt;
&lt;br /&gt;
Some time ago, I had to create yet another dialog. &amp;nbsp;Lines and lines of housekeeping code that surround the real&amp;nbsp;validation&amp;nbsp;logic. &amp;nbsp;And naturally I don&#39;t have to be clearvoyant to foresee numerous more such dialogs, as it is a major part of writing applications that deal with configuration, input and control.&lt;br /&gt;
&lt;br /&gt;
So - I thought to myself - can I spend a little time now, and save a lot of time later? &amp;nbsp;Dangerous, innit, thinking like that... &amp;nbsp;suddenly you could find yourself writing a framework, and we all know what happens to frameworks, right? &amp;nbsp;They turn to endless amounts of code written with good intentions of handling the unexpected, covering functionality you won&#39;t ever need, and at some point collapse on themselves to become a black hole of sketchily documented&amp;nbsp;(since noone updated the docs as new features got added)&amp;nbsp;, and hastily changed (since you always are in a hurry for that extra functionality) code. &amp;nbsp;And when someone else misread your framework intentions and applied it like a hammer to a screw - it just doesn&#39;t end well.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Narrowing down the scope&lt;/h2&gt;Hence - Sticking with the KISS principle, I have decided to try to make it independent of other libraries, and limit what I implement to basic functionality while attempting to allow for future expansion.&lt;br /&gt;
&lt;br /&gt;
I am going to create a TInput&amp;lt;T&amp;gt; that wraps a GUI control. &amp;nbsp;To put it simply - a TInput&lt;integer&gt; that points to a specific TEdit, and takes care of stuffing values from the variable and into the GUI control, and vice versa. &amp;nbsp;The job of that TInput&amp;lt;T&amp;gt; is the present the value correctly, and to ensure that what ever is written into that TEdit, can be converted into an integer.&lt;/integer&gt;&lt;br /&gt;
&lt;br /&gt;
I will also create a TInputList that is a collection of TInput&amp;lt;T&amp;gt;s, that will have the job of going through the list to fill the controls, to validate the contents, and finally - if all input is syntactically correct - semantically validate the input for logical correctness.&lt;br /&gt;
&lt;br /&gt;
Some of the code that I will present here, is probably centric to the type of data that I work on. &amp;nbsp;For me, an input form will &amp;nbsp;typically wrap an object with a set of properties that reflect a row or set of related rows in a database. &amp;nbsp;Why am I not using data aware controls? &amp;nbsp;Mostly because the applications we create actually can&#39;t write to the database themselves, except through calling stored procedures that perform more magic before, during, or after the data has been written. &amp;nbsp;For that reason, the TInputList will be a TInputList&amp;lt;T&amp;gt;, and the TInputList&amp;lt;T&amp;gt; will have a property Current:T that I can populate, and each TInput&amp;lt;T&amp;gt; will know that it is member of a TInputList&amp;lt;T&amp;gt;, so that it can kick of the necessary actions for stuff to get validated.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;[kom-pli-kei-tid]&lt;/h2&gt;By now you have probably thought to yourself: TEdit? &amp;nbsp;What about the other controls?&lt;br /&gt;
&lt;br /&gt;
Because there are a number of input types, and a number of controls, and these make a number of combinations. TEdit/Double, TEdit/Integer, TEdit/String, and TEdit/Enum is already a list, and I haven&#39;t even mentioned TComboBox yet,- so it is obvious that&amp;nbsp;TInputList&amp;lt;T&amp;gt; has to be polymorphic.&lt;br /&gt;
&lt;br /&gt;
This brings us to the first part of complicated - creating a set of generic and polymorphic classes. &amp;nbsp;Generics in Delphi XE still don&#39;t to well with forward declarations, and to create polymorphic parent/children lists, it really helps to be able to forward declare.&lt;br /&gt;
&lt;br /&gt;
After some consideration, I have chosen to use an abstract class without generics as my inner base class. &amp;nbsp;TAbstractInput will know nothing about the data type we want to work with, nor will it know anything about the control type. &amp;nbsp;All TAbstractInput will do, is define the virtual abstract methods that will be our type agnostic operators or verbs and queries, if you like. &amp;nbsp;Hence, our TInputList will use TAbstractInput as its element type.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;/// &amp;lt;summary&amp;gt; TAbstractInput defines the bare minimum base class for our list of inputs &amp;lt;summary&amp;gt;
  TAbstractInput = class abstract
  private
  protected
    function GetEdited: Boolean; virtual; abstract;
    procedure SetEdited(const Value: Boolean); virtual; abstract;
    function GetEnabled: Boolean; virtual; abstract;
    procedure SetEnabled(const Value: Boolean); virtual; abstract;
    function ControlValueIsValid:Boolean; virtual; abstract;
    function VariableValueIsValid:Boolean; virtual; abstract;
    procedure FillControl; virtual; abstract;
    procedure FillVariable; virtual; abstract;
    procedure SetDisabledState; virtual; abstract;
    procedure SetErrorState; virtual; abstract;
    procedure SetNormalState; virtual; abstract;
    procedure SaveNormalState; virtual; abstract;
    procedure Setup; virtual; abstract;
  public
    procedure Clear; virtual; abstract;
    procedure Update; virtual; abstract;
    function Validate: Boolean; virtual; abstract;
    property Edited: Boolean read GetEdited write SetEdited;
    property Enabled: Boolean read GetEnabled write SetEnabled;
  end;
&lt;/pre&gt;&lt;br /&gt;
From the outside of the list, we need TInput&amp;lt;T&amp;gt; that expose the correct type that we want to access, so that will be our outer base class type - which knows how to set and get the value, and hence the class that we use to reference an input field.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;/// &amp;lt;summary&amp;gt; TInput&amp;lt;T&amp;gt; defines the input wrapper as we want it to be
  /// visible from the outside of our list of controls&amp;lt;/summary&amp;gt;
  TInput&amp;lt;T&amp;gt; = class abstract(TAbstractInput)
  private
    FOnCanGetValue: TGetValue&amp;lt;Boolean&amp;gt;;
    procedure SetOnCanGetValue(const Value: TGetValue&amp;lt;Boolean&amp;gt;);
  protected
    function GetValue:T; virtual; abstract;
    procedure SetValue(const Value:T); virtual; abstract;
    function CanGetValue:Boolean; virtual; abstract;
  public
    property Value:T read GetValue write SetValue;
    property OnCanGetValue: TGetValue&amp;lt;Boolean&amp;gt; read FOnCanGetValue write SetOnCanGetValue;
  end;
&lt;/pre&gt;Please note that this is a simplified view of TInput&amp;lt;T&amp;gt; class. &lt;br /&gt;
&lt;br /&gt;
Inside TInputList, I will subclass TInput&amp;lt;T&amp;gt; again, and add knowledge of the controls. &amp;nbsp;In fact, I will create several subclasses that handle type conversions for each data type and control type, but instead of having the user instantiate all these different class types - I will add factory methods to the TInputList instead.&lt;br /&gt;
&lt;br /&gt;
Here are some excerpts from the declaration of TInputList and the basic control wrapper.&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;/// &amp;lt;summary&amp;gt; TInputList is a wrapper for all our input controls. &amp;lt;/summary&amp;gt;
  TInputList&amp;lt;IT:class, constructor&amp;gt; = class(TList&amp;lt;TAbstractInput&amp;gt;)
  ... 
  public
    type
      /// &amp;lt;summary&amp;gt; This is our core input control wrapper on which we base wrappers for specific controls &amp;lt;/summary&amp;gt;
      TInputControl&amp;lt;TCtrl:class; SVT, CVT&amp;gt; = class(TInput&amp;lt;SVT&amp;gt;)
      private
        FController: TInputList&amp;lt;IT&amp;gt;;
        FControl: TCtrl;
        FValue: SVT;
        ...  
      end;
  end;
&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;Properties and Binding&lt;/h2&gt;This is the second part of complicated. Will I be using the XE2 LiveBinding? No. IMO, LiveBinding uses the least desirable method to bind a property for setting and getting. I lamented this in my previous article, &lt;a href=&quot;http://delphi.fosdal.com/2011/05/finding-yourself-in-property-bind.html&quot;&gt;Finding yourself in a property bind&lt;/a&gt;. In my opinion, LiveBinding is a good idea that is implemented in the wrong way, and in it&#39;s current form will be vulnerable to property and variable name changes during refactoring. In addition, it appears that LiveBinding is not quite mature yet. Then there is the fact that XE and older, doesn&#39;t have LiveBinding.&lt;br /&gt;
&lt;br /&gt;
After some experimentation, I came to the conclusion that even if it appears to be more elegant to use visitors or observers and RTTI binding, I will get more flexibility, readability, and maintainability by using anonymous methods. &lt;br /&gt;
&lt;br /&gt;
Anonymous methods allow me to do manipulation of the value before it is set/get, and allow the setter/getter events to have side effects. It also ensures that all references are validated compile-time.  It will not guarantee protection from referencing the wrong properties and variables, but they will at least be of the right type, and actually exist.&lt;br /&gt;
&lt;br /&gt;
Since my primary development platform is Windows, I am a VCL developer - and when I started this little project, I had only VCL in mind.  However, as the code matured, I found that I might want to be able to use this for FireMonkey as well.  That still remains to be seen as FireMonkey still smell of Baboon.&lt;br /&gt;
&lt;br /&gt;
Still, the core logic is platform agnostic, and the VCL bits are separated into a unit of their own.&lt;br /&gt;
&lt;br /&gt;
Here is an excerpt from the VCL implementation with complete declarations.&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;TInputListVCL&amp;lt;IT:class, constructor&amp;gt; = class(TInputList&amp;lt;IT&amp;gt;)
  public
    type
      TInputControlVCL&amp;lt;TCtrl:TWinControl; SVT, CVT&amp;gt; = class(TInputList&amp;lt;IT&amp;gt;.TInputControl&amp;lt;TCtrl, SVT, CVT&amp;gt;)
      protected
        procedure ControlEnable(const aState:Boolean); override;
        function ControlEnabled:Boolean; override;
        procedure ControlSetFocus(const aFocused:Boolean); override;
      end;

      /// &amp;lt;summary&amp;gt; Basic wrapper for a TEdit &amp;lt;/summary&amp;gt;
      TEditTemplate&amp;lt;SVT&amp;gt; = class abstract(TInputControlVCL&amp;lt;TEdit, SVT, String&amp;gt;)
      private
        FNormalColor: TColor;
      protected
        procedure SetControlValue(const Control:TEdit; const v:String); override;
        function GetControlValue(const Control:TEdit): String; override;
        function ControlValueAsString:String; override;
        procedure SetErrorState; override;
        procedure SetNormalState; override;
        procedure SaveNormalState; override;
        procedure SetDisabledState; override;
      public
        procedure Clear; override;
        procedure Setup; override;
      end;

      /// &amp;lt;summary&amp;gt; TEdit wrapper for editing a string &amp;lt;/summary&amp;gt;
      TEditString = class(TEditTemplate&amp;lt;String&amp;gt;)
      protected
        function ConvertControlToVariable(const cv: String; var v:String; var ErrMsg:String):Boolean; override;
        function ConvertVariableToControl(const v:String; var cv:String):Boolean; override;
      end;

      /// &amp;lt;summary&amp;gt; TEdit wrapper for editing a float &amp;lt;/summary&amp;gt;
      TEditDouble = class(TEditTemplate&amp;lt;Double&amp;gt;)
      private
        FDecimals: Integer;
      protected
        procedure SetDecimals(const Value: Integer); override;
        function GetDecimals:Integer; override;
        function ConvertControlToVariable(const cv: String; var v:Double; var ErrMsg:String):Boolean; override;
        function ConvertVariableToControl(const v:Double; var cv:String):Boolean; override;
      end;

      ...

  end;
&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;Putting it to use&lt;/h2&gt;This will be covered in part 2.  Until then, don&#39;t forget to try out RAD Studio XE2 and join the &lt;a href=&quot;http://www.embarcadero.com/world-tour&quot;&gt;RAD Studio World Tour presentations&lt;/a&gt;! &lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/914727167925884501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/09/forms-and-data-entry-validation-part-1.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/914727167925884501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/914727167925884501'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/09/forms-and-data-entry-validation-part-1.html' title='Forms and Data Entry Validation - Part 1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-4145323522828873032</id><published>2011-09-01T10:44:00.002+02:00</published><updated>2011-09-01T14:51:45.631+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Embarcadero"/><category scheme="http://www.blogger.com/atom/ns#" term="RAD Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="XE2"/><title type='text'>RAD Studio XE2 is RTM</title><content type='html'>The wait is over. If you have bought XE with Software Assurance, your SA Upgrade notice will be arriving shortly. If you want to try it out NOW, you can already download the 30-day trial editions.&lt;br /&gt;
&lt;br /&gt;
Delphi XE2 Architect 30-day trial:&lt;br /&gt;
&lt;a href=&quot;https://downloads.embarcadero.com/free/delphi&quot;&gt;https://downloads.embarcadero.com/free/delphi&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
RAD Studio XE2 Architect 30-day trial:&lt;br /&gt;
&lt;a href=&quot;https://downloads.embarcadero.com/free/rad_studio&quot;&gt;https://downloads.embarcadero.com/free/rad_studio&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK6aZdmK7DPKd6nc7Hpd5NtdL-mKbA3QmZQym8LixzjCFUkgNE3xFvfHUdRnhrsCxLWKB8Asmjy0QJTkcI8rpzfd4k5UCYAGAGKB3E7tnex7o3pIuk0vUB0xAl5GoLxiyJm5bOrraZh_w-/s150/DelphiHelmet.png&quot; imageanchor=&quot;1&quot; style=&quot;clear:right; float:right; margin-left:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; width=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK6aZdmK7DPKd6nc7Hpd5NtdL-mKbA3QmZQym8LixzjCFUkgNE3xFvfHUdRnhrsCxLWKB8Asmjy0QJTkcI8rpzfd4k5UCYAGAGKB3E7tnex7o3pIuk0vUB0xAl5GoLxiyJm5bOrraZh_w-/s150/DelphiHelmet.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Please note that the trial editions does not contain the command line compiler and VCL source code, as well as some third party offerings. You may want to install the trial editions in a VM, just as a precaution.&lt;br /&gt;
&lt;br /&gt;
Until you got it installed, you might find pleasure in reading about the new release here: &lt;a href=&quot;http://docs.embarcadero.com/products/rad_studio/&quot;&gt;http://docs.embarcadero.com/products/rad_studio/&lt;/a&gt;, and perhaps in particular this section: &lt;a href=&quot;http://docwiki.embarcadero.com/RADStudio/en/What%27s_New_in_Delphi_and_C%2B%2BBuilder_XE2&quot;&gt;What&#39;s new in Delphi and C++Builder XE2&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
This is a major release, with a lot of new features, so should you stumble upon a problem during your trial - please report any issues you find at &lt;a href=&quot;http://qc.embarcadero.com/&quot;&gt;http://qc.embarcadero.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
While you are at it, you should also sign up for the &lt;a href=&quot;http://www.embarcadero.com/world-tour&quot;&gt;RAD Studio XE2 World Tour&lt;/a&gt; event near you.&lt;br /&gt;
&lt;br /&gt;
In the Nordic countries:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://forms.embarcadero.com/forms/EMSERADWorldTourevent&quot;&gt;Göteborg, 20. September&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://forms.embarcadero.com/forms/EMSERADWorldTourevent&quot;&gt;Stockholm, 21. September&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://forms.embarcadero.com/forms/EMDKRADWorldTourevent&quot;&gt;København, 21. September&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://forms.embarcadero.com/forms/EMNORADWorldTourevent&quot;&gt;Oslo, 22. September&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://forms.embarcadero.com/forms/EMDKRADWorldTourevent&quot;&gt;Kolding, 4. Oktober &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Edit: Just had to add Andreano Lanusse&#39;s XE2 ad image:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.embarcadero.com/products/rad-studio&quot; imageanchor=&quot;1&quot; margin-left:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; width=100% src=&quot;http://www.andreanolanusse.com/en/wp-content/uploads/2011/07/EMBT_Banner_RadStudio_970x279.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/4145323522828873032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/09/rad-studio-xe2-is-rtm.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/4145323522828873032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/4145323522828873032'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/09/rad-studio-xe2-is-rtm.html' title='RAD Studio XE2 is RTM'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK6aZdmK7DPKd6nc7Hpd5NtdL-mKbA3QmZQym8LixzjCFUkgNE3xFvfHUdRnhrsCxLWKB8Asmjy0QJTkcI8rpzfd4k5UCYAGAGKB3E7tnex7o3pIuk0vUB0xAl5GoLxiyJm5bOrraZh_w-/s72-c/DelphiHelmet.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-6149821872597979302</id><published>2011-08-25T14:43:00.001+02:00</published><updated>2011-08-25T17:08:20.724+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="FireMonkey"/><category scheme="http://www.blogger.com/atom/ns#" term="fmx"/><category scheme="http://www.blogger.com/atom/ns#" term="vcl"/><category scheme="http://www.blogger.com/atom/ns#" term="XE2"/><title type='text'>RAD Studio XE2 - VCL and FireMonkey (FMX) first glance comparison</title><content type='html'>Published with permission from Embarcadero.&lt;br /&gt;
&lt;br /&gt;
When you start out a new simplistic GUI project in VCL or FireMonkey (FMX) in XE2, you will notice a few differences from older Delphi versions.  XE2 introduce consistent use of unit scope prefixes.  The Windows related units are grouped under the Winapi prefix, and the VCL units under VCL.  FireMonkey has been given the short prefix FMX.&lt;br /&gt;
&lt;br /&gt;
As you can see - the basic generated skeleton code is quite similar between the two frameworks.&lt;br /&gt;
Apart from referring different framework units, the resource include statement is also different: &quot;*.dfm&quot; vs &quot;*.fmx&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;The skeleton code&lt;/h2&gt;&lt;pre class=&quot;brush:delphi&quot;&gt;unit MainUnitVCL;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TFormVCL = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormVCL: TFormVCL;

implementation

{$R *.dfm}

end.
&lt;/pre&gt;&lt;br /&gt;
This is a FireMonkey HD project.&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;unit MainUnitFM;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs;

type
  TFormFM = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormFM: TFormFM;

implementation

{$R *.fmx}

end.
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;The designer&lt;/h2&gt;The designers are fairly similar between the frameworks, but there are differences.  &lt;br /&gt;
The good old VCL&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXZi-Z78-N_rAFqCACiSBCCk67Sdp1pm9V7elesAnl34ErHEpELzyGNaPy-OkrJ6bbhVB3WNUBGmhnEy0xKJJ571IgqC8yRpmTz05Qeons1QJRI8QXLTF7dALFvvrEgNTX-ycZe91haqbD/s679/FormVCL.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; width=75% src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXZi-Z78-N_rAFqCACiSBCCk67Sdp1pm9V7elesAnl34ErHEpELzyGNaPy-OkrJ6bbhVB3WNUBGmhnEy0xKJJ571IgqC8yRpmTz05Qeons1QJRI8QXLTF7dALFvvrEgNTX-ycZe91haqbD/s679/FormVCL.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The new FireMonkey designer:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ3LOona7esL4rEbtZumEjEUBf9IyfPuz2iUeH5-TTlm0hnqPrALsD6waEgBR-Oa_80kTW1WNJ4kRkuhoOlNfJUPL_3uATfQh2v1RWLIFb8vzQi2qpIp1rQIlEo6uW56eWLpZUgskEKgUU/s624/FormFM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; width=75% src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ3LOona7esL4rEbtZumEjEUBf9IyfPuz2iUeH5-TTlm0hnqPrALsD6waEgBR-Oa_80kTW1WNJ4kRkuhoOlNfJUPL_3uATfQh2v1RWLIFb8vzQi2qpIp1rQIlEo6uW56eWLpZUgskEKgUU/s624/FormFM.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
If you are wondering what&#39;s up with the drab grey look, you can relax.  This is the designer look, not the run time look.  FMX adopts to the theme of the OS it is running on - so it will look like a Windows app on Windows, and as a OSX app on OSX.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;The form properties&lt;/h2&gt;Let&#39;s take a quick look at the properties of the standard form.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://plus.google.com/photos/103128232230617819686/albums/5644340456082330929/5644739165495868290&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; width=50% src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjim1dZ53W2PfJyrN8t5M3MiVEtK_k972psGX0Db5yzgOOtsErG1QVMyCDfoNruO82i9l0tZ3aAOUMZiIiO3js3G8PsG7h13lSe5xQiVv2u6Geey9QgEaEUSF_cz0-5644rrXdg7EO68WQF/s910/FormVCLprops.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDo0FHswWjJqYR2rIqpeEkyyzLCu2j_YCvQh6lWO7ULrnffyVcMakLIV8Sl2ADpr5oVnymUxaQ9pg0KNTuo36os3Gki12zhPTZvWcsou94kA9sIztEh3F64T2R7-VOrpQPxl8-NvIv47rA/s583/FormFMprops.png&quot; imageanchor=&quot;1&quot; style=&quot;&quot;&gt;&lt;img border=&quot;0&quot; width=50% src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDo0FHswWjJqYR2rIqpeEkyyzLCu2j_YCvQh6lWO7ULrnffyVcMakLIV8Sl2ADpr5oVnymUxaQ9pg0KNTuo36os3Gki12zhPTZvWcsou94kA9sIztEh3F64T2R7-VOrpQPxl8-NvIv47rA/s583/FormFMprops.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
We are clearly not in Kansas anymore.  FMX is a completely different framework, and it has been designed with cross platform in mind, unlike VCL which was designed to wrap Windows controls.  This means we can look forward to learning new tricks, which some of us will view as a plus, while others will sigh and mutter something about things being better before.&lt;br /&gt;
&lt;br /&gt;
Porting a project from VCL to FMX is more work than recreating the form in the FMX designer, hooking up the new event handlers, and pasting in code from the VCL project.&lt;br /&gt;
&lt;br /&gt;
I added some standard controls to both forms.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Design time&lt;/h3&gt;VCL&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzfQDn03C4XHwcN3SGVWaWdkVF15WnauotOPVSsRQnEcAHuyamYHTK0z8PZXytEMGlwWyggQzRvIsfah4BbFcTYvJvKZC1nzfPGb6Ui0pa6GHt07lp30de56wEUJq5BCkWWmgJynS28YoI/s671/FormVCLcompo.png&quot; imageanchor=&quot;1&quot; style=&quot;&quot;&gt;&lt;img border=&quot;0&quot; width=50% src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzfQDn03C4XHwcN3SGVWaWdkVF15WnauotOPVSsRQnEcAHuyamYHTK0z8PZXytEMGlwWyggQzRvIsfah4BbFcTYvJvKZC1nzfPGb6Ui0pa6GHt07lp30de56wEUJq5BCkWWmgJynS28YoI/s671/FormVCLcompo.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
FMX&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcJurSZpu5CSQINimwQrhcVgU_rYJ8hXlMMk5n8S8Z5ZOIB5e0MVXQuvvbq_94otVhobfz4vzCpDGK-CnqNcL-bJaH8z-dvRViwI7E8T5NM2TaTMG5qXR84kliZKkyWSxl1dsqIeuwHBlK/s626/FormFMcompo.png&quot; imageanchor=&quot;1&quot; style=&quot;&quot;&gt;&lt;img border=&quot;0&quot; width=50% src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcJurSZpu5CSQINimwQrhcVgU_rYJ8hXlMMk5n8S8Z5ZOIB5e0MVXQuvvbq_94otVhobfz4vzCpDGK-CnqNcL-bJaH8z-dvRViwI7E8T5NM2TaTMG5qXR84kliZKkyWSxl1dsqIeuwHBlK/w500-h375-k/FormFMcompo.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;Run time&lt;/h3&gt;VCL&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgH1tD4yc0Ntt8b7vBSpPbpMRCyxwN_I_tCGRUx9tVkAsRDPu51Tt0Xp6LjgFqwzhtE9JAF11Gxlw0umHg8PzWBlJuUfytjf9FG4HPuygm_j4OOR5UprJ_RjcxVCw-pEC5EpO48BgAUAl7/s651/FormVCLruntime.png&quot; imageanchor=&quot;1&quot; style=&quot;&quot;&gt;&lt;img border=&quot;0&quot; width=50% src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgH1tD4yc0Ntt8b7vBSpPbpMRCyxwN_I_tCGRUx9tVkAsRDPu51Tt0Xp6LjgFqwzhtE9JAF11Gxlw0umHg8PzWBlJuUfytjf9FG4HPuygm_j4OOR5UprJ_RjcxVCw-pEC5EpO48BgAUAl7/s651/FormVCLruntime.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
FMX&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9RTA0imSyeJbi3WRiipE1_iyYptLUxMEtrX99T8WmU8BXtWfg2OH29fJEO2k0tE8OdVVkx9vAM3anjytJhYnxaJ2tWOrHKIJBsfZbGGJ237qg88TA4v0HCIZ-Lb93MXhhN9rzUcRQIjGa/s616/FormFMruntime.png&quot; imageanchor=&quot;1&quot; style=&quot;&quot;&gt;&lt;img border=&quot;0&quot; width=50% src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9RTA0imSyeJbi3WRiipE1_iyYptLUxMEtrX99T8WmU8BXtWfg2OH29fJEO2k0tE8OdVVkx9vAM3anjytJhYnxaJ2tWOrHKIJBsfZbGGJ237qg88TA4v0HCIZ-Lb93MXhhN9rzUcRQIjGa/s616/FormFMruntime.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;Source code&lt;/h3&gt;VCL&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;unit MainUnitVCL;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TFormVCL = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormVCL: TFormVCL;

implementation

{$R *.dfm}

procedure TFormVCL.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Add(Edit1.Text);
  Label1.Caption := IntToStr(Memo1.Lines.Count);
end;

end.
&lt;/pre&gt;&lt;br /&gt;
FMX&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;unit MainUnitFM;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Edit, FMX.Layouts,
  FMX.Memo;

type
  TFormFM = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormFM: TFormFM;

implementation

{$R *.fmx}

procedure TFormFM.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Add(Edit1.Text);
  Label1.Text := IntToStr(Memo1.Lines.Count);
end;

end.
&lt;/pre&gt;&lt;br /&gt;
As you can see - although similar in many ways - there are many differences between VCL and FMX.   One example: TLabel.Caption is no more.  TLabel.Text is the correct property under FMX.&lt;br /&gt;
&lt;br /&gt;
Then there is the glaring fact that FMX HD will build for OSX as well as both 32 and 64-bit Windows :)  Alas - since I don&#39;t have a Mac, I can&#39;t show you the OSX version.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNRU5eEEFwLh22rbKCRff3ulzH3C7cl_EYnxXKT2ENgl6wIB01dQGZq_wPV_qYWahyphenhyphen3zJnwAqkYuSplMfHmwPnt2pmMqjZpUvBfdxuoo59Yd1px2VC_zysK801iGQswypYEda2BYf4AG1r/s275/XE2ProjectManager.png&quot; imageanchor=&quot;1&quot; style=&quot;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;275&quot; width=&quot;214&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNRU5eEEFwLh22rbKCRff3ulzH3C7cl_EYnxXKT2ENgl6wIB01dQGZq_wPV_qYWahyphenhyphen3zJnwAqkYuSplMfHmwPnt2pmMqjZpUvBfdxuoo59Yd1px2VC_zysK801iGQswypYEda2BYf4AG1r/s275/XE2ProjectManager.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h2&gt;How do the form resources look?&lt;/h2&gt;VCL&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;object FormVCL: TFormVCL
  Left = 0
  Top = 0
  Caption = &#39;FormVCL&#39;
  ClientHeight = 337
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = &#39;Tahoma&#39;
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 8
    Top = 8
    Width = 31
    Height = 13
    Caption = &#39;Label1&#39;
  end
  object Button1: TButton
    Left = 536
    Top = 294
    Width = 75
    Height = 25
    Caption = &#39;Button1&#39;
    Default = True
    TabOrder = 0
    OnClick = Button1Click
  end
  object Memo1: TMemo
    Left = 8
    Top = 24
    Width = 498
    Height = 265
    Lines.Strings = (
      &#39;Memo1&#39;)
    TabOrder = 1
  end
  object Edit1: TEdit
    Left = 8
    Top = 296
    Width = 498
    Height = 21
    TabOrder = 2
    Text = &#39;Edit1&#39;
  end
end&lt;/pre&gt;&lt;br /&gt;
FMX&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;object FormFM: TFormFM
  BiDiMode = bdLeftToRight
  Caption = &#39;FormFM&#39;
  ClientHeight = 400
  ClientWidth = 600
  Left = 0
  Top = 0
  Transparency = False
  Visible = False
  StyleLookup = &#39;backgroundstyle&#39;
  object Button1: TButton
    Position.Point = &#39;(496,363)&#39;
    Width = 80.000000000000000000
    Height = 22.000000000000000000
    OnClick = Button1Click
    TabOrder = 1
    StaysPressed = False
    IsPressed = False
    Text = &#39;Button1&#39;
    Default = True
  end
  object Memo1: TMemo
    Position.Point = &#39;(8,24)&#39;
    Width = 473.000000000000000000
    Height = 321.000000000000000000
    TabOrder = 10
    WordWrap = False
  end
  object Label1: TLabel
    Position.Point = &#39;(8,8)&#39;
    Width = 120.000000000000000000
    Height = 15.000000000000000000
    TabOrder = 11
    Text = &#39;Label1&#39;
  end
  object Edit1: TEdit
    Position.Point = &#39;(8,360)&#39;
    Width = 473.000000000000000000
    Height = 22.000000000000000000
    TabOrder = 12
    ReadOnly = False
    Password = False
  end
end
&lt;/pre&gt;&lt;br /&gt;
FMX is made for scaling, and it also have numerous other nifty features such as rotation.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Summary&lt;/h2&gt;This was just a very shallow outline of some of the differences between VCL and FMX, but it is perhaps enough food for thought to make you realize that you most likely will have to put some effort into moving from VCL to FMX.  In some cases, you can get away with minor adjustments, but when it comes to sophisticated GUI - or stuff that is based on Windows functions - you will need to rewrite parts of your code.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsMkCOMnShUisDT2RriPw0_p6EKyd3nFiyQ_kTWfJNNLaKdcqcaBLsLGRiv1afD_BTtoUr-C6XPXgjNfGzMPJlrwmeSELGNBpxVlnf2Y7d4Mwr3m0n1tIQzImtPRE-61U0du4tLfNYbm0Z/s616/FormFMslanting.png&quot; imageanchor=&quot;1&quot; style=&quot;&quot;&gt;&lt;img border=&quot;0&quot; width=75% src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsMkCOMnShUisDT2RriPw0_p6EKyd3nFiyQ_kTWfJNNLaKdcqcaBLsLGRiv1afD_BTtoUr-C6XPXgjNfGzMPJlrwmeSELGNBpxVlnf2Y7d4Mwr3m0n1tIQzImtPRE-61U0du4tLfNYbm0Z/s616/FormFMslanting.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Don&#39;t forget to visit &lt;a href=&quot;http://www.embarcadero.com/world-tour&quot;&gt;http://www.embarcadero.com/world-tour&lt;/a&gt; to register for the RAD Studio XE2 World Tour event near you!&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/6149821872597979302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/08/rad-studio-xe2-vcl-and-firemonkey-fmx.html#comment-form' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/6149821872597979302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/6149821872597979302'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/08/rad-studio-xe2-vcl-and-firemonkey-fmx.html' title='RAD Studio XE2 - VCL and FireMonkey (FMX) first glance comparison'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXZi-Z78-N_rAFqCACiSBCCk67Sdp1pm9V7elesAnl34ErHEpELzyGNaPy-OkrJ6bbhVB3WNUBGmhnEy0xKJJ571IgqC8yRpmTz05Qeons1QJRI8QXLTF7dALFvvrEgNTX-ycZe91haqbD/s72-c/FormVCL.png" height="72" width="72"/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-2818635222727071148</id><published>2011-08-24T10:46:00.002+02:00</published><updated>2011-08-25T14:46:38.683+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cross platform"/><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="FireMonkey"/><category scheme="http://www.blogger.com/atom/ns#" term="XE2"/><title type='text'>RAD Studio XE2 - Breaking out of 32-bit Windows</title><content type='html'>Published with permission from Embarcadero.&lt;br /&gt;
&lt;br /&gt;
The Embarcadero RAD Studio XE2 World Tour is upon us.  &lt;br /&gt;
&lt;br /&gt;
The features are shiny! The reviews will be rave! As a Delphi developer, your favorite toolbox is about to get a massive upgrade that you don&#39;t want to miss!&lt;br /&gt;
&lt;br /&gt;
Click on the banner up top or down at the bottom of the blog to sign up for an event near you.&lt;br /&gt;
&lt;br /&gt;
One of the new features is cross platform support.  &lt;br /&gt;
&lt;br /&gt;
On the long awaited end - your new Delphi will be able to do your old Windows 32-bit platform, and now also will compile your VCL applications to native 64-bit.  Note that VCL will still be Windows Only.  You may have to do a little fixing to your code, as Integer still is 32-bit but Pointer is 64-bit - so those old Pointer(Integer) casts will have to be reworked.&lt;br /&gt;
&lt;br /&gt;
The most exiting feature of XE2 is that you can create GUIs for other platforms as well!&lt;br /&gt;
To enable this - Embarcadero nabbed the guy behind VGScene and DXScene and created FireMonkey - a whole new GUI framework that supports Windows, OSX and iOS in Delphi XE2, and that will (warning - speculation) very likely add support for other OS platforms in future versions of RAD Studio.&lt;br /&gt;
&lt;br /&gt;
FireMonkey apps are cross platform - but they come in various flavors - so you still have to make a conscious choice about where to start...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIW39o7FLUt76PBtdMQEZjaAahFIimHryah7TFA76lpNqiIicIelE8y-JiLm84jZZTfGyjj1Q8UTgqK7KdqFM-qKsvBTYGmQoezr6rzM2UXrN3EH53v5Tj1d3GcH-RDF035fIDTSUn4ieb/w313/FireMonkeyProjects.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;86&quot; width=&quot;313&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIW39o7FLUt76PBtdMQEZjaAahFIimHryah7TFA76lpNqiIicIelE8y-JiLm84jZZTfGyjj1Q8UTgqK7KdqFM-qKsvBTYGmQoezr6rzM2UXrN3EH53v5Tj1d3GcH-RDF035fIDTSUn4ieb/w313/FireMonkeyProjects.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Over the coming days I predict heavy blog activity with a lot to read about the new RAD Studio XE2 release, but in the mean time - make sure to sign up for the RAD Studio XE2 World Tour events!&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/2818635222727071148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/08/rad-studio-xe2-breaking-out-of-32-bit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/2818635222727071148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/2818635222727071148'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/08/rad-studio-xe2-breaking-out-of-32-bit.html' title='RAD Studio XE2 - Breaking out of 32-bit Windows'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIW39o7FLUt76PBtdMQEZjaAahFIimHryah7TFA76lpNqiIicIelE8y-JiLm84jZZTfGyjj1Q8UTgqK7KdqFM-qKsvBTYGmQoezr6rzM2UXrN3EH53v5Tj1d3GcH-RDF035fIDTSUn4ieb/s72-w313-c/FireMonkeyProjects.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-6138868043770361081</id><published>2011-07-14T13:17:00.001+02:00</published><updated>2011-07-14T13:28:05.261+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Generics"/><category scheme="http://www.blogger.com/atom/ns#" term="pointers"/><title type='text'>Weird code snippet #2: Generic Double Linked List</title><content type='html'>They say Generics and pointers don&#39;t mix.  &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;type
  PMyThing&amp;lt;T&amp;gt; = ^TMyThing&amp;lt;T&amp;gt; // [DCC Error] E2508 type parameters not allowed on this type
  TMyThing&amp;lt;T&amp;gt; = record
     Thing: T;
  end;
&lt;/pre&gt;&lt;br /&gt;
Ok, they don&#39;t.  But there is a loophole!&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;type
  TMyThing&amp;lt;T&amp;gt; = record
    Thing: T;
    NextThing: ^TMyThing&amp;lt;T&amp;gt;;
  end;
&lt;/pre&gt;&lt;br /&gt;
Why this is allowed, I don&#39;t know.  Just like I don&#39;t really understand why the first one is forbidden.  There is probably some good explanation for it.&lt;br /&gt;
&lt;br /&gt;
Still - it can be fun breaking the rules!&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;unit GenericDoubleLinkedList;

interface
uses
  Classes, Generics.Defaults;

type
  TLinkVisitor&amp;lt;T&amp;gt; = reference to procedure(const Item: T);

  TDoubleLinked&amp;lt;T&amp;gt; = record
    Value: T;
    PrevLink: ^TDoubleLinked&amp;lt;T&amp;gt;; // Hey, it compiles!
    NextLink: ^TDoubleLinked&amp;lt;T&amp;gt;;
    constructor Create(aValue:T);
    function Add(aValue:T): TDoubleLinked&amp;lt;T&amp;gt;;
    function HasNext:Boolean;
    function Next: TDoubleLinked&amp;lt;T&amp;gt;;
    function HasPrev:Boolean;
    function Prev: TDoubleLinked&amp;lt;T&amp;gt;;
    function First: TDoubleLinked&amp;lt;T&amp;gt;;
    function Last: TDoubleLinked&amp;lt;T&amp;gt;;
    procedure ForEach(const Proc: TLinkVisitor&amp;lt;T&amp;gt;);
  end;

  procedure Test(const Log:TStrings);

implementation

{ TDoubleLinked&amp;lt;T&amp;gt; }

constructor TDoubleLinked&amp;lt;T&amp;gt;.Create(aValue: T);
begin
  Value := aValue;
  NextLink := nil;
  PrevLink := nil;
end;

function TDoubleLinked&amp;lt;T&amp;gt;.Add(aValue: T): TDoubleLinked&amp;lt;T&amp;gt;;
var
  p: ^TDoubleLinked&amp;lt;T&amp;gt;; // But this one is not assignment compatible
begin
  p := AllocMem(SizeOf(TDoubleLinked&amp;lt;T&amp;gt;)); // Make space
  p^ := Self;      // Copy current value to allocated block
  Value := aValue; // Set self to new value
  p.NextLink := @Self;
  if Assigned(p.PrevLink) // Fix up previous nextlink
   then Pointer(p.PrevLink.NextLink) := Pointer(p);
  Pointer(PrevLink) := Pointer(p);  // Point back to old value
  Result := Self;
end;

function TDoubleLinked&amp;lt;T&amp;gt;.HasPrev: Boolean;
begin
  Result := PrevLink &amp;lt;&amp;gt; nil;
end;

function TDoubleLinked&amp;lt;T&amp;gt;.Prev: TDoubleLinked&amp;lt;T&amp;gt;;
begin
  Result := TDoubleLinked&amp;lt;T&amp;gt;(PrevLink^)
end;

function TDoubleLinked&amp;lt;T&amp;gt;.HasNext: Boolean;
begin
  Result := NextLink &amp;lt;&amp;gt; nil;
end;

function TDoubleLinked&amp;lt;T&amp;gt;.Next: TDoubleLinked&amp;lt;T&amp;gt;;
begin
  Result := TDoubleLinked&amp;lt;T&amp;gt;(NextLink^)
end;

function TDoubleLinked&amp;lt;T&amp;gt;.First: TDoubleLinked&amp;lt;T&amp;gt;;
begin
  Result := Self;
  while Result.HasPrev
   do Result := Result.Prev;
end;

function TDoubleLinked&amp;lt;T&amp;gt;.Last: TDoubleLinked&amp;lt;T&amp;gt;;
begin
  Result := Self;
  while Result.HasNext
   do Result := Result.Next;
end;

procedure TDoubleLinked&amp;lt;T&amp;gt;.ForEach(const Proc: TLinkVisitor&amp;lt;T&amp;gt;);
var
  Node: TDoubleLinked&amp;lt;T&amp;gt;;
begin
  Node := First;
  Proc(Node.Value);
  while Node.HasNext
  do begin
    Node := Node.Next;
    Proc(Node.Value);
  end;
end;

procedure Test(const Log:TStrings);
var
  List, Node : TDoubleLinked&amp;lt;String&amp;gt;;
begin
  List.Create(&#39;One&#39;);
  List.Add(&#39;Two&#39;);
  List.Add(&#39;Three&#39;);
  Node := List;  // Bad idea
  List.Add(&#39;Four&#39;);
  Node.Add(&#39;ThreeAndAHalf&#39;);

  List.ForEach(
    procedure(const Value:String)
    begin
      Log.Add(&#39;List: &#39; + Value)
    end);

  Node.ForEach(
    procedure(const Value:String)
    begin
      Log.Add(&#39;Node: &#39; + Value)
    end);
end;

end.&lt;/pre&gt;&lt;br /&gt;
The problem is that &quot;List&quot; is not a pointer, but the tail item of the list.  Hence, a Delete procedure needs to take this into consideration.&lt;br /&gt;
&lt;br /&gt;
Even worse, if you add a second Node variable to point to something in the list, that reference will not be fixed up after adding &#39;Four&#39;, and hence it will take the tail place of the list - for both references, effectively forgetting the &#39;Four&#39; item.&lt;br /&gt;
&lt;br /&gt;
So, although this was somewhat entertaining, a mix of Generics and pointers probably isn&#39;t something we should make use of.&lt;br /&gt;
&lt;br /&gt;
Exercise for the reader: Implement the TDoubleLinked&amp;lt;T&amp;gt;.Delete; procedure.&lt;br /&gt;
&lt;br /&gt;
End question: Why are we not allowed to declare pointers to generic types?</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/6138868043770361081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/07/weird-code-snippet-2-generic-double.html#comment-form' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/6138868043770361081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/6138868043770361081'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/07/weird-code-snippet-2-generic-double.html' title='Weird code snippet #2: Generic Double Linked List'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-2692915627174111777</id><published>2011-07-08T21:03:00.002+02:00</published><updated>2011-07-11T12:57:17.524+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="binary"/><category scheme="http://www.blogger.com/atom/ns#" term="case"/><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><title type='text'>Weird code snippet #1: Pseudobinary case statement</title><content type='html'>Curt Carpenter suggested a &lt;a href=&quot;https://forums.embarcadero.com/thread.jspa?messageID=368033&quot;&gt;language addition for handing binary case logic&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
That gave me this idea.  Chalk it up as another weird code snippet from yours truly.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: delphi&quot;&gt;///&amp;lt;summary&amp;gt;&gt; Convert array of booleans to a pseudobinary integer. 
///Good for up to 12 bits.&amp;lt;/summary&amp;gt;
function BoolToInt(B: Array of Boolean):Integer;
var
  x : Boolean;
begin
  Result := 0;
  for x in B
  do begin
    Result := Result * 10;
    if x then Inc(Result);
  end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  ch : Char;
begin
  ch := Lowercase(Char(Key));
  case BoolToInt([ssShift in Shift, ssCtrl in Shift, ch=&#39;a&#39;, ch=&#39;x&#39;, ch=&#39;c&#39;, ch=&#39;v&#39;]) of
    011000: SelectAll;
    010100: Cut;
    010010: Copy;
    110010: Clone;
    010001: Paste;
  end;
end;

&lt;/pre&gt;&lt;br /&gt;
A slightly more tongue in cheek example:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: delphi&quot;&gt;
procedure SexistTestLogic(const Cute, Funny, Smart: boolean);
begin
  case BoolToInt([Cute, Funny, Smart]) of
     000: Avoid;
     001: Admire;
     010,
     011: Befriend;
     100: Tolerate;
     101: HandleWithCare;
     110: Adore;
     111: Marry;
  end;
end;

&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/2692915627174111777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/07/weird-code-snippet-1-pseudobinary-case.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/2692915627174111777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/2692915627174111777'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/07/weird-code-snippet-1-pseudobinary-case.html' title='Weird code snippet #1: Pseudobinary case statement'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-1394400648986432835</id><published>2011-06-14T16:24:00.000+02:00</published><updated>2011-06-14T16:24:53.631+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bind"/><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Generics"/><category scheme="http://www.blogger.com/atom/ns#" term="Wishlist"/><title type='text'>Finding yourself in a property bind</title><content type='html'>From the wishful thinking department, I would love to be able to&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot; name=&quot;code&quot;&gt;var  
  Src: TSomeClass;
  MyObject : TBoundObject&amp;lt;Boolean&amp;gt;;
begin
  MyObject.Bind(Src, CompilerMagic(TSomeClass.SomeBooleanProperty));
end;
&lt;/pre&gt;instead of&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot; name=&quot;code&quot;&gt;var  
  Src: TSomeClass;
  MyObject : TBoundObject&amp;lt;TSomeClass, Boolean&amp;gt;;
begin
  MyObject.Bind(Src, &#39;SomeBooleanProperty&#39;);
end;&lt;/pre&gt;Why?  Because the first one is resilient to property renaming.&lt;br /&gt;
Until I can, I am stuck with using something similar to&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot; name=&quot;code&quot;&gt;var
  Src: TSomeClass;
  MyObject : TBoundObject&amp;lt;TSomeClass, Boolean&amp;gt;;
begin
  MyObject.Bind(Src,
    function (const Ref:TSomeClass):Boolean // reads the bound prop
    begin
      Result = Ref.SomeBooleanProperty;
    end,
    procedure (const Ref: TSomeClass; const Value:Boolean)  // writes the bound prop
    begin
      Ref.SomeBooleanProperty := Value;
    end);
end;&lt;/pre&gt;which actually has some benefits - such as being able to sanitize assigned values - but is way too verbose.&lt;br /&gt;
&lt;br /&gt;
I wish...</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/1394400648986432835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/05/finding-yourself-in-property-bind.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/1394400648986432835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/1394400648986432835'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/05/finding-yourself-in-property-bind.html' title='Finding yourself in a property bind'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-768290163654456018</id><published>2011-04-08T17:02:00.006+02:00</published><updated>2011-06-14T21:45:01.684+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="Enumerated types"/><category scheme="http://www.blogger.com/atom/ns#" term="Generics"/><title type='text'>Generics, Enumerated types and ordinal values</title><content type='html'>I wish this was a solution post, but it is a frustration post.  I trying to figure out how I can use Ord() to convert an enumerated type to integer or cast an integer to an enumerated type using generics type arguments?&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:delphi&quot;&gt;uses
  SysUtils,
  TypInfo;

type
  TSomeEnumType = (TheFirst, TheSecond, TheThird, TheFourth);

type
  TEnumGen&amp;lt;TEnumType&amp;gt; = class
    class function Name(const Enum:TEnumType):String;
    class function Value(const Ordinal:Integer):TEnumType;
  end;

class function TEnumGen&amp;lt;TEnumType&amp;gt;.Name(const Enum: TEnumType): String;
begin
  Result := Format(&#39;%s.%s&#39;, 
    [GetTypeName(TypeInfo(TEnumType)), 
     GetEnumName(TypeInfo(TEnumType), Ord(Enum)) // &lt;-- Bombs
    ]);
end;

class function TEnumGen&amp;lt;TEnumType&amp;gt;.Value(const Ordinal:Integer):TEnumType;
begin
  Result := TEnumType(Ordinal); // &lt;- Bombs
end;
&lt;/pre&gt;
&lt;br /&gt;
Unfortunately there is no &quot;enum&quot; delimiter that can be used to tell the compiler that Ord() and casting of integers should be allowed for generic enumerated type arguments.</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/768290163654456018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/04/generics-enumerated-types-and-ordinal.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/768290163654456018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/768290163654456018'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/04/generics-enumerated-types-and-ordinal.html' title='Generics, Enumerated types and ordinal values'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8837899541977019574.post-5991590870183969693</id><published>2011-01-06T10:12:00.003+01:00</published><updated>2011-06-16T16:09:15.922+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="delphi"/><category scheme="http://www.blogger.com/atom/ns#" term="popularity"/><title type='text'>Dataists: Ranking the popularity of programming languages - YALPC</title><content type='html'>Yet Another Language Popularity Contest - &lt;a href=&quot;http://www.dataists.com/2010/12/ranking-the-popularity-of-programming-langauges/&quot;&gt;Web site dataists had an article in december&lt;/a&gt; about the popularity of programming languages, using data from StackOverflow and GitHub to measure popularity.  Delphi scored high on StackOverflow, but low on GitHub - which probably reflect on the SVN support in Delphi, making SVN more popular than Git for Delphi users.  Note that the scales are by rank, and not by relative number of entries.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.dataists.com/2010/12/ranking-the-popularity-of-programming-langauges/&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;http://www.dataists.com/wp-content/uploads/2010/12/rank_scatter1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://delphi.fosdal.com/feeds/5991590870183969693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://delphi.fosdal.com/2011/01/dataists-ranking-popularity-of.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/5991590870183969693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8837899541977019574/posts/default/5991590870183969693'/><link rel='alternate' type='text/html' href='http://delphi.fosdal.com/2011/01/dataists-ranking-popularity-of.html' title='Dataists: Ranking the popularity of programming languages - YALPC'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry></feed>