# Planet Object Pascal

## April 18, 2014

### The Podcast at Delphi.org

#### Meet Me in Chicago & D.C./Baltimore for a First Look at XE6

I’m joining Bob Swart and Cary Jensen for the U.S. cities of their annual Delphi Developer Days 2014 tour with the keynote and a free evening event. During my keynote and the evening session I’ll show off Google Glass development with XE6, as well as using an EEG Brain-Computer Interface to control a Mini-Cooper via Bluetooth.

I highly recommend you find time to attend the whole two days of training. I always learn a lot.

May 5-6, 2014: Washington DC/Baltimore
SpringHill Suites Arundel Mills BWI Airport
Register for Training in Washington DC/Baltimore
The free evening event starts at 6:30 PM on Monday the 5th with pizza and drinks. Same location. [Register for free event]

May 8-9, 2014: Chicago
Holiday Inn Express Hotel & Suites, Arlington Heights (O’Hare Airport)
Register for Training in Chicago
The free evening event starts at 6:30 PM on Wednesday the 8th with pizza and drinks. Same location. [Register for free event]

Delphi Developer Days are two-day live Delphi events that provide you with the latest information on Delphi as well as practical techniques to help you improve your Delphi development skills. Each event includes both joint sessions, presented by Bob and Cary together, as well as simultaneous tracks, where Cary and Bob break out into separate rooms to present individual sessions. There is also an Embarcadero Technologies Keynote by Jim McKeeth and guest speaker sessions with Nick Hodges (former Delphi product manager) of Veeva Systems in DC/Baltimore, and with Ray Konopka of Raize Software in Chicago.

A wide variety of topics are covered. Some topics, such as FireDAC and mobile development, apply to the latest versions of Delphi, but there are also many topics that apply across many versions of Delphi. See the detailed description and agenda.

• An extensive course book (several hundred pages in length) written by Cary and Bob that includes the material covered in their sessions
• Source code examples from their sessions
• A chance to win valuable prizes from sponsors.
• Lunch on both days

Space is limited to the first 42 people in each city. There is a discount for attendees of previous 2009-2013 tours, and group discounts are available when registering three or more people from the same company.Visit www.DelphiDeveloperDays.com for complete information.Platinum Sponsors: Embarcadero Technologies, Sybase, An SAP Company, and TMS software. Gold Sponsors: Devart, Dr.Explain, Gnostice Information Technologies, and Raize Software.

### Andy's Blog and Tools

#### DDevExtensions, DFMCheck and ByteStrings for XE6

DDevExtensions 2.81 adds support for RAD Studio XE6.

DFMCheck 1.5 supports RAD Studio XE6.

System.ByteString for RAD Studio XE6 gives you the (hidden) native Byte-String types for all mobile platforms back.

## April 17, 2014

### Behind the connection

#### ICS updated for Delphi XE6

ICS has been updated for Delphi XE6. No new feature, just a simple update for the latest Delphi version. VCL and FMX supported for desktop platforms. Mobile still under way. Download as usual. See http://wiki.overbyte.be Follow me on Twitter Follow me on LinkedIn Follow me on Google+ Visit my website: http://www.overbyte.be

### twm’s blog

#### Determine the Delphi installation directory from a batch file

Since I work on several projects that require multiple Delphi installations, I needed a way to start the correct Delphi IDE and call the correct command line compiler for each of these projects. There apparently is no way to automatically detect the Delphi version from the .dof,.dpr or .dproj file (or at least this is limited), so I added batch files to these projects that call the correct Delphi version.

One of the things that irked me was that I had to adapt these batch files whenever I was working on a different computer and Delphi was not installed in the default installation directory. Finally I found a solution for this: The required information is stored in the registry at

HKCU\Software\(Borland|CodeGear|Embaracdero)\(TheDelphiVersion)\root

And the place where this is stored does not vary. I set out to find a way to read the registry from a batch file and found this answer on stackoverflow.

So, here is the result. A batch file that, when called with a Delphi version as parameter, returns the directory it is installed in:

@rem set the DelphiPath variable for various Delphi versions

setlocal

set DelphiVersion=%1

rem Support for Windows 7/8, 64 Bit
set ProgFiles=%ProgramFiles(x86)%
if not "%ProgFiles%"=="" goto Win64Bit
set ProgFiles=%ProgramFiles%
:Win64Bit

set DelphiPath=

rem this is equivalent to a case/switch statement
rem call :Delphi%DelphiVersion% resolves into call :Delphi6 etc.
call :Delphi%DelphiVersion%
goto DelphiEndCase
:Delphi6
goto :eof
:Delphi7
goto :eof
:Delphi2005
goto :eof
:Delphi2006
goto :eof
:Delphi2007
goto :eof
:Delphi2009
goto :eof
:Delphi2010
goto :eof
:DelphiXE
goto :eof
:DelphiXE2
goto :eof
:DelphiXE3
goto :eof
:DelphiXE4
goto :eof
:DelphiXE5
goto :eof
:DelphiXE6
goto :eof
:DelphiEndCase

echo DelphiPath: "%DelphiPath%"
if exist "%DelphiPath%" goto allok
echo *** Error: Directory "%DelphiPath%" does not exist. ***
pause
goto :eof

:allok
endlocal & set DelphiPath=%DelphiPath%
rem echo DelphiPath: "%DelphiPath%"
goto :eof

rem read the registry entry
set DelphiPath=
FOR /F "usebackq skip=2 tokens=3,*" %%A IN (REG QUERY HKCU\Software\%1 /v RootDir 2^>nul) DO (
set DelphiPath=%%A %%B
)
rem remove one trailing space which might have been added because %%B was empty
rem remove any quotes
set DelphiPath=%DelphiPath:"=%
set DelphiPath="%DelphiPath%"
rem remove space before the closing quote
set DelphiPath=%DelphiPath: "="%
rem remove any quotes
set DelphiPath=%DelphiPath:"=%
goto :eof


On this particular computer …

call delphipath.cmd XE6
echo %DelphiPath%


… writes …

d:\delphi\DelphiXE6


… and this …

call delphipath.cmd XE4
echo %DelphiPath%


… writes …

C:\Program Files (x86)\Embarcadero\RAD Studio\11.0\


This batch file is now part of my collection of build tools.

### The road to Delphi

#### Delphi Dev. Shell Tools now supports Delphi XE6 and Appmethod

The Delphi Dev. Shell Tools now supports Delphi (RAD Studio) XE6 and Appmethod , also the new version include some fixes and new features.

You can download the shell extension from the project page.

### Firebird News

#### Current status of the Firebird bugfixing : Tracker Roadmap

Here in Tracker is the current status of the Firebird bugfixing for the next releases Firebird 2.5.3 and Firebird 3.0 Beta 1

### The road to Delphi

#### DITE now supports Delphi XE6

I just added support for Delphi (RAD Studio) XE6 to the Delphi IDE Theme Editor.

Check these screenshots

You can download the installer from here

## April 16, 2014

### TPersistent

#### MSBuild MSB6003 Work Around

One of the QC items not fixed in the XE6 release is 98008, probably because it is still in the Reported state even though it was submitted August 23, 2011. I have previously blogged about the state of QC, so I won’t get into that issue again, suffice to say I hope the QPS initiative continues, and QC incidents get reviewed.

I have been encountering the same error as QC98008 because between DevX, TeeChart, and TMS the search paths for units (stored in OPTSETS) has exceeded the 32,000 character limit primarily because the same paths are used multiple times by MSBuild when constructing the build command.  It was included in the ResourcePath, IncludePath, UnitSearchPath and ObjectPath.  Since no OBJ files were in use, and resources are included in the project files, we simply changed the CodeGear.Delphi.Targets file located in the Delphi Bin folder, setting both the ResourcePath and ObjPath to an empty string (lines 192 & 194) as follows:

ResourcePath="" IncludePath="$(IncludePath)" ObjPath=""  This resolved the duplicate path issue that resulted in the exceedance of the 32000 character limit. #### XE6 Released with some Interesting Features I attended the webinar today announcing Delphi XE6. It’s been a long road for the EMBT dev team to provide both C++ and Object Pascal support for iOS, Android, OS X, and Windows in the same environment. Kudos to them for accomplishing that feat, and incorporating over 2000 bug fixes into the XE6 release. The article lists 500+ fixes for customer reported issues. I assume the remaining 1500+ items were issues found internally. Using QC for Windows I found that there are already 17 bug reports for XE6 build 20.0.15596.9843. Unfortunately I cannot get a listing of all the issues fixed because querying using 20.0 or the full build # in Resolved in Build field yields 0 results. I am looking forward to installing a trial in a VM, and checking out the latest “Key New Features” - Quality, performance and stability! It was great to see that the VCL got some love and of special interest to me was the tethering capabilities for mobile devices. I can’t wait until 64 bit OS X apps and Linux are supported, but the product is definitely heading in the right direction. ### The Wiert Corner - irregular stream of stuff #### jpluimers I just watched the 2nd Launch Webinar Today for Delphi XE6, C++Builder XE6 and RAD Studio XE6. Below my signature is the Q&A of it. A whole lot of them (: –jeroen ### Welcome to this Embarcadero webinar event! • Q: hello • A: Hello. We will be starting a a little bit. • Q: I have no audio :( , this is a firewall issue down here • A: Sorry to hear that. We will have a replay available later. Not sure if any way around the audio issue. Odd that a firewall would block the audio and not the video. • Q: Where can I find the list of performance increase in firemonkey platform? Thanks • A: XE6 contains a number of perrormance and bug fixes along with some great new features. • Q: is it important microphone in this webinar* • A: no microphone is necessary • Q: When will be start? • A: Probably start in about 10 minutes. • Q: hello from Istanbul • A: Hello Emrah • Q: Will it start on Delphi or c++? • A: Both :) • Q: Hello from Oklahoma! • A: Hi Allen • Q: Hello from Brazil :) • A: Hi Eric • Q: Hello from Turkey, • A: Hello Sayat, Welcome • Q: what new components will be added in XE6? • A: We will show you in this webinar • Q: Hello from The Netherlands • A: Hi Ben • Q: Hello from Iowa • A: Hello Nick • Q: How long till we begin? :) • A: In a few minutes • Q: Hi from Germany • A: Hi Matthias • Q: hello from Italy • A: Ciao, also from Italy – Marco • Q: Hello from Denver • A: Hi Ian • Q: Hello from Minnesota! • A: Hello Wynn • Q: Hello from Czech Republic • A: Hi Michal • Q: Hello from Turkey, This Is Sayat • A: Welcome Sayat • Q: I’m from Catania Italy • A: Buonasera da Piacenza – Italy • Q: hello from Germany too :-) • A: Hello from Boise, Idaho. • Q: Is there still no way to add a splash screen for Android? Showstopper! • A: There are actually several ways to add a splash screen to Android • Q: Hello from Toronto • A: Hello from Nampa, Idaho. ;-) • Q: Hi, I’m from Washington. • A: Hello from Nampa, Idaho. ;-) I used to live up in northern Washington. • Q: Hello from the netherlands • A: Hello from Nampa, Idaho. ;-) • Q: Hello from poland..:) • A: Hello from Nampa, Idaho. ;-) • Q: Hello from Sunny California, USA • A: Hello from Nampa, Idaho. ;-) • Q: buonasera da Napoli • A: buonasera da Piacenza – Marco • Q: Hello Jim • A: Hello Ray! • Q: Hello from Poland • A: Hello from US and Italy • Q: Hello from Seattle • A: Hello from Nampa, Idaho. ;-) • Q: Hello from Germany! • A: Hello from US and Italy • Q: Hello from Ohio • A: Hello from Nampa, Idaho. ;-) • Q: Hello form Ukraine • A: Hello from US and Italy • Q: I hope it starts soon • A: wish granted • Q: Hello from a small town in northern Colorado! • A: Hello from a small town in Idaho. • Q: Does it have 32 bit support? • A: Yes it does. • Q: Hello From Turkey • A: Hi Mehmet • Q: Hello from Brazil, SP! :-D • A: Welcome Gustavo • Q: Hi! From Milan, Italy. • A: Ciao Marco • Q: when will XE6 be available? • A: XE6 is available today. You can download a free trial or purchase from our online store https://store.embarcadero.com, from an Embarcadero partner, or Sales • Q: Will be able to use STL library (std::map, std::auto_ptr…) in Android projects in new C++Builder XE6? Thanks. • A: Yes, STL is supported in C++ for Android • Q: I’ve tried a few splash methods and none worked. The problem is getting it to display before the app is initialized. • A: We can put a blog post together about some of the alternative approaches • Q: Hello from Tampa • A: Hi Francisco • Q: And another hello from Germany! • A: Welcome Achim • Q: Hello from Rio de Janeiro – Brasil • A: Hi Alberto • Q: Hi from Greece • A: Welcome Athanasios • Q: Hi friends!!! from Argentina • A: Welcome Carlos • Q: The vcl app developed with xe6 run on winxp or not? • A: Yes, although Windows XP is not officially supprted there is nothing in XE6 that will prevent you from building apps that can run on it • Q: why is app thethering only working from the same subnet? • A: We designed it to be a “near field” solution, typically near the tethered app, think of it as an extension to the UI of an app that is within the same room or building • Q: Does Firemonkey supports OpenGL? • A: Yes, OpenGL on Mac OS X, and Open GL ES on Android and iOS • Q: Will there be a way to use the native Android webbrowser in a firemonkey app? • A: Yes, there is a web browser control available for Android apps • Q: If i have Rad Studio XE5 with 1 year insurance I have to pay for XE6 ? • A: If your Support and Maintenance subscription is current – then you will receive XE6 under that subcription. You would not have to pay add’l to receive. • Q: Hello from Turkey • A: Hi Medhi • Q: Hello from Colombia • A: Hola Jhon • Q: Hello from Austria! • A: Hi Roman • Q: when you’ll be adding support for Windows Phone platform? • A: We have not published a timeline for Windows Phone platform support but keep an eye on our reguarly published roadmap • Q: Hello from Brazil – RS :) • A: Welcome Rene • Q: so is there possibility to use new Vcl in developing Android apps? • A: You will build Android apps in FM – but can tether that Android app to a VCL desktop application. VCL is desktop only. • Q: Hi from Calgary • A: Welcome Alexander • Q: Will the current mobile package install under xe6 pro? I have SA for xe5 pro and for mobile pak. When will mobile pak be upgraded from xe5? • A: The Mobile Add-On Pack is tied to the Delphi or C++Builder Professional IDE version. If you have SA both, you should have access to the XE6 version of both from the Maintenance Portal. Please submit a support case if you don’t see it. • Q: Hello from the UK, I’m Orfeas • A: Hi Orfeas • Q: just bought xe5 earlier this year: is XE6 not a free upgrade for recent licencees? i recall that it used to be that way • A: You can recharge your XE5 license to XE6 for a much lower cost than an upgrade if you are not on a support and maintenance subscription. • Q: Are all platform compliers 64-bit? If not, which platforms besides Windows have 64-bit support now? • A: all other non-Windows platform compilers are 32-bit • Q: I understand there are a lot of C++ 11 features built into the Clang 64 bit compiler. Are there any plans to implement those same C++ 11 features in the 32 bit compiler? • A: yes, these features are in our published roadmap • Q: Can XE6 be legend like Delphi 6? :) • A: Indeed it can! • Q: Here is Frankfurt/Germany. • A: Hi Achim • Q: YES! C++ for Android! • A: Woohoo! • Q: Why always c++ is behind Delphi in each version of RAD, for example here in XE6 google glass is added to Delphi and not in C++… why there is no parallel-Added-new-Features regarding c++ and Delphi? • A: Google glass is supported in C++, all the features you see today are fully supported in C++ as well as Delphi • Q: Are there any new iOS and Android styles in XE6 • A: iOS7 and KitKat styles (although we did make them avaiable to XE5 users too) • Q: When will this webinar end? • A: The presentation will end around 12PM PDT but we will stay on to answer questions live for another 30 minutes or so • Q: If I want to develop a 64bit windows App using VCL, can I link that to a 32bit app for android? • A: With App Tethering, yes • Q: Are there differences between the C++ support in Android and the 64-bit Wiondows C++ support? • A: The only difference is the STL library, we support Dinkumware on Windows and GNU STL on Android, the language support is the same • Q: I meant; is there a way implement a ‘NATIVE Andoid mapview’ in a firemonkey app? • A: You have direct access to all of the Android native APIs, but there is also a 3rd party native mapview component http://www.helpandweb.com/ecmap/en/tecnativemap.htm • Q: Will the webinar be downloadable for the rest of my team? • A: Yes. We will send a follow-up email with a link to the webinar replay within the next week. • Q: The XE6 Delphi will compile for Linux? • A: Windows (32-bit and 64-bit), Mac OS X, iOS and Android • Q: Is Taskbar-Preview also available for FMX-Programs? • A: No the component is only in the VCL (for now), although the core APIs can be called also from FMX • Q: Hello from Spain!!!! • A: hello • Q: Does “AppTethering” mean tying a single mobile device with a single desktop app, or about supporting multiple mobiles? (ala a store shoppoer experience app) • A: it is for extend the UX a single application to multiple devices not fixed to the desktop – ie Desktop -> Mobile and Wearables. You could also provide access by other users/customers. Example: Retail Point Of Sale application at the checkout counter – and a tethered mobile app for the sales personel to do price lookups in the sales floor. Great for extending existing VCL applications with mobile UIs for certain features. • Q: Firemonkey apps file size seem a lot larger than native apps written in iOS and Java. Does XE6 helps with reducing the file size for these apps? • A: FireMonkey applications include the library itself in the runtime, which is why they are quite big. Other applications (like games) with a runtime are generally big. • Q: Q: Is there a support (headers) for OpenCL 1.2 and 2.0, AMP+ and the latest versions of OpenCL and DirectX? • A: DirectX 11 is supported in XE6 • Q: Is it possible to change app style via this very new feature in runtime? • A: Yes, you can set the default at design time, but can also be changed at runtime – and includes Windows 8.1 styles as well as other modern styles • Q: Will the webinar replay include the audience questions? • A: Yes it will • Q: Do you have windows 32-bit support? • A: Yes • Q: Is there any firemonkey improvement? • A: Lots of performance and quality improvements to Firemonkey. Over 2500 issues resolved in XE6. Major focus on quality and performance. • Q: Love Apps tethering!!! • A: :) how many use cases can you think of? • Q: Along with Glass, are there templates for other “android wear” form factors, such as the Motorola 360 watch? I want that watch… • A: We will be adding additional styles for other wearables – however you can also build a custom style of virtually any form factor android or iOS based device. • Q: can we now create 64-bit packages • A: For C++, yes! • Q: Will App tethering work also with MacOS (FMX)? • A: Yes will work with VCL (Windows) and FM (Win, MacOS, iOS, Android, even Google Glass) • Q: I’m likin’ this app tethering thing :-) • A: Thanks :) • Q: Can you use it to send information from the desktop to the phone app? • A: Yes you can • Q: With a tethered app, can you send info from the VCL app to the tethered mobile app? • A: Yes you can • Q: So I could write an music playing desktop app for my sound system and use a tethered Google glass app to scroll through and choose my music? • A: Yes! Nice idea. • Q: app tethering works for 2 vcl apps in same net Pc <> PC? • A: yes, pc to pc, pc to mobile, mobile to mobile, mobile to pc, any combination • Q: Is it possible to use the tethering functions to send data from the destop to the modile? • A: Yes, that is the concept. Take an existing desktop app (or build a new one) – and you can send data and trigger events back and forth between a mobile app or wearable app. • Q: Are these new tools available for Delphi too or just on the C++ side? • A: All the new features shown today are available in Delphi, C++Builder and RAD Studio. • Q: Can two phones tether/communicate to each other? iOS to iOS? iOS to Android? • A: yes, that would work • Q: Whats the advantage of tethering over using traditional sockets? • A: Tethering makes it extremely easy. And extremely easy to add to an existing application, say VCL Desktop app for example. • Q: Thanks Embarcadero for C++ Android!!! • A: You are welcome! • Q: Is there a feature included in Delphi and no in C++ in XE6? • A: Nothing specific, all features are available to C++ in XE6 • Q: So google glass could be used to control music playing in my iPhone as I go on my walk? • A: Yes, exactly the idea. • Q: Is tethering limited to local network connections? Can I tether mobile to mobile that are countries away, for instance? • A: Yes, must be on local sub-net – meant for near devices. bluetooth will come later • Q: Are all BaaS-providers based on a base-class so it’s easy to write own providers eg. for cloudbase.io? • A: Yes, and each service as well • Q: Can one use the push notification without BAAS services – i.e. sending from delphi app direct to APNS or GCM? • A: Yes, although you would need to setup your own server • Q: Can I send info using tethered between FM and IOS app. created using xcode? • A: Theoretically yes, Tethering uses REST/JSON – but the components make is super simple. You would need to write code in XCode. • Q: Works C++ for Android with Data-Snap? • A: Yes • Q: And thank you for all the bug fixes. That the right way! Move ahead! • A: You are welcome. • Q: Have you reduced the code size for the produced Android and IOS app.? • A: We have made some improvement in code size, yes • Q: Does just Delphi XE6 Pro allow to write any kind (not only REST) of Datasnap client application including TFDJSONDataSets and consuming FireDAC datasets with changes in deltas? • A: DataSnap is a feature of Enterprise, Ultimate and Architect editions. • Q: What kind of security / encryption is available for app tethering? • A: First, it only meant for near proximity devices on same subnet. Communicates via REST/JSON – so HTTPS is possible. • Q: Is there a custom cloud provider interface? • A: Yes, you can build or add add’l providers. We plan to add more providers and are working with more BAAS vendors for add’l providers. • Q: App Tethering, Is there security options to control which applications and devices can talk together? Is the Tethering encrypted or support encryption? • A: Tethering communicatons are not encrypted, they use HTTP and REST, but apps connect on a shared subnet so you can secure your wifi • Q: Can multiple devices “pair” with an app? • A: Yes, you can make multiple connections, see the chat demo • Q: Can tethering be used via a soap service? • A: REST only for now • Q: You will provide suport for StackMob, or only for Kinvey and Parse? • A: We include support for Parse and Kinvey. We expect others to create components too. Probably not StackMob since they are shutting down. • Q: You will provide suport for StackMob, or only for Kinvey and Parse? • A: Kinvey and Parse to start, but it’s an open platform which any vendor can add provider, we are working with add’l vendors so more vendors coming. • Q: Can you fully delevelp/test using the trial version or are there certain limitations? • A: The only limitation is no deployment (other than for debugging/testing purposes) is allowed • Q: Can you fully delevelp/test using the trial version or are there certain limitations? • A: BiDi mode is not supported in FM in XE6 • Q: What about BiDi mode for FM for RTL languages? Is XE6 Supports? • A: BiDi mode for FM in XE6 is not supported yet • Q: We are concerned about Heartbleed? Is RAD is out of this security issue? • A: We don’t ship OpenSSL, although some of our customers might be using a version of it. • Q: Is it (BiDi mode) on the Roadmap? • A: It is, but we don;t have a definitive timeframe • Q: Are there components to access iBeacons? • A: Not components, you’ll have to use the API • Q: I just love that you guys run on Macs! • A: It is a great environment, Windows works really well in VMWare and Parallels • Q: Any improvements in using Android Emulators? Or are we still going to have to use the device for most development? Looks like you are using a device in this Webinar… • A: We don’t develop the emulators, they come from Google, and they are notoriously slow • Q: What about VCL: Form scaling on high-dpi Windows settings, i.E. 150% or 200%? Is there a (new) property in the Form which can be used to determine the dpi settings on which the form was *designed*. • A: There is a DPI property, but the mix of DPI and fonts and other factors is not simple to manage always. We are looking to ways to improve this. • Q: Is tethering with multiple devices to one app possible? Does it make sense? • A: Yes, you can tether multiple devices. This could make sense to have a mobile app tethered to a desktop app- and a wearable tethered to the mobile and/or desktop app – up to your creativity. • Q: Been waiting for this persistent field feature for 15 years. My life is complete now :-) • A: Awesome! • Q: Does TWebBrowser support pinch zoom in XE6? • A: Yes, I just tested it on my Android phone and it works great. • Q: Will you apply these ‘fixes’ to ‘issues’ back to XE5?? Seriously • A: XE5 has received two major updates but we do not plan to backport all of these bug fixes to XE5 • Q: When we can buy XE6 and exist update price for XE5 user? • A: XE6 is available now. You can visit our online store at https://store.embarcadero.com for pricing in most countries. If you’re an XE5 user, click the Recharge link to see your Recharge from XE5 upgrade price that is more than 50% off the regular upgrade price. • Q: When we can buy XE6 and exist update price for XE5 user? • A: Yes, and a lower cost recharge price for XE5 users • Q: Hello from davenport, Iowa • A: hello • Q: Hello from Germany • A: hello • Q: Hello from Brazil • A: hello • Q: HI From Holland • A: hello • Q: Hi and good evening! • A: hello • Q: Are there any plans to push the fixes for the “2000 reported issues” into XE5? • A: No, XE5 had recevied two major updates • Q: How many participants are we today? • A: Many, more than the usual • Q: Hello from Sweden • A: hello • Q: Hello from Manchester • A: hello • Q: Hello from BC, Canada • A: hello • Q: I’am not Matthias, I’am Harry, • A: hello • Q: hello to everyone • A: hello • Q: Hello from Germany • A: hello • Q: Hello from Brasil • A: hello • Q: XE5 ‘recharge’ should be significantly less… especially if purchased within last 6 months • A: It is more than half the upgrade price • Q: Hello from Argentina! • A: hello • Q: Good job, you have done something that is really great in the market. • A: Thanks! • Q: Hello from Germany • A: hello • Q: Hello from Colombia :d • A: hello • Q: Hello from POLAND • A: hello • Q: Good job, you have done something that is really great in the market. • A: Thank you! • Q: Hello from Norway • A: hello • Q: do you provide student pricing? • A: Yes we do • Q: Bought XE 6 today through the recharge program :-) • A: Nice! Congrats. • Q: Hello from Florence Alabama that is • A: Hello from USA and Italy • Q: hello from Brasil • A: Hello from USA and Italy • Q: Hello from Greece. • A: Hello from USA and Italy • Q: hello from a sunny Holland • A: Hello from USA and Italy • Q: hello from Arizona • A: Hello from USA and Italy • Q: Hello from Barcelona, Spain • A: Hello from USA and Italy • Q: Hello from Switzerland – the Home of Pascal • A: Hello from USA and Italy • Q: Hello from Mexico … • A: Hello from USA and Italy • Q: When we can buy XE6 and exist update price for XE5 user? • A: You may recharge an XE5 license to XE6 for lower price – or upgrade price to XE6 from earlier versions back to XE2. • Q: hello from Poland ;) • A: Hello from USA and Italy • Q: if there are bugs you’re not going to apply back to XE5 you should REALLY cut us a BIG break • A: That is the purpose of the recharge SKU – it is more than 50% less than the usual upgrade price • Q: hi from germany • A: Hello from USA and Italy • Q: Hello from Spain too! • A: Hello from USA and Italy • Q: The most crucial feature in the next version of what is waiting for us? • A: Check out the published roadmap • Q: what I realy miss is documentation will there be more documentation with xe6? • A: We have expanded the current documentation and added coverage for (most) new features • Q: What about native iOS and OS X components for FireMonkey applications. • A: We do support some native controls but we are actively researching this • Q: why not apk size wiil be change? • A: It is somehow similar in size, compared to XE5 • Q: I´m on SA and have already received and installed my XE6.. Am I eligible for TMS Modern Windows UI Pack?? • A: Yes! • Q: saw that version in XE5 firemonkey lacks the Richtext component. The XE6 is this component? • A: Correct, there is no RTF component in FMX • Q: Can tethering handle HD video, or just still pictures/text? • A: Text and images. We might consider streaming in the future. • Q: Will Linux support is on your roadmap? • A: Yes, for server side applications • Q: Can “Error insight” function correctly with type helpers ? (for example, in System.Classes) • A: We have made some improvements, many more are coming. • Q: Where can I find the student pricing information? • A: Academic licensing is mostly done through our reseller partners. You can click Buy Now on our web site and find a reseller partner that serves your area. Or choose the Contact Sales option to contaact our sales team. • Q: Someone fancies an cup of coffee? • A: thanks for the offer of coffe • Q: Very interesting! • A: thanks • Q: How much will cost the recharge to XE6 from XE5 ?/ • A: less than half the cost of an upgrade – depends on which edition • Q: FireMonkey improvements will be carried to future versions of Appmethod (in parallel)? • A: Yes, there is an appmethod update in the works that also will receive all the XE6 capabilities. • Q: C++ in Android apps in Appmethod? • A: In the next release of Appmethod • Q: I’m on SA for Delphi Enterprise untill October. Should I stay with that or should I move to Recharge option? • A: if you are already on SA, you should stay with it, it is a cheaper option if you are already on it • Q: Is there an update coming for XE5? • A: No more major updates planned for XE5 at this point. • Q: I am an XE5 user.. I got an email with serial number for XE6.. I downloaded it.. I just checked it desn’t say anything about trail version.. • A: Correct, you have a fulll version • Q: You’re all still echoing • A: Sorry, not sure why • Q: XE6 is very exciting! Thank you very much and congratulations for all the team!! Keep up the great work for future versions!! • A: Thanks Eric • Q: What will be the prices of recharge? • A: Visit our online store at https://store.embarcadero.com or one of our reseller partner sites or contact sales to get pricing in your area. • Q: When will Linux support be available? • A: We haven’t announced a release plan for that • Q: HI there; Do you have a link to the future development roadmap? (Interested in Win based Web App Development, HTMLBuilder is okay, but we’re a Delphi not a PHP shop). • A: http://edn.embarcadero.com/article/43677 • Q: can you mix devices, android and iOS, Windows for tethering? • A: Absolutely • Q: Will XE6 compile for Windows 8 Phone? • A: That’s not a supported deployment platform in XE6. • Q: can you mix devices, android and iOS, Windows for tethering? • A: Yes, that is the idea. Windows -> Mobile for example • Q: Where can i get Delphi future roadmap? • A: It is published on EDN • Q: What do you get with Rad Studio Ent that you don’t get with the Delphi Ent SKU? • A: C++ and HTML5 Builder • Q: Is SQLite database encryption in FireDAC on Moblie available/planed? • A: Not planned but IBToGo does provide encryption • Q: HTML5 Builder is not available anymore? • A: It is available as part of RAD Studio • Q: Many of the FM components look terrible on the ios device. • A: Are you using the proper style file? • Q: are data controls avaialbe in firemonkey or do we still need to use live binding • A: all controls are data aware with live bindings (you do not have to use the visual live binding designer) far more flexible • Q: Appmethod update ETA? • A: This summer • Q: Will there be “Starter” and “Academic” choices on the XE6 purchase page ? They do not exist yet… • A: C++Builder XE6 Starter is there. Delphi XE6 Starter seems to be missing and will be added. Academic products are available from Embarcadero Sales or through our reseller partners. • Q: Where there any changes made to HTML5 Builder? • A: Yes, some library support has been updated to the latest • Q: What are the limitations of Tethering? • A: can you be more specific? tethering can be used for many different use cases and device types. • Q: Is BaaS available in xe6 pro with mobile addon? • A: Yes it is. • Q: Where is the updated future roadmap and when did you updated ? • A: It was updated about a month ago and is on the EDN site • Q: Which version of Fast Reports VCL is included? (I assume the latest) • A: Version 4 • Q: You must create stability in your development environment, XE5 components took time to arrive, then once they arrive you inform us today the XE 5 environment with 2000+ bugs is gone and you must wait again for your component vendors. • A: Most of the 3rd party component vendors are supporting XE6 already • Q: The only difference as I see regarding mobile development compared to original vendor tools is big size and may be performance. Is that true? • A: Original vendor tools require a separate project and codebase and development cycle for each platform. RAD/Delphi/C++ XE6 you can use one code base for multiple/many devices. • Q: Is Rave Reports and/or Quick Report will be available on XE6 registered users ? • A: FastReport is our only bundled reporting solution. • Q: May you confirm that we can use tethering to connect *from* a desktop App to all devices in the same subnet, so sending text/actions/whatever from desktop App to mobile App? • A: Confirmed • Q: Does the new GPU Canvas for Windows use OpenGL(-ES)? • A: Yes, on Android, iOS and Mac OS X • Q: Can C++ Builder XE6 build and compile open all open source libs and sources, or is that ability not tested? • A: We test with several large libraries like Boost and ACE/TAO for example • Q: does Embarcadero plan to support Windows Mobile? (I don’t remember the exact name they use for the windows used in mobiles) • A: We are monitoring Microsoft’s Windows mobile plans, market uptake, and customer demand closely, we have not yet announced plans for Windows Mobile. • Q: When Delphi’s Quality Central program will be upgraded to JIRA ? We want to see JIRA for Delphi QC Reports • A: Later this year. • Q: Are you planning to expand MacAPI (Mac OSX) support for example MIDICore? I about C++ Builder. thank you • A: Yes, we will continue to expand the framework support for various platform APIs, and there are also 3rd parties and open source providing components for various platform APIs – and of course all native APIs are directly always accessible at any time. One of the powerful benefits of Delphi/C++Builder is the framework and the ability to directly access any API • Q: The XE6 has RTF component for FireMonkey? • A: No RTF component yet • Q: What about support for phones that don’t have NEON? • A: We are investigating other FPU libraries but in XE6 NEON is required • Q: Is tethering supported on internet? when I have web service->through internet line->mobile • A: Intended for near proximity devices, so confined to same subnet – this also provides for the security and encryption. Same for bluetooth support which will follow for tethering later. • Q: Is tethering supported on internet? when I have web service->through internet line->mobile • A: Tethered devices need to be on the same subnet • Q: hallo world app for andriod compiled in xe5 is about 25 meg and load time well too slow about 15 sec, has this been improved in xe6 • A: Yes, this should be improved • Q: Is DelphiXE6 stable and fast with very large projects. • A: Yes, IDE stability has been a focus area, in particular, you can do builds of large projects outside of the IDE memory space which helps • Q: Congratulations!!! BaaS and Tethering are very exciting features! Many thanks! • A: Thank you! We’re very excited to see what everyone builds with XE6! • Q: We love Delphi • A: We too. • Q: Is the tethering connection encrypted, or can it be (with TLS perhaps)? • A: Tethering is designed for near proximity devices – similar to bluetooth (which will also be added later) – so is intentionally confined to devices on same subnet, so security and encryption are based on your wifi/subnet. • Q: I do not see TMSSoftware showing XE6 capability • A: Well, you might have to give them a few days… we know they are working on supporting XE6 • Q: Hello from Catania, Italy • A: Hi, Giovanni – Marco • Q: The FireMonkey is stable for development of large applications? I miss some things. • A: Yes. Many many performance and stability improvements to FM in XE6. • Q: The What’s New page says that three BaaS are supported, but only lists Kinvey and Parse. Is this a mis-print, or was a third one left out? • A: We’ll look into that. There is a 3rd vendor who is working on support and I expect available soon – and others who we are discussing with adding support. It’s an open interface, any BAAS vendor can build a provider for their service. • Q: Is there support for OS-specific native controls inside FireMonkey forms? • A: You may use any native API directly – but there are also some native API packs available from TMS and opensource such as http://sourceforge.net/projects/dpfdelphiios/ • Q: What about DevExpress. Are they yet commited with Delphi development? Did you have any information? • A: The list we showed are just some featured partners who are early to support XE6. There are many more partners planning to support XE6 beyond that. • Q: HI! Im late. Will this webinar downladable? • A: Yes. We will send out a link for the replay within a week. • Q: windows 8 phone support: is that included • A: Not yet natively via Delphi or C++Builder. HTML5Builder supports HTML5 apps on Windows Phone. • Q: Which versions of Windows tablets will XE6 compile apps for? • A: Surface Pro and others will full Windows 8 (not just WIndows RT) • Q: thank you work your work. • A: Thank YOU! • Q: thanx guys – i’m lokking forward … • A: Thank you, we’re looking forward to see what you build! • Q: Are Datasnap webinar and other online events in the pipe? • A: VCL Dev Guide to XE6 webinar with Marco April 30. BaaS with David I and Jim in mid May. DataSnap and REST with Pawel in June. FastReport webinar on May 6. • Q: Does delphi have any help with UML and the OOP design process • A: Delphi has a complete UML designer – which is livesource two-way between source code and model surface. so you can “live” reverse engineer any existing project or use to forward engineer a new or existing project. it is turned off by default, but you can enable under the project manager for any project. • Q: Where can I get the questions and answers recorded with sound not only in written mode? • A: A recording of some of the Q&A will be included in the webinar replay video • Q: Does RAD XE6 Pro come with the mobile addon or do I need to purchase Enterprise or buy the Delphi Mobile addon if I stay at Pro? • A: Delphi Pro is Desktop only (Windows/Mac), and you can add the mobile addon – or get via Enterprise or higher or any RADStudio edition. • Q: When available if have support contract? • A: The notifications went out to Support and Maintenance customers yesterday so it’s available now • Q: The most crucial feature in the next version of what is waiting for us? • A: More of what you’re seeing here. More Datasnap. And more and more performance/platform APIs, and device types. • Q: Does the windows compile options include RT? • A: Not currently no. We continue to monitor the Windows Mobile trends and Microsoft plans. • Q: Does C++ Builder have full support on using UML? • A: Yes, both Delphi and C++Builder have full 2-way UML built in (check the feature matrix for capabilitiy levels). • Q: Are there any additional iOS frameworks wrapped in FM for XE6? • A: Supported OSes are Windows, MacOSX, iOS, and Android. New devices/formfactors directly supported such as Google Glass. • Q: Thanks all of you for give us an excelent product, happy coding • A: Thank you! • Q: Can I install XE5 and XE6 on the same pc? • A: Yes • Q: is the full version of intraweb included in xe6 enterprise or do I have to buy separte, is there any other options to create web apps • A: It is a version that has 20min session limit. • Q: will there be downloads for ipworks/aqtime/infopower? nothing in registered user downloads yet I don’t think? • A: IP*Works and AQtime are there. InfoPower was just previously licensed for a promotion and we have TMS in the current promo so no plans to have another InfoPower download currently. • Q: Can you deploy and commercially sell products using the academic license? What are the academic lisence limitations? • A: No, you can’t. Search for Educational Use in the EULA for more info. http://edn.embarcadero.com/article/43716 • Q: May I do reverse direction tethering? From VCL to Android or IOS? • A: Yes. and Yes from any platform to any platform. • Q: Which Indy version is included in XE6? • A: The latest. • Q: Good news. Delphi long life. • A: Thanks! • Q: thank you. i must go. • A: Thanks to everyone for attending! • Q: are XE6 dcu compatible with XE5 dcu – in case of components without source? • A: XE5->XE6 requires recompile • Q: Is there any plans to support importing popular skinning themes file formats as Windows Themes os WindowBlinds in Embarcadero skin editor? • A: Great idea to support directly, but not currently. However many VCL skins have been converted from these formats – and is fairly straight forward using the VCL skin editor. • Q: Where can i buy the starter edition? Why cant i find it, is it free? • A: The Starter editions are paid products available from our online store and our reseller partners. We don’t offer a free edition of Delphi or C++Builder. • Q: Don’t stop growing :) but think about IDE Add ons for UnitTest please…good joob !!! • A: Will do, thanks for the suggestion! and thanks for participating today. • Q: Do you say DelphEE or DelphEYE? (I should know this after 19 years of Delphi!) • A: In the US we generally say EYE. In Europe they mostly say EE. We consider it correct either way :) • Q: BaaS as open interface sounds like a new thing! Have Embarcadero proposed a standard that providers are willing to follow to? • A: It’s an open API, but not a proposed standard. However we are working with other BAAS providers who are building providers for their specific BAAS services. • Q: I have Software-Maintenance for XE5 including DBPower-Stuio XE5. Will it be possible to upgrade to DBPowerStudio XE6 by maintanance. • A: If you have an Ultimate Edition license, you can click to download the latest version of DB PowerStudio at the end of your RAD Studio install and then use your RAD XE6 serial number to register it. • Q: Do Maintenance customers have access to the bonus ‘TMS Modern Windows UI Pack’ that comes with XE6? • A: Yes. It’s not there yet but coming soon. • Q: Do Maintenance customers have access to the bonus ‘TMS Modern Windows UI Pack’ that comes with XE6? • A: Yes! • Q: What a great release! • A: Thanks everyone! • Q: Hi ! I loved Delphi 1.0. Lost interest in Delphi after ver 2.0. Is XE6 compelling enough to draw me back to Delphi or related producrs ? • A: Thank you, welcome back! • Q: Thank you, Gentlemen. • A: Thank you! • Q: i think this release will be legend :) good job • A: Thank you so much! ### — Filed under: Delphi, Delphi XE6, Development, Software Development ### twm’s blog #### Experimental GExperts Version 1.37-2014-04-16 released Following up on Erik’s overnight surprise release of GExperts for Delphi XE6, here is a new release of my experimental version with the code formatter. The DLLs for all Delphi versions supported by the official GExperts are included. BE WARNED: This version has only tested in so far, that it can be installed into Delphi XE6. Nothing else! Head over to the Experimental GExperts page to download the new version. ### The Podcast at Delphi.org #### C++Builder XE6 for Android Wallpaper Remember the great Delphi for Android wallpaper? Well Dave has a new wallpaper to celebrate the new C++Builder for Android support. Thanks Dave for the great new wallpaper! ### Firebird News #### Firebird Language basic Reference ready This Year Paul Vinkenoog wrote on firebird docs list This is just to let you know that I’m making time available for the Language Reference this year. I’m working on the DML chapter now, and I’m somewhere in the middle of the SELECT statement. All the others are finished (the other DML statements, that is – not […] ### The Wiert Corner - irregular stream of stuff #### jpluimers Thanks Olivier SCHWAB for pointing me to this nice interview with Florian Klämpfl on SourceForge about April 2014 Project of the Month, Free Pascal | SourceForge Community Blog. Two things I didn’t know yet: • FreePascal started in the Turbo Pascal era (the first version was before Delphi 1.0 got released) as a 32-bit compiler project. • FreePascal 3.0 will support jvm output (like Oxygene does). Besides Florian, there are quite a few more people on the FreePascal team. I met most of them at last years PasCon: really nice guys. –jeroen Filed under: Delphi, Development, FreePascal, Object Pascal, Oxygene, Pascal, Software Development, Turbo Pascal Tagged: Free Pascal, FreePascal, sourceforge, Turbo Pascal era #### jpluimers #### jpluimers Once every while, one of your StackOverflow answers gets an edit suggestion that is really valuable. This case it was Edwin Yip who suggested to emphasize the difference between TStringBuilder and TStringList (adding characters versus lines). Too bad that freshly 10k user Makoto showed he hates bold emphasis, intentional property casing and post signatures by removing the added value (there is so much emphasis he could remove on other answers to warrant at least a day time job). I know that not all emphasis is welcomed at StackOverflow, but in this case I think it added real value. So I edited my own answer to add even more value: showing the idioms I use for building strings, and now it is time to quote it: (Note I removed all the nofollow in the hrefs that StackExchange automatically added) Basically, I use these idioms for building strings. The most important differences are: For complex build patterns, the first make my code a lot cleaner, the second only if I add lines and often includes many of Format calls. The third makes my code cleaner when format patterns are important. I use the last one only when the expression is very simple. A few more differences between the first two idioms: • TStringBuilder has many overloads for Append, and also has AppendLine (with only two overloads) if you want to add lines like TStringList.Add can • TStringBuilder reallocates the underlying buffer with an over capacity scheme, which means that with large buffers and frequent appends, it can be a lot faster than TStringList • To get the TStringBuilder content, you have to call the ToString method which can slow things down. So: speed is not the most important matter to choose your string appending idiom. Readable code is. –jeroen Filed under: Delphi, Delphi 1, Delphi 2, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 3, Delphi 4, Delphi 5, Delphi 6, Delphi 7, Delphi 8, Delphi x64, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Development, Software Development ## April 15, 2014 ### The Wiert Corner - irregular stream of stuff #### jpluimers Today I learned that each Google Group has RSS and ATOM feeds. That allows you to add them to Feedly (a great online RSS reader that won a lot of market share when Google Reader got ditched). This is how you do it (I’m using the Spring4D group as an example). 1. Go to the group page https://groups.google.com/forum/#!forum/spring4d 2. On the right side, click on “About” which brings you to https://groups.google.com/forum/#!aboutgroup/spring4d 3. Copy any of the RSS or ATOM links and add it to Feedly. –jeroen Filed under: Delphi, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Development, Google, GoogleGroups, Power User, Software Development, Spring4D ### Andy's Blog and Tools #### Starting with XE6 IDEFixPack will support only 4 IDE versions Before I can install XE6 I have to uninstall some older versions of RAD Studio because I will run out of disk space on my SSD when I install XE6. The newer the Delphi version is the more disk space it takes, mainly due to the variety of supported platforms (Win32 debug/Win32 release/Win64 debug/…) After installing XE5 I was left with 12 GB free disk space (all the installation image in ProgramData are moved to my HDD) and half a year later I’m down to 6 GB. I won’t be able to support my IDE plugins for some older RAD Studio versions the moment I uninstall them. Why not move the older IDEs to another disk and hard link them? I use the disk space issue as a way out of supporting all those versions with all their compilers dcc32.dll, dcc32.exe, dcc64.dll, dcc64.exe, dccaarm.exe. Do the math. I have to spend too much time doing the research for ever compiler. I have the feeling that the C/C++ compiler that is used to compile the Delphi compilers changes the CPU register allocation with every version, what breaks my “byte sequences” that are used to find the hook addresses. Furthermore I have to test every patch with every version and all compilers before I can release it. The next release IDEFixPack 5.5 won’t support XE6. XE6 support will be added in version 5.6 (unless there is a blocker bug in 5.5) and then only those RAD Studio version will be supported: • Supported: RAD Studio 2009 (I use it at work) • Unsupported: RAD Studio 2010 (extra research costs) • Supported: RAD Studio XE (I use it for all my personal projects) • Unsupported: RAD Studio XE2 (only used it for IDEFixPack and DDevEx, obsolete with XE3) • Unsupported: RAD Studio XE3 (only used it for IDEFixPack and DDevEx, obsolete with XE4) • Unsupported: RAD Studio XE4 (only used it for IDEFixPack and DDevEx, obsolete with XE5) • Supported: RAD Studio XE5 (supported until XE7 comes out) • Supported: RAD Studio XE6 (not yet) The exact same applies to the DDevExtensions plugin. Size still matters. ### Free Pascal Answers #### Free Pascal has been choosen as a project of the month (April) Free pascal has been choose as project of the month in sourceforge, and they interviewed it’s inventor Florian Klaempfl http://sourceforge.net/blog/april-2014-project-of-the-month-free-pascal/ ### Lazarus Team Anouncements #### FreePascal made it to project of the month on Sourceforge Thanks to all for the support of FreePascal on SourceForge: http://sourceforge.net/blog/april-2014-project-of-the-month-free-pascal ### Free Pascal Answers #### Auto Completion in Lazarus I have found these days a new auto-completion feature that already exist in Lazarus, it is variables auto-completion. Previously I was only using procedure header / method auto-completion, by typing method header inside class definition part then clicking Ctrl-Shift-C to get implementation part of the procedure/method. Now someone in Lazarus forum told us that auto completion is available for variables, for example, you can write for loop without defining loop variable first:  begin for i:= 1 to 10 do Writeln(i); end.  Then stop in i variable and click Ctrl-Shift-C and you will get an automatic definition with a proper type:  var i: Integer; begin for i:= 1 to 10 do Writeln(i); end.  Also you can use it with parameter values:  procedure getRandomNumber(var x: string); begin x:= Random(100); end; begin GetRandomNumber(MyNumber); Writeln(MyNumber); end.  Then stop at MyNumber and click Ctrl-Shift-C to get:  procedure getRandomNumber(var x: Integer); begin x:= Random(100); end; var MyNumber: Integer; begin GetRandomNumber(MyNumber); Writeln(MyNumber); end.  I found it very useful, so that I liked to share. Now you can stop defining variables before using it, just use the variable and auto-define it later. ### The Wiert Corner - irregular stream of stuff #### jpluimers Interesting: didn’t see this on the Embarcadero site yet, so the announcment of Welkom RAD Studio/Delphi/C++Builder XE6! by Barnsten B.V. – Google+ is a bit surprising. Edit: Given the XE6 webinar on the 16th (that is tomorrow!), it wasn’t that surprising, but in my memory those webinars usually were before the product became actually available. Barnsten was a tad bit faster than me picking up these two posts that had the official announcemts: So here are some of the Embarcadero.com links for XE6: Besides the ton of bug fixes that are many new compelling features. –jeroen ... Filed under: Delphi, Delphi XE6, Development, Software Development ### Firebird News #### pyfirebirdsql Version 0.9.3 is released with alternate crypt support for Windows pyfirebirdsql Version 0.9.3 is released with alternate crypt support for Windows and a few refactorings pyfirebirdsql is included now in FreeBSD ports collection #### ADO.NET provider for Firebird 4.1.5.0 is ready ADO.NET provider for Firebird 4.1.5.0 is ready ### Žarko Gajić #### TLiveIni – Custom Delphi INI Implementation Text and code by Ron Maupin. I had to build my enhanced INI class that replaces the database. My Modula-2 version used a doubly-linked list (section) of doubly-linked lists (key/value pairs) for the INI. Delphi’s generics made this much easier, and I now use the TDictionary, although it could be done with TStringList. I used the Delphi ability to have an array property (IniFile[Section,Value]) to simplify assignments and set it as the default property of the INI object. I also didn’t want to get lost in the weeds of having different properties or methods for different data types, so I built some record helpers in the application for different data types that simplify assignment (IntVar := IniFile[Section,Value].ToInt or IniFile[Section,Value] := BoolVar.ToStr). ### Prologue Let me start by saying that I am not a programmer, nor am I much of a writer; I am a Network Engineer at a huge company (in the Fortune 25 with over 250,000 employees at over 10,000 locations, and heavily regulated by multiple groups of the U.S. government). Way back at the beginning of the 1980s, I had an Apple III computer that had a whopping 512K of RAM and a monster 5 MB hard drive with Apple Pascal (based on the UCSD P-System). I used to play around with that. Until I did this project, I only had a conceptual knowledge of object-oriented programming, and no knowledge of Windows programming. I originally built a small MS-DOS pilot in Modula-2 to demonstrate to management that this could be done, hoping that they would take it and run with it, but, due to a large merger where we doubled in size, they just ignored it for several years. I eventually got Delphi 2010 (using XE5 right now) to see if I could figure it out on my own. Poking around in the help files, and using articles such as yours, I built a complete application which many of our Network Engineers use. They can enter minimal information, and, in just a few seconds, build complete configurations for all the routers, switches, etc. One requirement at my company is that when using a database, you must have a server, use a SQL database, and have a Database Administrator. Any application or database changes must go through an onerous change process with extended timelines. My goal was to build a small, self-contained tool that did not rely on any databases. This allows the application to be agile, and any data changes can be made in a very short time by simply editing a text file. This approach avoids the whole change process mess, and it allows me to make changes or corrections in seconds or minutes when a Network Engineer needs something or discovers a syntax error in a device configuration. I started by building an IP unit with two classes (Tv4 for IPv4, and Tv6 for IPv6) that do all the necessary IP math, and I enhanced them to return a lot of information about IP addresses (scope, class, RFC description, etc.). To test this, I built a small IP tool that really just shows the properties of the two IP objects; the fields (prefix, address, mask length, mask, inverse mask, subnet, etc.) are tied directly to the object properties, and the tool just refreshes them whenever a change to one field is made. The Network Engineers liked it, so I made it into a usable tool. ### The TLiveIni The secret sauce is the use of tokens as values. When returning a value, the INI will inspect the value to see if it contains a token. If the value contains a token, the INI will recursively look up, in itself, the value represented by the section and key in the token. My token format is <Section:Key>. Tokens may be nested so that part of the token may be a token, allowing a Section or Key used in the token to be, or contain, a value from a different value in the INI. The token has a few options that are explained below. One of the uses to which I put this is to enable/disable application user input fields based on values in the INI. I built five controls (TIniEdit, TIniComboBox, TIniCheckBox, TIniIPv4Edit, and TIniIPv6Edit) that each have a Section and Key property, and each know how to read and write to and from the INI. For my application, I added an Init method and Valid property to the controls. In the Init method for each control has Self.Enable := IniFile[Section,Key+' ENABLE'].ToBool representing a Boolean value in a different Key in the same section that is rooted on the Key name with ‘ ENABLE’ added to the end of the Key name. There are also control-dependent routines in the Init methods, for example, the TIniComboBox uses Self.CommaText := IniFile[Section,Key+' LIST'], and the list field value may be modified by the use of token(s) to look up different lists depending on the value(s) of other field(s). I validate the TIniEdit fields with a Key+’ REGEX’ value that usually gets looked up from a table based on a value from another field by using a token as the value of the REGEX field. The application starts with a Network Engineer selecting a design type from a TIniComboBox which has a static ENABLE field value of TRUE;. The other fields have ENABLE field values that may be tied to tables in the INI that ultimately return TRUE or FALSE, depending on the design type and/or other values in the INI. For example, a TIniIPv4Edit field’s ENABLE field value may have a token that points to the value of a TIniCheckBox field (the TIniCheckBox sets its value to TRUE or FALSE); After setting the value of a field, the application calls the Init method for all the fields. The fields will then enable/disable themselves based on the returned value from their respective ENABLE fields. My application takes this sort of behavior to an extreme with multiple, nested, and recursive lookups to return either TRUE or FALSE to each field as it performs its Init method. I was initially concerned about the number of lookups (often in the millions) and the time that would take, but this works very well, and, as a memory-based INI, it is quite fast. This design allows me to completely change the operation of the application without changing the application code by simply editing the INI file with a standard text editor. In effect, the INI is a finite-state machine, and the application uses it to set its state (which tabs are visible, which fields are enabled, what the default values, list vales, etc. are). Download the (simplified) INI source code (I removed a Build method, and supporting routines, that I use to merge the INI values with a plaintext configuration template, outputting a complete device configuration in a plaintext file, suitable for dumping onto a network device), and below is something I wrote to help other users understand the INI: The LiveINI file implementation is an enhanced version of a typical INI file. There is no defined standard for INI files, but there are some basic, accepted practices. A LiveINI file is a plaintext file that contains a few basic elements: • Optional Comments begin with a semicolon (“;”) and extend to the end of the line on which the semicolon is located. Comments are ignored. Since everything on a line from the semicolon to the end of the line is ignored, comments should be carefully placed, and semicolons cannot be used in any section names, key names, or values. • The INI file is broken into Sections. Each section begins with a section name enclosed by square brackets (“[” and “]”). Section names are case-insensitive, and leading and trailing whitespace is ignored. Any leading and trailing characters on a line containing a section are ignored. Duplicate section names merge the duplicate sections into a single section. Sections are not hierarchical and cannot be nested. • Each section contains zero or more Key/Value Pairs. A key/value pair consists of a key name and value separated by an equal (“=”). Key names are case-insensitive. Values may be empty. Leading and trailing whitespace on both key names and values is ignored. Sections with duplicate key names use only the last value defined for the key name. • Tokens may be used in a key/value pair as a representation of a value from a different key/value pair in the INI file. Tokens are enclosed in angle brackets (“<” and “>”) and consist of a section name and a key name separated by a colon (“:”). Within the token, leading and trailing whitespace on section and key names is ignored. Tokens may be nested, i.e., section and/or key names within a token may be, in whole or in part, tokens that represent a value from a different section/key. When an application requests a value from the INI, it specifies the section and key names. The INI looks up the value and returns it to the application. Given an unknown section/key combination, LiveINI will return a text error as the value. Error values returned for internal application use are converted to zero for an integer value or “FALSE” for a Boolean value. “Standard” INI values are static and only change when the application specifically changes the value, or the value is changed by manually editing the INI file. Tokens allow LiveINI values to be dynamic and change based on other values in the LiveINI. In effect, LiveINI is a finite-state machine. When an application using LiveINI requests a value that contains one or more tokens, the tokens are evaluated, innermost token outward, replacing the token in the result to be returned with the value that the token represents. The resulting value is returned to the application as if the value was statically defined. The token evaluation DOES NOT replace the token or change the original LiveINI in any way; only the returned value is modified. The process is transparent to the application; the application reads values the same way as using a “standard” INI. The Network Template Tool uses LiveINI to simplify application design and reduce or eliminate application changes when external factors change, e.g., adding a new device model in an existing role does not require changes to the application. Application changes are only required for changes to the user interface, e.g., new tabs or data-entry fields. ### “Standard” INI File Example In this example, either the user must supply the region and the three DNS server addresses, or the application must have the logic and knowledge to supply the three DNS server addresses for the region. This requires the user to maintain correct information, increasing the chances of a typographical error or incorrect entry. Building the logic and knowledge into the application requires an application change in the event of an address change to one or more of the DNS servers. [SITE] REGION= DNS SERVER 1= DNS SERVER 2= DNS SERVER 3=  ### LiveINI File Example In this example the user only needs to supply the region. The DNS server addresses will be dynamically determined based on the region. The user is not burdened to find which DNS server addresses to use for the region. Using a drop-down list from which the user selects the region leaves no chance for the user to enter a typographical error. In the event of an address change to one or more DNS servers, the INI file is edited with a plaintext editor to change the DNS server addresses to the new addresses, and the application uses the new DNS server addresses when the application INI file is next loaded. The application code is not modified based on the external factor, and a user, unaware of the change to the DNS server addresses, will not enter an incorrect address. Also, the entire logic of determining DNS servers may be modified or replaced without modifying the application in any way. [SITE] REGION= DNS SERVER 1=<DNS SERVER TABLE:<SITE:REGION> 1>> DNS SERVER 2=<DNS SERVER TABLE:<SITE:REGION> 2>> DNS SERVER 3=<DNS SERVER TABLE:<SITE:REGION> 3>> [DNS SERVER TABLE] CENTRAL 1=10.1.1.1 CENTRAL 2=10.1.1.2 CENTRAL 3=10.1.1.3 EAST 1=10.1.2.1 EAST 2=10.1.2.2 EAST 3=10.1.2.3 WEST 1=10.1.3.1 WEST 2=10.1.3.2 WEST 3=10.1.3.3  LiveINI Step-By-Step Using the LiveINI example, the user supplies “East” as the site’s region, LiveINI will: 1. Read the value “<DNS SERVER TABLE:<SITE:REGION> 1>>” from the “SITE” section, “DNS SERVER 1″ key. 2. Discover the value contains the token “<SITE:REGION>”. 3. Using the “<SITE:REGION>” token, read the value “East” from the “SITE” section, “REGION” key. 4. Replace the “<SITE:REGION>” token with “East”, changing the value to “<DNS SERVER TABLE:East 1>”. 5. Discover the value contains the token “<DNS SERVER TABLE:East 1>”. 6. Using the “<DNS SERVER TABLE:East 1>” token, read the value “10.1.2.1″ from the “DNS SERVER TABLE” section, “EAST 1″ key. 7. Replace the “<DNS SERVER TABLE:East 1>” token with “10.1.2.1″. 8. Return the value “10.1.2.1″ to the application. The process may be less (static values or non-nested tokens) or more (tokens refer to values that also contain tokens) complex. Retrieved values are not stored or cached; the process is repeated each time the application requests a value, insuring that any returned value is current relative to changes made to any other value. LiveINI executes the process millions of times in a matter of seconds while building equipment requests and device configurations. For example, each of the possible dozens, hundreds, or thousands of devices in any site uses the same DNS server addresses, and the process is repeated for each device configuration built. ### LiveINI Process Flow ### LiveINI Interface section type TLiveIni = class(TObject) private type TSection = TDictionary<string, string>; TIni = TDictionary<string, TSection>; var FIni: TIni; FChanged: Boolean; function GetValue(const Section, Key: string): string; procedure SetValue(const Section, Key, Value: string); function ValueToStr(const Section, Line: string): string; public constructor Create(); procedure Load(const InFile: string); procedure Save(const OutFile: string); destructor Destroy(); override; property Changed: Boolean read FChanged; property Values[const Section, Key: string]: string read GetValue write SetValue; default; end;  Download TLiveINI.pas ### Token Options When the section in a token is the section of the token’s location, a token may use an asterisk (“*”) instead of the section name. In the previous LiveINI example, the “” tokens may be written as “*:REGION>” since the tokens are in the “SITE” section and “SITE” is the section in the token. In certain cases, values must be returned in a particular case (upper or lower). Tokens may use a character to specify the case of the returned value. Plus (“+”) will convert the value to upper case, and minus (“-”) will convert the value to lower case. The character must precede the section name in the token. For example, if the value for the “SITE” section, “REGION” key value is “East”, using the “+SITE:REGION>” token will return the value “EAST”, and using the “-SITE:REGION>” token will return the value “east”. Both token options may be used in the same token. Since the asterisk represents the section name, and the case-specification character must precede the section name, the case-specification character must precede the asterisk in a token. ### Epilogue I know that there are probably better ways to do certain things, but, as a novice, I did what felt comfortable to me. I’m still finding techniques that I like, but I really haven’t changed the INI code (it is still basically what I originally built for the MS-DOS demonstration) because it does work as it is, and I hesitate to break it. Even though I wrote this thing, it took a long time before I had a good understanding of its true power and how to use it. Step by step, I moved virtually all the program logic out of the application to the INI file. The application is now just the user interface to the INI. Even with the code to build the configurations from template text files (I had to build in some conditional processing using “IF THEN ELSE” tokens that use Boolean “AND OR NOT” alongside the INI tokens in the template files) the whole INI unit is only about 350 lines. The IP unit is about five times the size, although the IPv6 part is ¾ of that, and I could reduce it if I didn’t need the code for testing the various IP ranges, but I needed to provide that so that the IP controls can have properties to require or exclude IP range sets for validation, for example: require v4PrivateUse and v4ClassA, or exclude v4Network0 and v4LocalHost . Comments are welcome. ## April 14, 2014 ### TPersistent #### Using CodeSite to Spot Peformance Optimization Opportunities I have been using CodeSite for a long time now (since v2 days), but I am still continually impressed by the product and it’s capabilities. If you want to do something with your log data, chances are CodeSite has you covered, you just need to figure out how it is implemented. Today, I wanted to see if I could filter on the TimeStamp column shown as a TimeDifference in order to only see log entries where the difference between one line and the next was over a second. I figured this would show me potential opportunities for code optimization. Initially I thought I would have to write some sort of log mining tool since there didn’t seem to be any capability to filter the log in this manner. Developers often immediately jump to “I can solve this by writing some code”, but instead I asked my trusted friend Google. Google showed me some release notes from a few versions back that documented a new feature in 4.62. I hadn’t used this version so I had no idea the following was possible: 5. The CodeSite Viewers now support Time Difference Navigation. Specifically, a new mode has been added to the Message Navigation buttons (First, Previous, Next, and Last) to allow navigating to a message where the amount of time that has passed since the previously logged message exceeds some threshold. This new navigation mode is extremely helpful is locating time gaps in a message log. To use Time Difference Navigation, simply click on the "Browse for ..." drop-down button located between the Previous and Next navigation buttons. At the end of the popup menu, a new Time Difference menu item is available. Clicking the Time Difference menu item results in a dialog box asking for a threshold value (in milliseconds). Clicking OK closes the dialog box and puts the Viewer into Time Difference Navigation mode. You can then use the First, Previous, Next, and Last navigation buttons to locate messages where the Time Difference of that message exceeds the specified threshold. To toggle back into normal Message Navigation mode, simply select the Time Difference menu item again from the drop down list of message types. The previous Message Navigation settings will be restored. This is a sweet suite feature….thanks Ray! ### Firebird News #### FirebirdSQL driver for Go (golang) with support for Firebird 3.0 Auth protocol (SRP) Hajime Nakagami created a Firebird SQL driver for Go with support for Firebird 3.0 Auth protocol (SRP) in pure golang ## April 13, 2014 ### twm’s blog #### Windows advanced Batch programming call :bla%var% While looking for the equivalent of a switch / case statement for Windows batch files, I came across this answer on Stackoverflow. Basically, what it does is using environment variable substitution for simulating: case %var% of 1: rem do something 2: rem do something else 3: rem do something completely different end  The code looks like this: call :SomePrefix%var% goto aftercase :SomePrefix1 rem do something goto :eof :SomePrefix2 rem do something else goto :eof :SomePrefix3 rem do something completely different goto :eof :aftercase  If “do something” is some complex code that’s pretty nifty and possibly a bit faster than the naive approach: if "%var%"=="1" rem do something if "%var%"=="2" rem do something else if "%var%"=="3" rem do something completely different  But still: The readability suffers quite a lot. And if speed was an issue, why would you use a batch file in the first place? Anyway, I had a use case for it so I used it. ## April 12, 2014 ### twm’s blog #### Experimental GExperts Version 1.37-2014-04-12 released The latest version is the first version that supports Delphi XE5 and also officially XE4. There is nothing really new about the formatter code. But the new release can be installed even if you don’t have the official GExperts installer (yet). This is an extract from the readme file: ** Installing without an official installer ** With two Delphi Releases per year and Erik Berry being busy otherwise, new GExperts releases have been lagging behind. So in case there is no official GExperts installer yet, these are the steps to install the experimental version by hand: 1. Create a suitable GExperts directory. It doesn't have to be a subdirectory of %ProgramFiles% but may be anywhere, even on a network share if you are sure this share will always be available. 2. Extract all files from the ZIP somewhere 3. Copy all files from the extracted directory to the GExperts directory. (Do *NOT* copy the subdirectories!) 4. Copy the appropriate GExperts DLL from one of the subdirectories EditorExpert or RegularExpert to the GExperts directory. 5. Copy the files from the subdirectory FromRegularRelease to the GExperts directory. 6. Copy the appropriate cmd from the install subdirectory. To the GExperts directory. 7. Make sure that the Delphi IDE is not running 8. Run the cmd file. It will register the GExperts dll with the Delphi IDE. 9. Start Delphi and check that the new GExperts DLL has been loaded by opening the GExperts About dialog. In theory it is possible to install GExperts for all Delphi versions into the same GExperts directory. But be warned: This has not been tested thoroughly.  Head over to the Experimental GExperts page to download the new version. ## April 11, 2014 ### The Podcast at Delphi.org #### What You Need To Know #1 Do you know the song “Video Killed The Radio Star“? It seems like today it is “Twitter & G+ killed the blog post.” I thought I would summarize some of the recent news I’ve posted elsewhere. • bit Time Lab has a video showing off their multi-touch bluetooth app that controls a very small mini-cooper. They developed the libraries for multi-touch support and bluetooth they used with Appmethod (Object Pascal). Very cool! • Project Indy has an OpenSSL update for the Heartbleed vulnerability. • InterBase uses OpenSSL, but was never vulnerable to Heartbleed. • I’ll be at Delphi Developer Days in Chicago and D.C. and we will have free evening events there too. These are great events full of fabulous content (I’ve attended in the past). I highly recommend you check them out. I’ll be showing Delphi working with Google Glass, Brain-Computer Interface, FireDAC, REST, and anything else I can squeeze in. • I’m also traveling to India and South Korea this month. • I worked with Sarina on this Tutorial for accessing Parse.com from Appmethod Object Pascal with the REST components. Great technology. • Eric compiled a partial list of over 100 Delphi apps in the Play Store. • Eric Bonilha was featured in the Brazilian News for his work on a DigiFort app for Google Glass that stream live video to and from Google Glass. It is in Portuguese, but you can see some live demos of the app starting at just after 7 minutes in. All the software used to stream video and control cameras in that segment is written in Delphi by Eric and his team. • Curious about what is coming in XE6? There is a RAD Studio XE6 Sneak Peak event taking place April 16th. It looks really exciting! • I still get people asking about the new upgrade pricing. Check out the new License Recharge Program – if you own the latest version of Delphi, RAD Studio, or C++Builder then you qualify to save a lot of money when a new product is released. • David Intersimone and myself are running regular Google Hangout On-Air events. These are informal technical events we share some of the things we’ve been working on recently. Make sure you join the Embarcadero Technologies G+ community so you can be involved in the next one. The first two were experiments, we plan to promote the future ones better (although they will probably remain experimental and informal). ### Firebird News #### Redsoft Database (based on Firebird) used in GosLinux systems for FSSP Management of Information Technology of the Federal Bailiff Service (FSSP) Russia announced a new phase of implementation of the free software and “import information technology” – the appearance of their own GNU / Linux distribution called GosLinux. GosLinux distribution is based on CentOS 6.4 and created by “Soft Red” in 2013 after a win of […] ## April 10, 2014 ### The Wiert Corner - irregular stream of stuff ### Firebird News #### FB TraceManager V3.5.1 has been released Upscene Productions is excited to officially release FB TraceManager V3.5.1! This release adds support for pre-defined purge options of stored trace data. Minor issues have been fixed as well. More information is available here: http://www.upscene.com/displaynews.php?item=20140407 Or also directly in the V3.5 what’s new section of the online product documentation: http://www.upscene.com/documentation/fbtm3/index.html?whats_new_in_v3_5.htm More information on the product […] ### The Wiert Corner - irregular stream of stuff #### jpluimers I just discovered that almost 2 weeks ago, the FastMM code repository added support for these defines in Mac OS X in Commit [r67].: • FullDebugMode • LogErrorsToFile • LogMemoryLeakDetailToFile This is great news! Note: this is not a full FastMM release, but since the original change by Sebastian Zierer has been done about half a year ago, the code is pretty stable. –jeroen Filed under: Delphi, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, FastMM, Software Development ### twm’s blog #### Delphi Console Applications Delphi allows to write Console applications as well as GUI applications, while the latter is the default. But “Console” application is not clearly defined in the documentation as I found out only today (and I have been programming in Delphi for about 20 years). There is the {$AppType Console} compiler directive which corresponds to the /cc compiler switch and which has no corresponding setting in the compiler options dialog. The File -> New -> Console Application menu generates a project containing this directive. As documented in the Delphi online help this compiler directive opens the INPUT and OUTPUT files which are associated with the stdin and stdout handles. In addition, at least since Delphi 2007 it also opens the ErrOutput file which is associated with the stderr handle. (The latter doesn’t seem to be documented.) Also, the IsConsole function returns true for programs compiled with this directive. The conditional symbol CONSOLE is not defined for these programs unless you also set the linker option "Generate console application". (Which is odd. Why should a linker option have any effect on a conditional symbol for the compiler? But that’s how it is.)

Then, there is the linker option "Generate console application". This option is not automatically set if you use the File -> New -> Console application menu. If you set it, the conditional symbol CONSOLE is defined. You can also set this option for a GUI program. In this case, CONSOLE also defined and in addition to your program’s form, you will also get a console window. Also IsConsole returns true and the files INPUT, OUTPUT and ErrOutput are opened.

So there are four possible combinations:

1. AppType CONSOLE + "Generate console application" is set -> CONSOLE is defined and IsConsole returns true
2. AppType GUI + "Generate console application" is set -> CONSOLE is defined and IsConsole returns true
3. AppType CONSOLE + "Generate console application" is not set -> CONSOLE is not defined and IsConsole returns true
4. AppType GUI + "Generate console application" is not set -> CONSOLE is not defined and IsConsole returns false

I could not find any difference between the cases 1 and 2. Maybe some additional startup code is generated in one of these cases? But the executable size doesn’t seem to change either. So, what is the actual point of the compiler directive?

So the important lesson here is:

The files INPUT, OUTPUT and ErrOutput are opened automatically if IsConsole returns true, regardless of the conditional symbol CONSOLE. I don’t really see the use of the latter.

For the curious here is the program code I used to find out the above:

program ConsoleTest;

{.$APPTYPE CONSOLE} uses Windows; begin {$IFDEF CONSOLE}
WriteLn('CONSOLE is defined');
{$ELSE} if IsConsole then WriteLn('CONSOLE is not defined') else Windows.MessageBox(0, 'CONSOLE is not defined', nil, MB_OK or MB_ICONINFORMATION); {$ENDIF}
if IsConsole then begin
WriteLn('IsConsole returns true');
WriteLn('Press Enter');
end else begin
Windows.MessageBox(0, 'IsConsole returns false', nil, MB_OK or MB_ICONINFORMATION);
end;

end.


#### Creating DLLs with Delphi

I just stumbled upon an article on The Delphi Wiki that I wrote years ago:

Creating DLLs

It’s still mostly valid. There have been some improvements in newer Delphi versions, in particular since Delphi 2006 you no longer need the borlndmm.dll if you want to use ShareMem. (But still: Using ShareMem means that your DLL can only be used by Delphi programs, so don’t do that, if you can avoid it.)

That’s not the only article I wrote for that Wiki. It’s interesting to see how much time I apparently had on my hands back then. Sometimes I wish those “good times” came back.

## April 09, 2014

### Delphi Code Monkey

#### XP Support ended Yesterday : What changes?

For many people nothing changes, the day Microsoft says they won't patch XP anymore.  However, if some major virus spreads like wildfire throughout the remaining XP system population on the internet, you can be Microsoft will release a "free" out of band patch for that vulnerability. It would be impossible for them not to.

For some people, and for some industries, XP really is dead.  My employer works in the healthcare market.  I believe that to operate a Windows XP machine in a healthcare setting, whether in a hospital, or a private clinic, would be tantamount to malpractice.  In the USA, and in Canada, there are laws about the steps you need to take to protect the privacy of your information.  You can not patch XP yourself, and you have no promises from Microsoft to ever patch any vulnerabilities in XP.  So, use of XP in a professional setting, especially in healthcare, would be, in my view, irresponsible at the least, and perhaps a violation of the law, in your country, if your laws protect patient privacy and hold those who fail to act responsibly to protect patients.  I am not saying anything bad WILL happen, but that something bad COULD happen, and it would be irresponsible for you to pretend that it couldn't.

XP really was a great operating system.  It was the first version of Windows that I really grew to like. The funny thing is that I can't stand operating on it any more.  I find it incredibly quirky and broken. I never liked Vista, and I loved Windows 7.  I know some people will think I'm crazy but I actually LIKE Windows 8.1 now. There are still some stupid things about it. The start "screen" and "metro" are stupid, and I hate them, but aside from the glaring stupidity of the metro crap,  Windows 8.1 is a pretty decent operating system.  I use it all day every day at work, and I like it.  I like client Hyper-V.  I like the responsiveness and overall speed of the system. When 8.1 Update 1 brings back a reasonable facsimile of the Windows 7 era start menu (non-full screen), I think many people will at last be willing to switch up from Windows 7.

As a Delphi developer,  I'm not sad to see XP go away.  It was a fantastic piece of technology in 2002, but like the machines that it ran in 2002, it belongs in a museum, not as a primary operating system on your home or work computer.

XP introduced the desktop and home user to a fully Unicode compliant API, but true global Unicode features and functionality required installing a separate language pack for far-east language support.  XP introduced a fairly robust protected mode kernel, but ran your video drivers in ring zero, meaning that video card bugs would blue screen your system.   XP was actually really crappy, by comparison to windows 7, and in my opinion, windows 8.1 is just a tuned up kernel revision on windows 7, with a rather shabby new start menu, and a lame-duck "app store".   But below that lame layer, beats the heart of a pretty good operating system.   I find building apps in a modern Delphi version (XE5) on Windows 8.1 is pretty nice.  I like making my apps look like they belong on a modern computer in 2014.  Here are a few things I think need to die along with Windows XP:

- 16 x 16 toolbar icons.  This was a sensible choice when your laptop screen was 640x480. No more.

- Flat gray everywhere.  Give the clBtnFace look a rest, okay?

- Those stock bitmaps that shipped with Delphi 3.  Invest in some real art and icons, okay?

I suggest you celebrate the death of XP by moving your apps beyond that ancient classic windows look and feel, and into the 21st century.  XP is dead, long live Windows.

How are you all feeling about XP? Nostalgic? Still in love? Glad to see it go?  Planning to go down with the ship?

### The Wiert Corner - irregular stream of stuff

#### jpluimers

Just bumped into this Big Ball of Mud article by (another) Jeroen on software (this Jeroen is Jeroen De Dauw).

It is a very nice article with annotations on the (very old, but still very prevalent Big Ball of Mud design pattern of which a lot of software projects suffer).

I didn’t know about the design pattern yet, but have seen it in so many places, and even helped quite a few of them to become less big, and contain less mud. If the article and paper are tool long, you can read a WikiPedia BBM abstract.

I’m glad that the .NET/Delphi based suite of projects I landed on recently – though containing quite a bit of legacy – is different. Still a lot of improvements to be made, but it is very manageable.

–jeroen

Filed under: .NET, Delphi, Development, Software Development Tagged: jeroen

#### jpluimers

In other words: any language that merges null behaviour in the underlying storage will have a problem somwehere.

So if you want to have true nullable types, your null flag should be stored outside the underlying storage.

The .NET framework 2 and up, most database management systems and many other environment support that.

But most languages don’t support it for pointer types. So there will be portions of address spaces either inaccessible, or only accessible when skipping the null pointer checks.

Note that the thread above contains some very interesting bits, for instance this one:

Matt 28 Mar 2013 5:58 PM #

@MarkY “Dereferencing null is undefined?  Cool!  I thought it was guaranteed to crash, just like a false assertion or something.  So crashing is the OS guarantee, not the language guarantee apparently.”

Nope. It’s not an OS guarantee either. The OS won’t ever normally allocate memory at address zero, but there’s nothing to stop you telling it to. Try doing “VirtualAlloc(1, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)” on your pre-Windows8 machine.

In fact, this is the reason why null-dereferences in kernel mode are often exploitable as elevation of privilege attacks. The null-page is mappable and within the user-addressable region of memory, so if the kernel dereferences a null pointer, it reads attacker controllable data.

And btw, this is the reason why on Linux and Windows8+ you can’t map the null-page.

–jeroen

Filed under: .NET, .NET 2.0, .NET 3.0, .NET 3.5, .NET 4.0, .NET 4.5, Borland C++, Borland Pascal, C, C#, C# 2.0, C# 3.0, C# 4.0, C# 5.0, C++, C++ Builder, Database Development, Delphi, Development, Pascal, Quick Pascal, Software Development, Turbo Pascal, VB.NET, VB.NET 10.0, VB.NET 11.0, VB.NET 8.0, VB.NET 9.0

## April 08, 2014

### The Wiert Corner - irregular stream of stuff

#### jpluimers

Eric Grange (author of DWS) asked for some interface magic: delphi – Obtaining a sub-interface from an interface – Stack Overflow.

–jeroen

Filed under: Delphi, Development, Software Development

### Firebird News

#### How to patch, build and debug PHP extension : PDO Firebird

Vjacheslav V. Borisov wrote a tutorial on how to build and debug PDO Firebird driver : I noticed that there is too many bugs open and too few developers who can do the work. And even this list is almost dead. Don’t know what is the cause of that, but may be it is just […]

### The Wiert Corner - irregular stream of stuff

#### jpluimers

Recently I pushed two sets ofchanges for Spring4D with packages and test projects that support Appmethod. The test projects are configured to use Firemonkey (conditional define FMX) as that is what Appmethod is centered around.

This weekend I filed Appmethod issue AP-64 that prevents Spring4D and other open source projects to automatically build the underlying projects. Since the new Quality site does not (yet?) make reports on public reports visible to the public, the full report is at the end of this post.

The issue comes down to that Embarcadero has intentionally made the command-line compilers dysfunctional. They are there, but – as you see when running this small batch file – they all will display “This version of the product does not support command line compiling.“. It makes it impossible for open source projects to just distribute the sources, and ship a small build tool that builds and installs the compiled binaries into the available products. So this issue doesn’t only affect Spring4D. The large JCL open source project also requires the command-line compilers.

In the past, only some free or trial products came without the command-line compilers, and I personally am anxious why the command-line compilers were crippled. On the other hand – even though the compiler DLLs list themselves as version 19.50, the functionality in Appmethod basically is the same as in RAD Studio XE5.

The Spring4D team regrets the lack of command-line compiler support in Appmethod. We really hope this restriction is removed soon, preferably in this version, but – since the docteam is prepping for XE6, Delphi XE6 is around the corner (the first XE6 webinar is in slightly more than a week from now) and Appmethod is based on the most recent Delphi version – in a future version.

We could go the long path of encapsulating the DLL versions of the compilers, but those do not have a public API. Reverse engineering that would cost a lot of effort, which we’d rather put into enhancing Spring4D.

If Another thing we could do – if we’d get the compilers, or Embarcadero would build the Spring4D sources with them – is provide precompiled packages for every Appmethod version. We’d rather not do that either because of the exact same reason: extra effort that we’d rather spend on other Spring4D things.

So for now, the Spring4D team keeps the Appmethod support as is. If there are people interested, they can manually compile and install the packages and test projects from within the IDE.

–jeroen

Full bug report:

Type: Bug Status: Open Priority: Major Resolution: Unresolved Affects Version/s: 1.13 Fix Version/s: None Component/s: None Labels:None Build No: 19.5.15286.8921 Platform: All Language Version: English Edition: Business

Steps:
1. Run this batch file:
for /f “usebackq tokens=2* delims= ” %%c in (reg query HKEY_CURRENT_USER\Software\Embarcadero\BDS\13.0 /v RootDir) do (
dir “%%d\bin\dcc*.exe”
for %%c in (“%%d\bin\dcc*.exe”) do %%c
)
2. Observe the results:
C:\Users\Developer\Versioned>(
dir “C:\Program Files (x86)\Embarcadero\Appmethod\13.0\\bin\dcc*.exe”
for %c in (“C:\Program Files (x86)\Embarcadero\Appmethod\13.0\\bin\dcc*.exe”) do REG_SZ
)
Volume in drive C has no label.
Volume Serial Number is B8C8-1B6A
Directory of C:\Program Files (x86)\Embarcadero\Appmethod\13.0\bin
10/25/2013 07:16 PM 23,040 dcc32.exe
10/25/2013 07:18 PM 23,040 dcc64.exe
10/25/2013 07:16 PM 23,040 dccaarm.exe
10/25/2013 07:16 PM 23,040 dccios32.exe
10/25/2013 07:16 PM 23,040 dcciosarm.exe
10/25/2013 07:16 PM 23,040 dccosx.exe
6 File(s) 138,240 bytes
0 Dir(s) 14,182,273,024 bytes free
This version of the product does not support command line compiling.
This version of the product does not support command line compiling.
This version of the product does not support command line compiling.
This version of the product does not support command line compiling.
This version of the product does not support command line compiling.
This version of the product does not support command line compiling.

InternalID: RS-49654

Description
Appmethod broke the DCC*.exe command-line compilers on purpose (they are 22k stubs .
Many open source libraries (including JCL and Spring4D) depend on the command-line compilers for their installation.
dcc32.exe
dcc64.exe
dccaarm.exe
dccios32.exe
dcciosarm.exe
dccosx.exe
dcc*.exe are all 23,040 bytes long.
they all display this when running:
This version of the product does not support command line compiling.

Filed under: Appmethod, Delphi, Development, Software Development

### twm’s blog

#### Updating Windows Defender signatures (only)

One of my problems with Windows 8 is that Microsoft recommends to keep Automatic Updates on the setting “Install updates automatically” while I prefer the setting “Download updates but let me choose whether to install them”. (Actually I don’t really want to choose whether to install them but rather when to install them.)

It’s possible to change this setting, but Windows Defender then won’t download its signature updates because that’s bound to the same mechanism as Windows Update. So every day I get a message on my boot screen, that there are important updates available and that I should start Windows Update to install them. This is annoying like hell.

Thankfully with a little bit of googling I found a solution. There is a tool that that checks for signature updates (an supposedly downloads them, I couldn’t try it yet because I just updated them using Windows update). It must be called like this:

"C:\Program Files\Windows Defender\MpCmdRun.exe" -SignatureUpdate -MMPC


So adding this command to e.g. task scheduler should solve yet another Windows 8 annoyance for good.

### The Wiert Corner - irregular stream of stuff

#### jpluimers

The fixed OpenSSL 1.01g is already available in source and for many platforms.

When do they become available anyone using OpenSSL 1.01 or 1.02 must deploy the patched version as fast as possible.

You also need to have all your certificates re-issued.

During the vulnerability period, your private keys may have been exposed, and there is no way to tell that they were not exposed.

Note the official binaries for Win32 1.01g are not available for yet (expect them soon), but the Indy team made Win32 and Win64 versions available.

Note that OpenSuSE did a backport of the patch to 1.01e for 12.3 and 13.1. Older openSuSE versions do not have updates for this issue, but you want to upgrade anything lower than 0.98 as they contain serious other vulnerabilities.

–jeroen

via

Filed under: Delphi, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 6, Delphi 7, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, OpenSSL, Power User, Security, Software Development

## April 06, 2014

### The Wiert Corner - irregular stream of stuff

#### jpluimers

Last week, David M Williams posted a nice question on how can I embed an mp4 video into a Firemonkey app.

The resolution – using the Deployment Manager  and TPath – was remarkably simple based on my suggestion:

That depends on your platform. Windows can embed and extract resources in your EXE. On other platforms that is either hard or impossible. I’d just deploy the mp4 with your app. TPath has some really nice methods to get you directories (Home, Documents, etc) in a platform neutral way, and to combine directories and filenames to form a full path name.

he went along and this was his solution:

Under Project/Deployment I add the MP4 file, then set the MediaPlayer filename property using TPath.

–jeroen

Filed under: Delphi, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, Software Development Tagged: David M Williams, Deployment Manager, mp4

### DelphiTools.info

#### New DWS WebServer release

A new pre-compiled release v2014.04.04 for the DWS WebServer is available from the downloads page, it is compiled from the latest source. Besides the usual demo sites, it has been used to serve a crypto-currency block-chain explorer website that peaked at 1600 page views / hour after some successful tweets went viral. For details changes,…

### Castle Game Engine news

#### Hi :) Many news from last month's developments: * Fog works on OpenGLES (Android, iOS) now. This includes...

Hi :) Many news from last month's developments:

* Fog works on OpenGLES (Android, iOS) now. This includes simple linear/exponential fog using Fog node in VRML/X3D, and FogCoordinate, and volumetric fog (see http://castle-engine.sourceforge.net/x3d_extensions.php#section_ext_fog_volumetric) .

* We have created an extensive documentation about developing for Android https://sourceforge.net/p/castle-engine/wiki/Android%20development/ and iOS https://sourceforge.net/p/castle-engine/wiki/iOS%20Development/ . They contain detailed instructions how to install everything necessary, how to compile, where are the examples... The Android docs contain also a section about "Debugging running application (on an Android device) using ndk-gdb" --- yes, it works flawlessly :) Finally, there's also a document summarizing currently missing features from OpenGLES renderer https://sourceforge.net/p/castle-engine/wiki/OpengLES,%20Android%20and%20iOS%20TODOs/ .

* Many improvements to the Android done, in particular everything is now ready for the fact that the we may loose OpenGL context at any time (as it can happen on Android). In new "Darkest Before the Dawn" http://castle-engine.sourceforge.net/darkest_before_dawn.php version you will be able to switch from/to the application at any time, even during the loading progress (so we can loose OpenGL context during preparing of OpenGL resources; they'll be prepared later on-demand in this case), and things will just work.

* Saving / restoring of the activity state is now done. We simply save/load the XML data from CastleConfig, so you just use Config.GetValue, Config.SetValue, Config.SetDeleteValue to save your state. Just like on standalone, but on Android we just load/save config automatically. See https://sourceforge.net/p/castle-engine/wiki/Android%20development/#saving-state .

* Multi-touch is implemented :)

Note: it does break compatibility. I initially implemented multi-touch keeping backwards compatibility, but then I decided to fix the issue with mouse/touch Y coordinate (99% of the engine considers "0 is bottom", mouse Y was considering "0 is top"; this inconsistency is now fixed, with mouse Y=0 meaning "bottom" everywhere). This means that compatibility break is unavoidable, otherwise we would have a real confusion which is which.

1. There is an example program in castle_game_engine/examples/android/drawing_toy/ where you can draw on the screen, with each finger index drawing with a different color. Try drawing with 2-5 fingers simultaneously :) It's pretty fun, and allows you to test the multi-touch support on Android :)

2. TCastleTouchControl now uses multi-touch. Cameras drag, and capture mechanism in TCastleUIContainer, were also updated to fully work with multi-touch.

3. API:
3.1. Press/Release:

TInputPressRelease structure (which is a parameter for OnPress/OnRelease events) has a new field FingerIndex. On devices with a single normal mouse (no touch), like on desktops, FingerIndex is always 0.

Notes:
- If hardware configurations that have both mouse and touch devices, or that have many mouse devices, will ever become popular, we can support them. Each mouse just reserves one FindexIndex value. (You can e.g. connect usb mouse to Android, so it actually already works on Android, although in that case Android hides it from us completely, mouse connected to Android usb simply simulates touch.)

- TInputPressRelease.MouseButton field is independent from TInputPressRelease.FingerIndex. For a single mouse, FingerIndex is always 0. For a touch, MouseButton is always mbLeft. We do not try to "merge" these 2 fields into one, as it would not be useful --- UIs do not generally react to pressing a second finger the same as pressing a right mouse button.

Internally (in castlewindow_library.inc) the DoMouseDown/Up and LibraryMouseDown/Up get now extra FingerIndex parameter.

3.2. Motions:

TUIControl has new method Motion, and TCastleWindow/TCastleControl have new callback OnMotion. They get a parameter TInputMotion, that contains new and old position, a FingerIndex, and Pressed describing which buttons are pressed (for mouse, this corresponds to actual buttons pressed, may be [] if none; for touch device, it is always [mbLeft]; this way you can just detect any dragging by Pressed <> []). Using a structure TInputMotion, and a generic name, will hopefully make it forward-compatible, like current OnPress and OnRelease.

The old MouseMove/OnMouseMove symbols are now removed. Since we change the API anyway (Y goes up, position is floats...), keeping compatibility for them was too much hassle.

3.3. Current state:

TCastleWindow and TCastleControl have a list of Touches, listing current state of the touches. It's length varies (can be zero if not touching). Right now, the state of touch is just it's position in 2D and FingerIndex, but we may extend it in the future. See comments at CastleUIControls.TTouch type.

You can use MousePosition to get position of touch with FingerIndex = 0, if any (will return zeros if no such touch). Consistently, the state of mbLeft in MousePressed says whether the touch with FingerIndex = 0 currently exists. The effect is that code that looks only at MousePosition/MousePressed will somewhat work with touch devices, treating them as a device with a mouse with a single (mbLeft) button (that mysteriously doesn't report move events when button is not pressed).

Oh, and the touch positions are floats, not ints, to support devices with sub-pixel precision.

Oh, and the touch position has Y going from bottom to top, just like our 2D drawing routines. No more the need to invert MouseY.﻿

## April 05, 2014

### The Wiert Corner - irregular stream of stuff

#### jpluimers

A while ago, I had to disable a couple of warnings from legacy code so I could first perform the Unicode conversion, then make time to eliminate the actual warning cause.

This post was much helpful here:

He lists all the W#### and X#### warnings he could find in Delphi XE2 (XE3, XE4 and XE5 more or less have the same), including the mapping to the equivalent directive IDs used inside these blocks:

{$WARN SYMBOL_DEPRECATED ON} {$WARN SYMBOL_DEPRECATED OFF} {$WARN SYMBOL_DEPRECATED DEFAULT} {$WARN SYMBOL_DEPRECATED ERROR}

I also learned that the DEFAULT value restores an option to what you specified in the project settings.

–jeroen

Filed under: Delphi, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Development, Encoding, Software Development, Unicode

### TPersistent

#### How to Avoid Getting Upset with OptSets

OptSets are a great thing for using consistent settings across multiple projects and machines (such as a build machine). Although they were introduced in D2009, I have found that there are still issues using them in XE4 which I believe are problems in the software and not my wetware.

The first issue is the DPROJ. Settings are present in the DPROJ that when checked in can have adverse effects on the build machine and other developers unless the same setting is present in the OPTSET (such as compiler related ones). This means you have to make sure when editing the OPTSET that the desired changes are in fact being saved, and understand the difference between Applying an OPTSET and adding a Reference to it.

Some of the settings in the DPROJ should be local IMO (the selection of the build config for instance, or run parameters), but they’re not, so I would recommend not checking in the DPROJ unless you have to. At a minimum, you might want to check in one version, and enable VCS-ignore, only updating the DPROJ under version control when absolutely necessary. This can cause issues with GIT when trying to switch branches, so it’s not ideal, but it has the added advantage that Delphi won’t screw up the DPR file when adding units.

If you utilize Search paths in the OPTSET files, you don’t have to add more than the core application classes to your Delphi project. Error Insight will produce more false positives, but in my experience most developers ignore it anyway or disable it. Other side effects might include the IDE refactoring support, but I find that most refactorings don’t work reliably enough, or across units so I rely on manual refactoring as recommended by Michael Feathers from Object Mentor.

OPTSET files are a subset of MSBuild XML including BuildEvents. Unfortunately, these just don’t work as indicated here.  It’s only been 3 releases, so give it time!

For the most part, OPTSET files work, but beware, editing them in the IDE can produce results other than what you might expect. This may be PEBKAC, but for that reason I use NotePad++, or another external editor, but beware that you will have to close and re-start the IDE for any changes to take effect. Likewise, if you switch between GIT branches with other versions of the OPTSET files, you should re-start the IDE to be sure the correct settings are in use.

It would be nice to have OPTSETS that work as you would expect 100% of the time, but the existing implementation is usable if you understand the limits, and while I am sure this article doesn’t cover all of them, I hope it alleviates some grief.

#### Vote for Me!

Actually I am not running for an office of any kind.  I would actually appreciate some votes for my QC items (if that truly counts for anything in terms of prioritization).  Specifically, I would like to see QC # 123768 and 93267 fixed, but feel free to search through all my reports and vote for them

## April 04, 2014

### The Wiert Corner - irregular stream of stuff

#### jpluimers

I’m researching the Spring4D build engine to compile and install the packages and sources for the first Appmethod release.

These are the registry settings that I’ve found:

I wonder if the 13 has anything to do with http://docwiki.appmethod.com/appmethod/1.13.

Anyhow: it looks like the next Delphi (XE6) might not use the number 13. Again. Although Allen Bauer was in episode 13 (:

–jeroen

Filed under: Appmethod, Delphi, Delphi XE6, Development, Software Development Tagged: Allen Bauer

### The Podcast at Delphi.org

#### Thought Controlled Quadcopter

Last night I “controlled” my Parrot AR.Drone Quadcopter with my thoughts through my Emotiv EPOC Brain Computer Interface via an app written in Delphi XE5. I qualify “controlled” in that my flight pattern was a little irregular and short before I crashed it. It was a “look mom, no hands” moment though as the drone was clearly responding to my thoughts for the few seconds before it crashed. I’ve got a lot of work to do in improving the process, so I will be posting code and videos soon. If you want to get a start on it though, it is based on my work from the Devices and Gadgets webinar.

I’m presenting tomorrow at Boise Code Camp on “Is Thought the Future of Wearable Input?” and if all goes well I’ll have a brief demonstration of the tech in action. If you are in the area my presentation is at 11 AM in the Special Events Center at Boise State University.

### Firebird News

#### Advanced Solutions How to : Coordinating transactions for multiple connections in single call

Leyne, Sean asked on Firebird-devel (You can read in that thread the details about problem requirements and proposed solutions) Consider a large database (200GB, large tables with 450 Million rows) which is running on a kick-a** server with pool of enterprise SSDs for storage (more IOPS then Firebird could ever use), which I need to […]

### DelphiTools.info

#### Using reCAPTCHA in DWS WebServer

We’ve all encoutered reCAPTCHA, as it’s one of the few effective ways to protect form submissions from bots on the internet. Acquired by google in 2009, it comes with multiple plugins for various web environment, here is a plugin for DWScript. The plugin (aka unit) can be found in the DWSlibs github repository, and it…

## April 03, 2014

### Firebird News

#### Firebird in Calligra Office Suite discussion on calligra devel list

Discussion was on kde.devel.calligra there is a need for Firebird driver implementation in Kexi in the future. Any contributors for the new kexi driver ?

#### Java needed to run LibreOffice Base Database? No with Firebird SQL

You can try to use the Firebird Database within LibreOffice which doesn’t need Java. This feature is still marked as experimental. Firebird Databases are available since LibreOffice 4.2. (see the release notes for further information To turn the experimental features on, you have to go to the Settings –> LibreOffice –> Advanced –> “Enable experimental […]

## April 02, 2014

### TPersistent

#### Out of Memory - Solved!

I recently read EMBT’s Delphi RoadMap and was very happy so see that QPS (Quality, Performance, Stability) is item #2 on the Delphi 2014 list.  I certainly hope that these items appear in order of priority.  One of the primary issues I keep hitting is the Out of Memory error, although far less frequently thanks to Andreas’ workaround.  If you can’t see the QC report in your web browser, perhaps like me, you are not authorized to see it on the web.  I can view it fine in the QC Windows Client:

Out of Memory Error - solved internally

I am happy to see that this bug has finally been fixed according to the QC # and many other duplicate ones.  It appears to have been fixed as early as January 30, 2014 according to the Closed status replicated from the internal bug tracking system.  For those SA purchasers suffering from this problem, it kind of makes you wonder why this hasn’t been shipped as an update.

I was just going through my QC reports since I wanted to see if the QPS initiative had resulted in some of my long standing reports being addressed.  Sadly I don’t see any movement in that direction yet as a great number of my QC items are still in the Reported state with no comments of any kind.  Perhaps the QPS initiative will mean that QC will no longer be administered by “volunteers”, or perhaps they will recruit additional volunteers to help with the backlog.  I know I would happily volunteer to screen QC reports if it meant helping the product get better and I received a free license for my efforts…

### The Wiert Corner - irregular stream of stuff

#### jpluimers

Every once in a while, someone hoses their computer far enough that it has to be reinstalled, but the original Microsoft product keys are misplaced, and some creepy anti-virus tool disallows the running of standard product key recovery tools like nirsoft’s.

Well, there is enough sourcecode that does recover it, just look for any of these strings:

Some hits:

–jeroen

Filed under: .NET, .NET 2.0, .NET 3.0, .NET 3.5, .NET 4.0, .NET 4.5, C#, C# 2.0, C# 3.0, C# 4.0, C# 5.0, CommandLine, Delphi, Development, PowerShell, Software Development

## April 01, 2014

### Lazarus Team Anouncements

Free Pascal is candidate for SF project of the month April.

Please support  it, and vote (If you haven't voted already).

Thanks

### twm’s blog

#### Translating file filters

You know these innocuous file filters used by Open / Save dialogs? They usually look like this:

First Filetype (*.ex1)|*.ex1|Second Filetype (*.ex2)|*.ex2|All Files (*.*)|*.*


And since typing them is so difficult because you must remember to type all these pipe symbols, Delphi provides a property editor for it.

Is there anybody who actually likes this property editor? I think it’s even more annoying than directly typing these strings. But why, oh why do I have to type the file filter twice? Once for the description and once for the actual filter?

It gets worse: Just imagine you localize an application that uses many such file filters. So you have lots of strings that contain the ‘All Files (*.*)|*.*’ part, but are different because they support different, but partly overlapping file types. You end up translating the same text over and over again:

First Filetype (*.ex1)|*.ex1|All Files (*.*)|*.*
Second Filetype (*.ex2)|*.ex2|All Files (*.*)|*.*
First Filetype (*.ex1)|*.ex1|Second Filetype (*.ex2)|*.ex2|All Files (*.*)|*.*


Maybe you even spelled ‘All Files’ inconsistently as ‘all files’, ‘all Files’ or ‘All files’. Which confuses the translator and looks bad in your program.

And now add human error: The translator overlooks the part with the actual filter because he just doesn’t know that the string contains two different kinds of text: The first part is human readable and must be translated, the second part is used by the computer to filter files, and it must not be translated, it must not even be changed. Your translator might create translations like this:

Erster Dateityp (*.ex1)|All Files|*.*
Zweiter Dateityp *.ex2|All Files (*.*)|*.*
Erster Dateityp (*.ex1)|*.ex1|Zweiter Dateityp  (*.ex2)|*.*e|All Files (*.*)|*.*


Did you notice the errors? Nobody really does and the program gets shipped. Now you have not only a translation error but also a bug in your program, because these strings are no longer valid file filters.

After this happened to me the gazillionth time, I had enough, so I created the following helper code:

type
IdzFileFilterBuilder = interface ['{1EEE52D6-EA31-4C4D-8454-32B2C2BE1814}']
// ... some more ...
function Filter: string;
end;

function FileFilterBuilder(_IncludeAllFiles: Boolean = True; const _AllSupported: string = ''): IdzFileFilterBuilder;


The idea is to call the FileFilterBuilder function once and add any filters you need to the returned interface by chaining the calls like this:

  od.Filter := FileFilterBuilder.AddBmp.AddJpg.AddGif.Value;


Or, if you like this formatting better:

  od.Filter := FileFilterBuilder
.Value;


No unwieldy strings that mix human readable and computer interpreted text, just a simple list of easily readable file extensions. And even if you want to do something more unusual like having one entry for all supported file types and adding a file type that is not predefined by the interface like this:

  od.Filter := FileFilterBuilder(true, 'All supported types')
.Add('Some other graphics format', '*.blub')
.Value;


It is still quite readable. Of course the above strings must be translated, so we add _() function calls for dxgettext:

  od.Filter := FileFilterBuilder(true, _('All supported types'))
.Add(_('Some other graphics format'), '*.blub')
.Value;


Notice that only the part that actually needs translation is inside the _() translation marker? There is no more way for the translator to change essential strings of your programs. He might create wrong translations but your program will still run.

Of course that was only the interface. I guess, implementing it won’t be too hard for most of my readers. But since I am in a generous mood, I give it to you for free (no, that’s not an April fools joke). Just download it from my dzlib utility library on sourceforge. The file is u_dzDialogUtils and it contains a few more of the predefined .AddXxx methods. Also, the library will soon contain the German translations for the filter strings, if you are interested. You will also need the pseudo templates in the templates subdirectory.

Oh, did I mention this little gem:

function TdzFileFilterBuilder.AddPicture: IdzFileFilterBuilder;
begin
end;


It adds three entries:

• Picture Files (*.bmp;*.jpg;*.jpeg)
• Bitmap Files (*.bmp)
• JPEG files (*.jpg;*.jpeg)

Resulting in the following file filter string:

'Picture Files (*.bmp;*.jpg;*.jpeg)|*.bmp;*.jpg;*.jpeg|Bitmap Files (*.bmp)|*.bmp|JPEG files (*.jpg;*.jpeg)|*.jpg;*.jpeg'


(with the ‘All files’ entry added, if you passed true to the FileFilterBuilder function.)

### The Wiert Corner - irregular stream of stuff

#### jpluimers

Stefan Glienke made the announcement earlier today:

Finally! #Spring4D is released in version 1.0 – no joke!

You can get it directly from bitbucket using git (master) or download the zip from the 1.0 tag (http://bitbucket.org/sglienke/spring4d/downloads).

There’s lots and lots of cross platform functionality in it. No UI stuff, just source. And tests for most of it. And there is build.exe to build/install everything.

You need at least Delphi 2010 (since there is a lot of generics stuff in it). Indeed: no non-Unicode Delphi versions and no Delphi 2009 support.

Oh and the containers to have common interfaces like IList and ICollection. That’s why Nick Hodges likes them so much (:

We are going to work to get it to build with AppMethod as well

To get started, download the about zip, unzip recursively, then run BUILD.EXE and have it integrate the packages in your Delphi version.

The master branch will always contain the youngest stable version.

A few directories and unit names:

• Source\Base
• Source\Core
• Source\Extensions
• Source\Base\Collections
• Source\Base\Reflection
• Source\Core\Container
• Source\Core\Services
• Source\Extensions\Cryptography
• Source\Extensions\Utils

with per directory unit names containing:

• Base: DesignPatterns, Events, Helpers, ResourceStrings, SystemUtils
• Base\Collection: Adapters, Dictionaries, Enumerable, Events, Extensions, LinkedLists, Lists, Queues, Sets, Stacks.
• Base\Reflection: Reflection
• Core\Container: Builder, ComponentActivator, Core, DecoratorExtension, Extensions, Injection, LifetimeManager, Pool, Registration, Resolvers, ResourceStrings,
• Spring\Services: Logging
• Extensions: Cryptography (CRC, DES, MD5, SHA, Utils)
• Extensions: Utils (IO, WinApi)

A few demos:

• IntroToDependencyInjection\1-StartingOut
• IntroToDependencyInjection\2-MoveToInterfaces
• IntroToDependencyInjection\3-ConstructorInjection
• IntroToDependencyInjection\4-UseMocks
• IntroToDependencyInjection\5-IsolateInterfaces
• IntroToDependencyInjection\6-UseContainer
• IntroToDependencyInjection\7-CustomConstructor
• IntroToDependencyInjection\8-FieldInjection
• IntroToDependencyInjection\9-DecoratorInjection
• SpringDemos\Demo.Collections
• SpringDemos\Demo.DependencyInjection
• SpringDemos\Demo.General
• SpringDemos\Demo.Patterns
• SpringDemos\Demo.DependencyInjection\MultipleImplementations
• SpringDemos\Demo.Patterns\Factory
• SpringDemos\Demo.Patterns\Observer

And tests:

• Base,
• Collections.Extensions,
• Collections,
• DesignPatterns,
• Helpers,
• Reflection.ValueConverters,
• Reflection.ValueExpressions,
• SysUtils,
• Container.Components,
• Container.Interfaces,
• Container,
• Pool,
• Cryptography,
• Utils,

–jeroen

Filed under: Delphi, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, Software Development

### Firebird News

#### Hopper v1.5.0 – stored routine debugger – now available!

Upscene Productions announces a new release of: “Hopper – a Stored Code Debugger” Hopper is a Stored Routine and Trigger Debugger, available for Firebird, InterBase and MySQL. For more information and a trial download, see the news @ Upscene Productions, pricing information is available. Bugfixes include CHAR issues with InterBase and Firebird and a CAST […]

## March 31, 2014

### Firebird News

#### Jaybird 2.2.5-SNAPSHOT available for testing

Mark Rotteveel wrote on Firebird-java group: I just published a snapshot of Jaybird 2.2.5 for testing.

### The Wiert Corner - irregular stream of stuff

#### jpluimers

In case I ever need it: Charset Detector :: Summary.

It is emperical (you cannot 100% reliably find out what character set / encoding a file is), but has a good score.

A similar problem is detecting the language. There too you can get a good score.

–jeroen

via:

Filed under: Delphi, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, Software Development

## March 30, 2014

### הבייט הלבן

#### מתכנתים ברמה נמוכה

סיפורנו מתחיל במתכנת אמריקני מסוים, בואו נקרא לו נ', שאני מכיר (לא אישית) דרך הרשת. נ' הוא מקצוען כבד בשפת Object Pascal וגם, עד כמה שאני יכול לשפוט, בעל הבנה מעמיקה בכל מה שקשור להנדסת תוכנה, ניהול פרוייקטי תכנות וכל הדברים הגדולים והחשובים האלה. מדי פעם, לקול מצהלות העוקבים אחריו ברשתות החברתיות, נ' מציג פיסות […]

### twm’s blog

#### Changing the mouse wheel scroll behaviour of TListBox

While working on my dzMdbViewer I wondered why the mouse wheel didn’t seem to scroll the listbox containing the table names but did work in the dbtable. It turned out to be a misconception on my side:

The listbox contained only a few items so it didn’t have a vertical scroll bar. The default behaviour is to scroll only the view without changing the currently selected item. Of course this does not have any effect if all items are already visible.

But that wasn’t what I wanted the mouse wheel to do. I wanted it to have the same effect as on the dbtable, that is: Select the next/previous line.

Unfortunately a listbox does not have an OnMouseWheel event (a dbtable does have one), so I could not simply assign an event handler and be done with it. I resorted to a proven hack and created an interposer class that overrides TListBox.DoMouseWheel:

type
TListBox = class(StdCtrls.TListBox)
///<summary>
/// Overrides the default behaviour of the TListbox for mouse wheel scrolling:
/// Rather than scroll the view without affecting the selected item, select the
/// next/previous item as if the user pressed the up/down arrow key. </summary>
function DoMouseWheel(_Shift: TShiftState; _WheelDelta: Integer; _MousePos: TPoint): Boolean; override;
end;

type
Tfr_AccessDb = class(TFrame)
lb_Tables: TListBox;
private
public
end;

implementation

{\$R *.dfm}

uses
Math,
u_dzVclUtils;

{ TListBox }

function TListBox.DoMouseWheel(_Shift: TShiftState; _WheelDelta: Integer; _MousePos: TPoint): Boolean;
var
Idx: Integer;
begin
// calculate the index of the item to select
Idx := ItemIndex - Sign(_WheelDelta);
if Idx >= Items.Count then
Idx := Items.Count
else if Idx  0 then
Idx := 0;
// select it
ItemIndex := Idx;
// and simulate a mouse click on it so the selected table gets displayed
Self.Click;

// tell the caller that the event has been handled
Result := True;
end;


Simple, isn't it?

I found a more involved version on The Spirit of Delphi that overrides the WndProc method and changes the Message to a keyboard message. I like my solution better, it "feels" cleaner.

The other solution also creates a control rather than using an interposer class. That's cleaner than an interposer class but I'm not a great fan of writing my own components to solve shortcomings like this. It's just too much overhead.

## March 29, 2014

### twm’s blog

#### Convert from Subversion to Mercurial fast

In my previous post about converting from Subversion to Mercurial I assumed that I would want to migrate the history of changes from my svn repository to the new hg repository.

For some projects, I don’t really care about the history so I decided to take the quick and dirty route:

• Create a new, empty master hg repository (on a server)
• Clone that hg repository to a local directory
• Check out the project from svn to the same local directory
• Add a new .hgignore file to ignore the .svn subdirectory
• Add the .hg subdirectory to the svn:ignore property
• Add .hgignore to svn and commit that change
• Add everything to hg, commit and push that change

That’s it. Now you have got a directory that contains your sources and they are managed with both, Subversion and Mercurial. Now, get into the habit of committing changes to both as long as you want. Once you are comfortable with Mercurial, just stop using Subversion. You might want to delete the .svn subdirectory at that point.

## March 28, 2014

### Delphi Haven

#### XE5 hotfix 6 is out for fixing an incompatibility with iOS SDK 7.1 and Xcode 5.1

Just a quick post to say Embarcadero have released hotfix 6 for XE5, which resolves significant issues when attempting to develop iOS apps in conjunction with iOS SDK 7.1 and Xcode 5.1. More info is available here; the hotfix itself is downloadable from CodeCentral here.

### Firebird News

#### FirebirdSQL and IntelliJ IDEA

Chris Krycho wrote: Setting up IntelliJ IDEA’s built-in database tools to work with FirebirdSQL requires a particular setup configuration, which I’m documenting here for public consumption.

## March 27, 2014

### twm’s blog

#### Logging into a Mercurial repository on Sourceforge with an SSH private key

I was just about to post the following to stackexchange.com:

I have got a mercurial repository on sourceforge.net, generated an ssh key with PuttyGen and uploaded it to Shell Services Configuration as described in the relevant site documentation. I then started Pageant and entered my passphrase.

Now, I can connect to shell.sourceforge.net without entering a password and create a session there that works fine. So, the key has been generated correctly and uploading the public key also worked fine.

As I understand it, I should now also be able to use the command

hg pull


on a sourceforge repository without the need to enter my password. I therefore added the following line to my mercurial.ini file, in the ui section:

ssh="C:\Program Files (x86)\PuTTY\plink.exe" -ssh -agent -v -i "D:\path\to\my\private_key.ppk"


Unfortunately any hg command that requires a connection to the sourceforge repository times out. If I remove that line again, everything works fine, but I have to enter my password.

hg --debug pull


emits the following lines:

And then I tried it again to get the error messages for posting into the question. Guess what? This time it worked. I swear, I didn’t do anything different than before and I haven’t changed anything. All previous attempts failed with the error “Server refused our key”. So I guess sourceforge changed something. Maybe it was a case of synchronizing the public key to all servers taking forever (several days) or maybe they came around to reading my support request and doing something about it.

Don’t you hate it when things start working without you knowing what caused it to fail in the first place? I certainly do!

### Žarko Gajić

#### FireMonkey / Mobile (Android, iOS) QR Code Generation Using Delphi XE 5 / DelphiZXingQRCode

The DelphiZXingQRCode unit, ported from ZXing by Debenu, allows to easily add QR Code generation to your Delphi VCL applications.

While the DelphiZXingQRCode was designed to support VCL applications (and be used in newer as well as in older Delphi versions), it can also easily be “upgraded” for Fire Monkey applications – be it desktop or mobile (Android, iOS).

### DelphiZXingQRCode -> FireMonkey Support

To FireMonkey-enable the DelphiZXingQRCode unit a few changes to the source code were required.

The unit uses “contnrs” (System.Contnrs.pas) unit which implements TObjectList (used by the unit) and other container like classes. Under FireMonkey for mobile, more specifically under ARC, the classes contained in System.Contnrs.pas cannot be used because they are not ARC compliant.

Equivalent classes are to be found in System.Generics.Collections.pas (ARC compliant) where generics versions of TObjectList is defined.

Therefore, the first change is to replace “uses contnrs, …” with “uses System.Generics.Collections, …”

This also requires to make changes like: from “Blocks: TObjectList;” to “Blocks: TObjectList<TBlockPair>;” – that is to use strongly typed generics list classes.

Further, there are lots of “ansistring” and “widestring” types used for parameters in various functions inside the unit. If you want to go mobile, those are not supported and you should use “string”. More info here: Migrating Delphi Code to Mobile from Desktop.

Therefore, the second change to the unit would be to replace “widestring” with “string” and “ansistring” with “array of byte” (or something else as explained in the article).

### Single Pixel Drawing (and Other Canvas Drawing) FireMonkey Style

In the VCL, the TCanvas class allows accessing single pixels through the “Canvas.Pixels()” property. In FireMonkey this is not supported and you have to use the SetPixel property of a TBitmapData instance.

Once the qr code is generated, to convert it to a bitmap image, in FireMonkey:

var
QRCode: TDelphiZXingQRCode;
Row, Column: Integer;
pixelColor : TAlphaColor;
vBitMapData : TBitmapData;
rSrc, rDest : TRectF;
s : widestring;
begin
QRCode := TDelphiZXingQRCode.Create;
try
QRCode.Data := edtText.Text;
QRCode.Encoding := TQRCodeEncoding(cmbEncoding.ItemIndex);
QRCode.QuietZone := StrToIntDef(edtQuietZone.Text, 4);
QRCodeBitmap.SetSize(QRCode.Rows, QRCode.Columns);
for Row := 0 to QRCode.Rows - 1 do
begin
for Column := 0 to QRCode.Columns - 1 do
begin
if (QRCode.IsBlack[Row, Column]) then
pixelColor := TAlphaColors.Black
else
pixelColor := TAlphaColors.White;

if QRCodeBitmap.Map(TMapAccess.maWrite, vBitMapData)  then
try
vBitMapData.SetPixel(Column, Row, pixelColor);
finally
QRCodeBitmap.Unmap(vBitMapData);
end;
end;
end;
finally
QRCode.Free;
end;

//refresh image control imgQRCode is a TImage
{code below}
end;


Note: compare this with the VCL approach of TDelphiZXingQRCode usage.

### VCL’s Canvas.StretchDraw to FMX’s Canvas.DrawBitmap

There’s no StrecthDraw in FMX’s Canvas class. There’s DrawBitmap. StretchDraw by default does no antialiasing. FMX does. So I had to play a little until I was able to make it work correctly.

I’ve decided to use TImage and not TPaintBox as I was simply not able to make TPictureBox in FireMonkey draw what I wanted

Using TImage, the code to get/display the generated QR Code is as follows:

  //refresh image. imgQRCode is a TImage

imgQRCode.Bitmap.SetSize(QRCodeBitmap.Width, QRCodeBitmap.Height);

rSrc := TRectF.Create(0, 0, QRCodeBitmap.Width, QRCodeBitmap.Height);
rDest := TRectF.Create(0, 0, imgQRCode.Bitmap.Width, imgQRCode.Bitmap.Height);

if imgQRCode.Bitmap.Canvas.BeginScene then
try
imgQRCode.Bitmap.Canvas.Clear(TAlphaColors.White);

imgQRCode.Bitmap.Canvas.DrawBitmap(QRCodeBitmap, rSrc, rDest, 1);
finally
imgQRCode.Bitmap.Canvas.EndScene;
end;


Aliasing – Do Not Need It!

By default, in FMX, when using DrawBitmap to resize it, antialiasing is used by default. There are two properties you need to set to ensure a bigger copy of your (small) qr code is drawn pixel-copy-perfect.

begin
imgQRCode.DisableInterpolation := true;
imgQRCode.WrapMode := TImageWrapMode.iwStretch;
end;


In a FireMonkey Desktop application, this works as expected.

On FireMonkey Mobile it does not – the resized image is still blurred (antialiasing used).

That’s it. QR Codes generation in FireMonkey – both desktop and mobile!

Download the FMX version of DelphiZXIngQRCode.pas: FMX-DelphiZXIngQRCode

Comments are welcome (even more if you know how to resize a bitmap in FireMonkey on mobile without antialiasing)!

### twm’s blog

#### Using MSConfig to disable autostart

I guess most of you know that you can use msconfig (Start->Run->”msconfig”) to disable programs that are automatically started by Windows. And you might have wondered where these entries go, when you disable them. Especially it looks like magic if entries in the start menu’s Startup folders are concerned: You disable them in msconfig and the shortcuts disappear from the folder. You enable them, and the shortcuts reappear again. So how does msconfig know about these disabled entries?

Googling brought me (after lots of irrelevant entries, Google search seems to be getting worse by the day) to
this Stackoverflow question which also contains the answer:

They are stored in the registry under

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg


for programs that are started through the registry autostart and under

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder


for programs started from the startup folder.

Thanks to my colleague Steffen who brought this up. Learned something useful today.

### Firebird News

#### Firebird Free on the Cloud : Amazon ec2 Debian/Ubuntu

From Amazon AWS console you can launch a ec2 free instance , in my case microinstance (if you don’t want to pay) Push the button Launch instance AWS Marketplace : type Debian and select the first one from the list (64 bits version) Currently selected: t1.micro (up to 2 ECUs, 1 vCPUs, 0.613 GiB memory, […]

## March 25, 2014

### The Wiert Corner - irregular stream of stuff

#### jpluimers

I needed to modify some code that had been amended from the Delphi TParser class (which parses DFM files, but can be amended to other sources as well), so here are some links I found during my research:

Oh and it is on the Delphi VCL Hierarchy poster too (:

–jeroen

Filed under: Delphi, Delphi 1, Delphi 2, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 3, Delphi 4, Delphi 5, Delphi 6, Delphi 7, Delphi 8, Delphi x64, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, Software Development Tagged: Delphi TParser

#### jpluimers

I’m so glad I just bumped into the below quote of at Delphi sorcery: CodeRage 6 feedback and DSharp news:

He put an entire class into the implementation part of a unit registering it to the container in the initialization part of the unit. I mentioned the dependency on the container in that case and tried something else: using TRttiContext.GetTypes to iterate all known types looking for attributes that tell to register that type. But it did not list the class in the implementation part of the unit. The class was not thrown out by the smart linker because it was actually used. It just seems to be the case that GetTypes does not find any types in the implementation part while GetType(…) works.

I bumped into this for interface and class types a while ago when writing demos for the upcoming Coding In Delphi book by Nick Hodges.

Part of the demo is RttiHelper.pas, which in part consists of record helpers that extend TRttiContext.

TRttiContext has a few methods, of which FindType, the GetType overloads and GetTypes are the most interesting ones. At first glance, you’d think the get* methods would return results in the same way: GetTypes just returns all the types that GetType could return. But that is not true. GetTypes should have been named after FindType.

FindType already gives you a hint in its parameter AQualifiedName: string and the decription:

FindType searches for the type in all packages and works only for public types that have qualified names.

Private types (types in the implementation section of units) do not get qualified names.

In fact, then you call the method TRttiType.QualifiedName on a type that is in the interface section (private) it won’t find any, and return an error like this::

ENonPublicType: Type ‘IPrivateImplementedInterface’ is not declared in the interface section of a unit.

So I introduced TRttiTypeHelper and named all methods that depend on GetTypes with the name FindType or FindTypes:

Two notes here:

1. There are two other exceptions Rtti can get you: EInsufficientRtti and EInvocationError. I won’t go into detail in this posting, maybe in a later one.
2. System.TObject.QualifiedClassName does not suffer from the limitation: it just shows you the unit name for both private and public types.

The second note came to me as a big surprise: the RTTI infrastructure things differently about qualified names than TObject!

To demonstrate this, I’ve written the unit RttiContext_GetTypes_vs_GetType_on_Interfaces_MainUnit:

Together with RttiContext_GetTypes_vs_GetType_on_Interfaces_ConsoleReportUnit it will return the output at the end of the post of which I’ll show two excertps

You see the really odd lines there:

Found GUID "{E1962EFF-64CD-4ABB-9C44-1503E3CE77A9}" with best private name "IPrivateImplementedInterface" Found GUID "{AD72354C-BD8D-4453-8838-A9C261115A25}" with best private name "IPrivateNonImplementedInterface" private "RttiContext_GetTypes_vs_GetType_on_Interfaces_MainUnit.TPrivateImplementingObject" with RTTI name "TPrivateImplementingObject" private "RttiContext_GetTypes_vs_GetType_on_Interfaces_MainUnit.TPrivateImplementingObjectWithoutTypeInfoCalls" with RTTI name "TPrivateImplementingObjectWithoutTypeInfoCalls

There you clearly see the difference between the two ways of getting a qualified name. Very confusing!

The other amazing thing is that GetTypes does not work for anything private in the implementation section:

public best name "RttiHelpers.TRttiTypeHelper" with QualifiedClassName "RttiHelpers.TRttiTypeHelper" public best name "RttiContext_GetTypes_vs_GetType_on_Interfaces_MainUnit.IPublicImplementedInterface" public best name "RttiContext_GetTypes_vs_GetType_on_Interfaces_MainUnit.IPublicNonImplementedInterface" public best name "RttiContext_GetTypes_vs_GetType_on_Interfaces_MainUnit.TPublicImplementingObject" with QualifiedClassName "RttiContext_GetTypes_vs_GetType_on_Interfaces_MainUnit.TPublicImplementingObject" public best name "RttiContext_GetTypes_vs_GetType_on_Interfaces_MainUnit.IPublicImplementedInterfaceThatHasNoTypeInfoCalls" public best name "RttiContext_GetTypes_vs_GetType_on_Interfaces_MainUnit.TPublicImplementingObjectWithoutTypeInfoCalls" with QualifiedClassName "RttiContext_GetTypes_vs_GetType_on_Interfaces_MainUnit.TPublicImplementingObjectWithoutTypeInfoCalls" 

–jeroen

Filed under: Delphi, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, Software Development

## March 23, 2014

### The Wiert Corner - irregular stream of stuff

#### jpluimers

An interesting thread by Vin Colgin – Google+ – IDE FixPack 5.4.1 shows 36.5% increase in BUILD speed under….

The post and discussion covers these topics:

–jeroen

Filed under: Delphi, Delphi 2007, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, Software Development Tagged: Delphi, speed improvement

## March 21, 2014

### The Wiert Corner - irregular stream of stuff

#### jpluimers

When handling Application.OnException add the ExceptAddr to in Delphi the menu Search -> Goto address has a chance of working, and the ClassName so you know what happened.

You might want to always do this, depending on how scared your users get from HEX values in error messages.

This works in about every Delphi version I ever used:

–jeroen

Filed under: Delphi, Delphi 1, Delphi 2, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 3, Delphi 4, Delphi 5, Delphi 6, Delphi 7, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, Software Development

## March 20, 2014

### Firebird News

#### Firebird Client 3.0 Alpha 2 for Android Download

I have updated the Building guide for Firebird Client on Android. Now you can download and include in your native C/C++/Delphi/Pascal projects libfbclient.so.3.0.0 You can download from here: http://mariuz.android-dev.ro/android_fbclient/libfbclient.so.3.0.0

#### Firebird updated Roadmap for 3.0

Rodmap is updated with the following schedule: Alpha 2 has been released in January 2014; The next testing release (Beta 1) is expected in Q2 2014. Unstable v3.0 builds can be downloaded from the snapshot area. Use the “Track Details” icon to discover the list of tasks currently scheduled for v3.0 Beta 1. From the […]

#### New FlameRobin snapshot uploaded to Debian unstable compiled with wxWidgets 3.0

New Flamerobin snapshot uploaded to Debian unstable with the following changes * use xz compression for snapshot source tarball * New upstream snapshot add support for more Firebird 3.0 reserved keywords ask before deleting unsaved changes to SQL files * switch to WxWidgets 3.0 (Closes: #742092) Thanks to Olly Betts for the patch and the […]

### The Wiert Corner - irregular stream of stuff

#### jpluimers

Jus finished watching this very interesting talk from the last FOSDEM 2014 conference: [FOSDEM 2014] Visualizing Delphi with Moose – YouTube.

It is based on MOOSE (an open-source platform for software and data analysis) and PHARO (a free and open-source Smalltalk environment).

This is how to get started (it is in Dutch, we have great developers and researchers around here).

Be sure to watch the presenter Stefan Eggermont (StackOverflow, Twitter, LinkedIn, GitHub, FOSDEM, website www.legacycode.nl) as this kind of analysis (that is also possible for other languages and tools) can highly speedup your work.

You can download the webm version of the talk from the FOSDEV14 devroom.

–jeroen

Filed under: Delphi, Delphi 1, Delphi 2, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 3, Delphi 4, Delphi 5, Delphi 6, Delphi 7, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, Software Development

#### jpluimers

Wow, did I really wrote that 18 years ago?

Yes I did, and I was quoted in the (back then famous) FAQPAS3.TXT from (now Professor Emeritus) Timo Salmi: The third set of frequently (and not so frequently) asked Turbo Pascal questions with Timo’s answers. The items are in no particular order.

From ts@uwasa.fi Fri Nov 8 00:00:56 1996
Subject: Decompiling a TP .EXE

56.
Q: How can I reverse a TP .EXE or .TPU back into source code?

A: This is simply asking too much. You cannot decompile a TPprogram in a manner that would give you back the original source.This method of reverse engineering is not on in actual practice.

Quoting Jeroen Pluimers jeroenp@dragons.nest.nl

“During thecompilation, important information gets lost about variables,types, identifiers etc. Writing a Pascal Decompiler is impossible.The best you can achieve is a disassembler that can help yourecognize some Pascal statements.”

Since then I learned that compilers emit highly predictable CPU code that – with the right, and sometimes complex, algorithms – can be reconstructed into language structures.

Of course you are missing the identifiers and comments, but you can some remarkable info, especially with well structured code.

–jeroen

via: FAQPAS3.TXT.

Filed under: Delphi, Development, Pascal, Software Development, Turbo Pascal

## March 19, 2014

### The Wiert Corner - irregular stream of stuff

#### jpluimers

Today, Version 4.4.5 of Database Workbench got released.

It mainly is a bugfix release (15 out of 18 issues were bugfixes, of the rest, 2 are feature requests, 1 enhancement): List of items new/enhanced/fixed in Product: Database Workbench v4 – version: 4.4.5.

Enjoy (:

–jeroen

Filed under: Database Development, Delphi, Development, Firebird, InterBase, MySQL, NexusDB, OracleDB, Software Development, SQL Server, Sybase SQL Anywhere

### Firebird News

#### Database Workbench 4.4.5 released

Upscene Productions is proud to announce the next version of the popular multi-DBMS development tool: ” Database Workbench 4.4.5 Pro ” For more information, see here. The Free Lite Editions will be released at a later stage. Database Workbench supports: - Borland InterBase (6.x – XE ) - Firebird ( 1.x, 2.x ) - MS […]

## March 18, 2014

### Behind the connection

#### On the fly form

This article explain how to create a form on the fly. Such a form is created by code, without using the designer. You will surely ask why you would do that! Granted the Delphi form designer is very easy to use. But in some cases it is not practical because it creates several files and makes more difficult, for example, to hide the form in a component. This is exactly the case I had: in a

### Firebird News

#### DBD-Firebird version 1.18 is released

Firebird Perl driver version 1.18 is released with the following changes a bit more verbose ok() calls in 90-event-ithreads.t disable threaded event tests under AUTOMATED_TESTING Makefile.PL: check for ‘ibase.h’ presense in potential include dir allow empty (but still defined) DBI_PASS/ISC_PASSWORD for tests add support for FIREBIRD_DATABASE in tests’ environment adjust double tests to not fail […]

#### Using EXCEL to read Firebird databases

Sometimes you can be very useful if the content of some tables are migrated to Firebird Excel. Possibly most applications your users know how to use Excel then be easy for them and easy to make your own queries, view charts, etc.. The steps are: Install [...] Read the rest of this article (Spanish)

### The Wiert Corner - irregular stream of stuff

#### jpluimers

Reminder to self: some great ideas to hunt for memory leaks while your application is running: differencing allocation dumps, DDDebug Memory Profiler, etc.

Thanks to the TURBU Tech blog from Mason Wheeler.

–jeroen

Filed under: Delphi, Development, Software Development

## March 17, 2014

### Dr.Bob's Delphi Notes

#### Delphi Developer Days 2014: May and June

Mark your calendar or agenda: Delphi Developer Days 2014, featuring Cary Jensen and yours truly Bob Swart, are coming your way in May and June 2014. We start by visiting two cities in the USA: Washington DC/Baltimore on May 5-6, and Chicago on May 8-9.

## March 16, 2014

### twm’s blog

#### I bought a Kindle

I had decided to never buy a Kindle because I take issue with Amazon controlling it, not myself. Also, I hate it that all Kindle e-books from Amazon are encumbered by DRM.

Nevertheless, as the price dropped below 50 Euros for the pre-Paperwhite version, I could no longer resist and bought it. The rationalization is that last holiday I run out of books halfway through and had to hunt through the hotel’s book stock and try to buy some English books in a Spanish holiday town mostly frequented by Germans (where there were quite a few shops selling used German books, but not a single one selling English books, used or new). So, next time this happens all I need is some Internet access. We’ll see how that works out.

As for the device itself:
The good:
The e-ink display is awesome. It makes reading a lot less stressful to the eyes than my phone or tablet display. Also, the Kindle weights a lot less and goes a for many days with one battery charge. I look forward to reading some “thick” books on it without hurting my wrists holding them.

The positioning of the buttons for turning the pages takes a while to get used to. They are not where I could use them when holding the Kindle with one hand. Also organizing my books is more trouble than I would have thought. Where is the web interface for doing that task on my desktop computer? The built in web browser (which is beta) is not of much use. Since I already have got a smart phone and a tablet I don’t expect to use it at all.
Instead of buying you can also download a preview (apparently the first few pages) of a book for free and -if you have Amazon Prime – lend one book every month for free. Of course one book a month is a lot less than what I read normally so I don’t expect to use that feature much. Also, Amazon.de only offers German books for lending, while I prefer English books.

The ugly:
One Word: DRM. You cannot read the Kindle e-books you “buy” on anything else but either a Kindle device or the Kindle programs/Apps. If at one time in the future I want to buy an e-book reader from a different vendor, I cannot transfer any of the e-books I bought in Kindle format to the new device. Also, Amazon has proven that they can and will delete books from their customer’s Kindles even though these customers had legally bought these books through the Amazon web site. Also, there are cases where they deleted a customer account and wiped all Kindle content.
So, if you buy a Kindle, you must understand that you are not actually buying the device, and if you buy a Kindle e-book you are not actually buying the book. Amazon can take it away from you and render the device useless whenever they think they have a reason for doing so.
On the upside the Kindle can also display other e-book formats that do not have DRM. So if you convert the e-books you already own to e.g. mobi format you can transfer them to your Kindle either via USB cable or by sending it to the e-mail <address>@kindle.com associated with it. There is a nice tool for doing that called Calibre. It also allows you to configure your Kindle’s e-mail address so it can automatically send the books to it.

And, of course, DRM can be broken and has been so in every single form that was sold so far. This is also true for the Kindle e-book format. There are multiple tools for removing the DRM from these e-books so they can be converted to different formats freely. They are probably illegal and I won’t link to them (that’s illegal in Germany too) but Google is your friend. I even managed to convert the one book that I had “lent” from Amazon for just that purpose (The book was crap, but hey, I never intended to read it in the first place.).

## March 14, 2014

### Firebird News

#### ER/Studio Data Architect® 9.6.1 does have officially full support for Firebird 2.5

What is new in ER/Studio Data Architect Version 9.6.1 New DBMS Platform Support – Firebird Firebird 2.x: Officially supports Firebird 2.1 and 2.5. Firebird 1.5: Officially supports Firebird 1.5.

#### A tutorial introduction to Sqitch change management on Firebird

This tutorial explains how to create a sqitch – enabled Firebird project, use a VCS for deployment planning, and work with other developers to make sure changes remain in sync and in the proper order. We’ll start by creating new project from scratch, a fictional antisocial networking site called Flipr. All examples use Git as the VCS […]

## March 13, 2014

### Firebird News

#### Spanish blog about Firebird after one year exceeded 116,000 visits

Author tells his story  on the blog first birthday: When I launched, one year ago I did not knew if it would be read, if anyone is interested in what I had planned to write, but I thought it needed a blog in Castilian language to help us learn more about Firebird, because it is […]

### The Wiert Corner - irregular stream of stuff

#### jpluimers

Yet another example of somehow who got bitten hard by using the with statement (I decided to give with its own category on my blog).

This time it got shared by Paul Foster on G+ and comes down to this:

Even in unsuspiciously looking code, the wit statement can bite you, especially if you need to do refactoring and (because of that) introduce two names in the same scope.

Or in Paul‘s words:

Whilst upgrading the code to remove the Containers unit (its not supported on NextGen platforms, so I have to make things work with Generics.Collections instead, (bye bye D7 support for this code) and refactor a couple stupidities in my original design (they always creep in, don’t they) I ended up with two class members of the same name.  The with block then looked OK but I was in fact not access the member I thought I was.

–jeroen

Filed under: Delphi, Delphi 1, Delphi 2, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 3, Delphi 4, Delphi 5, Delphi 6, Delphi 7, Delphi 8, Delphi x64, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, Pascal, Software Development, With statement

## March 12, 2014

### The Wiert Corner - irregular stream of stuff

#### jpluimers

An interesting discussion about the Delphi ARC compilers and Free versus DisposeOf is at Ondrej Pokorny – Google+ – Just realized: For me the most dangerous thing in ARC is….

Filed under: Delphi, Delphi XE4, Delphi XE5, Development, Software Development

#### jpluimers

Very interesting helper function:

function TDataSetExtensions.Select<TResult>: IEnumerable<TResult>

–jeroen

Filed under: Delphi, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Development, Software Development

### Firebird News

#### Free Pascal 2.6.4 has been released

Free Pascal 2.6.4 is a point release from the 2.6.0 fixes branch. Some highlights are: Packages: Lots and lots fixes and improvements for fcl-db web and json packages synchronized. improvements to the chmcmd compiler. Several fixes for winunits (and winceunits) Documentation: Many additions fpjson documented See the changelog for the list of reported bugs which have been […]

### The Wiert Corner - irregular stream of stuff

#### jpluimers

For my own link archive: CodeRage 8 replays – Embarcadero Technologies – YouTube.

Lots of nice sessions, including these REST sessions:

About the REST support in Delphi: make sure you take a look at the REST Debugger application, as you get full source code for it and is an excellent starting point to see how the REST components work together (it is written using the FireMonkey UI framework so it runs on a Mac as well as on Windows).

David I explains more about the REST Debugger here: Sip from the Firehose : Using the REST Debugger will help you prototype your Delphi and C++ REST apps.

Jim McKeeth has a really nice video about it as well on XE5 REST Debugger Supercharged | The Podcast at Delphi.org which describes how to use Delphi the Delphi REST tools to use KimonoLabs to scrape data from web sites:

–jeroen.

RestDemo folder with many examples that connect to many social things (Twitter, FaceBook, DropBox, etc).

Filed under: Delphi, Delphi XE5, Development, Software Development

### The Wiert Corner - irregular stream of stuff

#### The first Microsoft Pascal with an IDE and OOP

A really long time ago, I posted in history – What features contributed to the evolution of Pascal? – Programmers indicating there was a Hard Disk Image of MS-DOS 6.22 with Pascal for Computer Studies. In fact, that is an IMG file of a DOS hard disk. And this posts shows how to use it with VMware Fusion on Mac OS X. The is a hard disk image contains:

• A full version of MS-DOS 6.22 (MSDN Original)
• Borland Turbo Pascal 7.0 (main)
• Borland Turbo Pascal 6.0
• Borland Turbo Pascal 5.5
• Microsoft QuickPascal 1.0

### DOS on a Mac

At the end of last century, nobody would expect to even run a terminal shell on Mac OS. And indeed, up until Mac OS 9, this was impossible. But in 1999 (Darwin) and 2000 (Mac OS X Server 1.0) Apple introduced Terminal.app into OS X  (called OS X since 10.8), allowing access to the command line shell. x86 support is another thing though: the early Macintosh was Motorola 68000 based  and later Macs were PowerPC based. In 2005 the Apple’s transition to Intel processors became clear. Mid 2006 the first Intel based Mac was introduced based on what commonly is called the Apple-Intel Architecture. They ran Mac OS X 10.4 “Tiger” which supported both Intel and PowerPC. In 2009, PowerPC support was dropped with Mac OS X 10.6 “Snow Leopard”. Without a form of emulation, you could not run one architecture on top of the other. Luckily, these products appeared:

But emulation is slow (in the early 1990s you even had Apple’s DOS Compatibility Cards that were basically a PC in a NuBus slot, before that in the late 1980s AST had similar x86 cards), so I never used these architectures, and now that all Macs have been Intel based, you can use another technology that is much faster: Hardware-assisted virtualization.

Eric Traut is a name to watch with respect to emulation and virtualization. He worked at the Mac 68K emulator, Virtual PC, Virtual Server and Hyper-V. Now he is a Microsoft Distinguished Engineer in the Virtualization area.

### Virtualization

I choose VMware Fusion for running this hard drive image, as virtually (pun intended) all my development and production environments run under a VMware product, and exchanging machines between them is a breeze. In the future, I might try one of these to see if the steps are any easier based on the Comparison of platform virtual machines page on WikiPedia:

### The HDD image on VMware Fusion

The Hard Disk Image of MS-DOS 6.22 with Pascal for Computer Studies uses the IMG file extension. Like many DOS and Windows disk images it is a physical disk dump, but unlike IMA/FLP floppy disk images, hard disk images can take up a lot of space when the imaged disk is large, even when little of that space is actually in use. Thats why virtual disk images (like VHD, VMDKVDI or HDS) often use sparse formats where unused portions are not stored. The IMG extension is unfortunate, as it is also used for other formats, for instance CD/DVD ISO images, RLE bitmap images and others. Luckily, this IMG file is compatible with a VHD file. Though VMware Workstation and VMware Player have built-in support for VHD, VMware fusion is not, so I needed a way to convert the VHD into VMDK. There are a couple of ways to do this:

When you have converted the CSBOOT.IMG into VMDK, then you can import it in VMware Fusion.

The disk image also includes the most basic IDE CD-ROM driver shipped with the MS-DOS 6.22 boot diskette and the Microsoft Mouse Driver 8.20 which is commonly used (only with PS/2 mouse, like what we have at school).

After booting up, you can type:

• cls: Clear screen
• turbo/tpx: Launch Turbo Pascal 7.0
• turbo60: Launch Turbo Pascal 6.0
• turbo55: Launch Turbo Pascal 5.5

### Screenshots

The directories of the DOS-Pascal disk after running Turbo Pascal 7.0

The first Turbo Pascal with OOP

The first Turbo Pascal with Turbo Vision

The first protected mode Turbo Pascal with Object Browser, Syntax Highlighting, Undo/Redo, Symbol Information

The first Microsoft Pascal with an IDE and OOP

–jeroen

Filed under: Borland Pascal, Development, Fusion, Pascal, Power User, Quick Pascal, Software Development, Turbo Pascal, VMware, VMware Workstation