Firebird News: Node-Firebird group is created for discussions about asynchronous Firebird client for Node.js.
Delphi Code Monkey: Seven Days using the Surface RT: The Good, the Bad, the Ugly, and the Inexplicable
Last weekend, when I heard about the sudden price drop on the 32 gigabyte Surface RT running the ARM variant of Windows 8, known as Windows RT, I decided I wanted one. So I went to FutureShop and bought it. I also grabbed the Type Cover but instead of paying full price, I got one used from an online classified advertisement.
This is the limited (Windows RT) Surface model that you cannot install any regular Windows applications on, because it doesn't have an Intel-compatible (classic PC) CPU. It does however run a version of Windows that you can not tell apart from the version that runs on my regular desktop PC.
What is most surprising about that is that they have left the full Windows 8 desktop environment on there. You can even (surprisingly) install various setup.exe or installer.msi files, but here are the two catches, and they're big ones:
- The only setup.exe or installer.msi files you could run on your surface RT are the ones built and signed by Microsoft.
- There is no known legal way to permanently rootkit your Windows RT device, at least not yet, which is the only way you can turn the code signing security features of Windows RT off or reduce them to sane levels.
So, while Microsoft clearly can and does and has written Desktop software for Windows RT, including the Visual Studio 2012 remote-debugger toolset, and other stuff, you cannot do the same. This seems to me to be the big injustice of Windows RT, and is the one thing I wish Microsoft would seriously reconsider. Sure, make the Windows store app side always require a signing, and require side-loading to use your Enterprise tools and enterprise signing system. Fine. But free the Windows RT desktop up to hobby-users.
The flaws in Windows RT are so many, but one of them is that the desktop environment is not, and cannot easily be made touch friendly, and yet, there are so many things that you simply cannot do without using the desktop. In a previous blog post I complained about Windows 8's inability to pause and resume a printer queue without finding a pulldown menu that is more or less hidden, and almost impossible to tap with your finger on a touchscreen. Hopefully Windows 8.1 will make the use of a keyboard and mouse, and the use of the classic desktop less frequently necessary.
The second most annoying flaw is that this portable device has all the beauty of Windows 8's desktop, and all its warts. Do you love waiting for 36 updates to download and install on Patch Tuesdays? You know I love that. You can about double the installation times and that gives you the flavor for how much Windows RT updates are just like their Windows 8 sibling's updates. There are more updates for RT than Win8, it seems, or the Surface RT simply takes a long time to install them.
But at the top I said I like this device, let me point out five reasons why I think this hardware form-factor and this software approach are interesting and offer people value. Some of these points are conditional on things that may never happen, because Microsoft has a history of snatching defeat from the jaws of victory, and long experience makes me less than hopeful. Still, there is hope, however far off, that this could morph into a brilliant product line. Right now, it's flawed, but it shows promise.
1. A device you can hold in one hand or fit in a small daily-carry satchel, for $349, that runs MS office, and has a usable keyboard. ($349 for Surface, and $99 or $120 for the keyboards). For people who need Word, Excel, and PowerPoint to go, this is a steal. When Windows 8.1 comes out, Outlook will be included, which is where I think this will get really interesting. The other cool thing in Office is "OneNote" which is perhaps not well known, but is a pretty fabulous application. Think of it as a hyper-textual notebook for all your personal or corporate internal scribbles. What would a programmer keep in there? I might keep a list of SQL queries that helped me out of a jam at one time or another, List of Books I Plan to Read in the Next Five Years, A Place to Store My Library Card Numbers, Utility Company Account Numbers, and stuff like that. I currently keep all that stuff on Google Documents, but the thing is that I would rather keep them available for even when I'm offline, and OneNote is probably an even better home for them than Google Docs, as this information is information I might like to keep with me wherever I go, even when there is no internet.
2. A device with remote desktop that does a pretty good job of remoting into Win8 and Win7 and other Windows versions. IT people, programmers, and people who have to use a dozen or two dozen cloud computers will find this device indispensable.
3. A very nice screen for watching 720p video while on an airplane, bus, or train, or for entertaining your kids while you're on a drive. I plan to use this thing, hanging on the back of our car's front seat, to entertain my 2 year old on road trips, with episodes of Blue's Clues. Exactly like many people are using the iPad and Android tablets. I happen to really like the screen size (10.2), and think it fills a nice niche that makes it better for video in the car than the Google Nexus 7" we own. I used an iPad long enough that I borrowed from my employer that I have a healthy respect for the large iPad screen, but now that the Surface RT price is cheaper by $150, I think that the number of people who would buy it as a video device has increased. I know the Surface RT is not a high-DPI display, but the color quality and even brightness of the screen are really impressive. I have used this device for watching Netflix while at home, and I really enjoy using it much more than I liked the iPad or my MacBook or my PC laptop. It's the best portable Netflix device I have yet used.
4. I intend to write an app for this thing, it's going to embed a scripting language, and let you mess around with code and mathematically oriented libraries. You could say it will be something like WxMaxima, or Mathematica when it's finished. I am also going to write a photo-app to help you with offloading pictures from your camera. Oh, I forgot to mention the best thing so far that makes the Surface RT better than any other tablet.
5. The Surface RT gets USB the right way around. Instead of one USB device port, it has a USB host port. Why oh why does everyone else get it wrong? You can use the Surface RT to download pictures from your camera at full USB speeds, or you can plug a USB card reader into the Surface RT to read your SD or CF cards. You can also plug in a USB hard disk, a usb mouse, or any of thousands of other USB peripherals, as long as the drivers are built-in to Windows RT already. Any device that requires custom drivers to function will not be a good fit with Windows RT, sadly. I can't think of too many devices that you would want to plug into a Surface RT that do require extra drivers, other than Printers. We'll have to see how the Printing situation evolves on Windows RT.
The printer and device driver dilemma may in fact be the reason why Microsoft has to open up the desktop development side of Windows RT. Without the ability to plug in some Drivers, and some Desktop Accessories that live outside the WinRT sandbox, the platform is going to remain artificially sterile and artificially useless. Other things that I already wish I could load on WinRT that I can't include CCleaner, or something like it to monitor and clean up disk space on this "Tiny" 32 gigabyte flash drive, and a decent text editor like Notepad++. No I do not want some stupid Windows Store App text editor, Microsoft, you idiots.
Anyways, I love the Surface RT, but it is flawed and limiting in some ways that it didn't have to be.
Here's the final thing to consider when looking at RT versus Surface Pro: If you're going to spend over a thousand dollars on a Surface Pro, ask yourself, do you really want to be burning a Core i5 CPU and a full Win32 OS services complement, on a mobile device? Because I sure don't. Yes, maybe it would be cool to have Delphi on a Surface device but actually, I doubt it. Desktop Win32 and its pathetic ability to deal with high-DPI screens on classic Win32 API apps makes the Surface Pro something that I would find ugly and useless for Windows desktop apps. Maybe the Surface RT is limiting, but it's well designed, and far far less irritating than a 150% DPI-virtualized bitmap-scaled blurry Delphi IDE would be.
Delphi Haven: My FMX TClipboard and TMacPreferencesIniFile implementations now compiling in XE4
A bit belatedly, but my FireMonkey TClipboard and TMacPreferencesIniFile implementations are now compiling with XE4 (thanks goes to Ken Schafer for prodding me in the case of the former). See my post from nearly a year ago for the details:
http://delphihaven.wordpress.com/2012/07/27/fmx-tclipboard-and-tmacpreferencesinifile/
With respect to TClipboard, I’ve also done the following:
- Added a cfPNG TClipboardFormat identifier (this is the same as cfBitmap on OS X).
- Fixed a bad assumption about bitmap pitches on Windows that was causing issues for some people.
- Switched to using CF_DIBV5 internally when reading or writing bitmaps on Windows.
- When assigning to a bitmap, cfPNG is now looked for first (this makes things works better with MS Word), and correspondingly, HasFormat(cfBitmap) now also checks for cfPNG as a special case.
- On Windows again, when a source bitmap includes transparency, the outputted DIB has this transparency removed, however at the same time a PNG representation is added that maintains the original alpha channel.
- For both Windows and OS X, added GetFormats and GetFormatName methods. Where the former returns an array of TClipboardFormat, the latter converts a TClipboardFormat to a string:
procedure TfrmClipboardDemo.btnListClick(Sender: TObject); var Format: TClipboardFormat; S: string; begin for Format in Clipboard.GetFormats do S := S + sLineBreak + Clipboard.GetFormatName(Format); if S = '' then S := 'Nothing is currently on the clipboard.' else S := 'The following formats are on the clipboard:' + S; MessageDlg(S, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbOK], 0) end;
This is the result when I copy a word on a webpage in Safari:
As this example hints at, it’s better to use Apple’s ‘UTI’ format for custom clipboard identifiers on OS X (e.g. com.mycompany.formatname, though ultimately just something.something, or something.something.something, etc.). While things still work if you don’t, failing to do so will lead the OS to allocate a parallel ‘dynamic’ UTI for you (e.g. dyn.a1oad0fg1bber13hthat600s0nand0nand0n). As such, I’ve tweaked the demo accordingly – click the ‘Copy as Custom Clipboard Format’ button then the ‘List’ one, and you get this:
The Podcast at Delphi.org: 53 – Subject 33 & Android Game Development
Taking with Jason McMillen & Paul Nicholls of Pascal Game Development talking about Subject 33 and Android game development. Subject 33 is being developed with RemObjects Software’s Oxygene for Java and they are specifically targeting the new Ouya platform as well as Android in general.
Taking with Jason McMillen & Paul Nicholls of Pascal Game Development talking about Subject 33 and Android game development. Subject 33 is being developed with RemObjects Software’s Oxygene for Java and they are specifically targeting the new Ouya platform as well as Android in general.The Podcast at Delphi.org: Also on the Tablet Show
As an interesting turn of events I was interviewed on The Tablet Show a couple weeks ago. The Tablet Show is all about developing for tablet devices, and is by the same people who make .NET Rocks. The show is live today as episode 94. This show was recorded when I was still a Delphi MVP, before I was an Embarcadero Employee, but after I had accepted the position.
In this episode I am interviewed about Tablet Development Using Delphi and FireMonkey. It was a lot of fun and hopefully informative. Thanks to Carl and Richard for the interview.
As an interesting turn of events I was interviewed on The Tablet Show a couple weeks ago. The Tablet Show is all about developing for tablet devices, and is by the same people who make .NET Rocks. The show is live today as episode 94. This show was recorded when I was still a Delphi MVP, before I was an Embarcadero Employee, but after I had accepted the position. In this episode I am interviewed about Tablet Development Using Delphi and FireMonkey. It was a lot of fun and hopefully informative. Thanks to Carl and Richard for the interview.twm’s blog: using and ab-using ifdef
I am currently trying to update an open source project from Delphi 2007 to XE2 and found some code which supposedly already works for XE2. But it is ab-using ifdef in several ways so I thought I’d blog about this to vent some steam and also possibly educate others.
(Class name changed to protect the innocents. ;-))
Please, never ever do this:
function TSomething.GetRecord(Buffer: {$IFDEF DELPHI_2009} RecordBuffer{$ELSE}PChar{$ENDIF}; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
There are actually several things wrong with this code:
- Never use an ifdef for a specific Delphi version. Instead define a symbol for a specific feature like
{$ifdef DELPHI_2009} {$define SUPPORTS_TRECORDBUFFER} {$endif}
and use that one in code. Remember: Usually, new features stay with all later Delphi versions, so even the name of the conditional is wrong, it should be DELPHI_2009_AND_UP or similar, if used in that way.
- Don’t sprinkle ifdefs like this through 1000s of lines of code just because the type of a variable, parameter or function result has changed. Instead define your own type like this:
type {$ifdef SUPPORTS_TRECORDBUFFER} TMyRecordBuffer = TRecordBuffer; {$else} TMyRecordBuffer = PChar; {$endif}
and use it wherever necessary. It makes the code so much more readable.
- At least they got something right: They don’t use VERxxx all over the place but have an include file as a central place to check for compiler versions.
But: Don’t write your own version include file, instead use one from a popular open source project like Project Jedi when possible. There used to be a compilers.inc file on the interwebs, but I don’t think it is being maintained any more.
</rant>
The Podcast at Delphi.org: Why Some Mobile Apps are So Slow
If you haven’t read the lengthy article on Why Mobile Web Apps are So Slow I recommend you check it out. It appears well researched, citing lots of tests, sources, benchmarks and authorities. In summary JavaScript is garbage collected, and garbage collection introduces overhead making it up to 5x slower than native code. This isn’t such a big deal on x86 desktops, but with the slower architecture of ARM it is killing the performance of mobile apps.
Take a look at it, even if you just skim it you will no doubt learn something about this heated debate. Oh, and everywhere it talks about LLVM and ARC remember that is the same architecture that Delphi uses [PDF] for iOS development (and Android soon too).
Also keep in mind that JavaScript isn’t the only garbage collected language on mobile devices. Languages that run on the Java Virtual Machine and .NET Framework are also garbage collected, as are most all scripting languages. This includes the Dalvik Virtual Machine that non-NDK Android apps run on. Granted Dalvik is optimized differently than that Java Virtual Machine, but it is still garbage collected, so it will still pause program execution at some point.
Quote from the article by Herb Sutter:
Managed languages made deliberate design tradeoffs to optimize for programmer productivity even when that was fundamentally in tension with, and at the expense of, performance efficiency…
Which was endorsed by Miguel de Icaza of Mono & Xamarin:
This is a pretty accurate statement on the difference of the mainstream VMs for managed languages (.NET, Java and Javascript). Designers of managed languages have chosen the path of safety over performance for their designs.
Points to remember:
- Garbage collection is up to 5x slower than native code
- This is a much bigger deal on ARM architecture than x86
- Automatic Reference Counting (ARC) is not Garbage collection
- Delphi uses LLVM architecture and supports ARC like Objective-C
Clarification: A big part of the slowdown is that JavaScript is also a dynamic language, so all garbage collected languages are not 5x slower than native code. There are pros and cons to GC and ARC. There is a comment on the article that points out the 5x comparison was between GC and manual memory management, not ARC. There is overhead with ARC, but it doesn’t pause your apps execution.
Read the article and draw your own conclusions, but I’d love to hear what you think.
The Wiert Corner - irregular stream of stuff: jpluimers
Need to find/create a Delphi compatible version of Messagepack or BSON.
–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, Delphi, Delphi XE2, Delphi XE3, Development, Software Development
Firebird News: Mysql2Firebird update : MySQL Workbench support added
The Wiert Corner - irregular stream of stuff: jpluimers
Replay video’s can be viewed through streaming.embarcadero.com (where you can also find the other series, downloads, etc).
The SummerSchool 2013 replay videos are at streaming.embarcadero.com/summerschool2013
The Q&A from today’s session on “Accessing local storage” demonstrating iOS specifics in Delphi XE4:
Audience Question
Q: If I program 2 different applications with connection to a local database – is it possible the both programs use the same local Database? Or has Program 2 no access to the database of program 1 ???
A: On iOS apps are sandboxed. SO you will need two databases (if using on the device storage) You can have 1 database in the back end using DataSnap/Soap to help syncronise data. We will look at this later in the season (lesson 5&6) especially easy direct DB access with DataSnap.
Audience Question
Q: I need an encrypted local database, which can i use on iOS?
A: InterBase ToGo will be the best option. Email me about what you are doing and we can chat further.
Audience Question
Q: Do you have any example on how to access the photos directory?
A: Photo Editor Demo
For more questions or information, contact the Embarcadero presenter team at developerdirect.online@embarcadero.com for questions:
–jeroen
Q: Good morning!
Q: I missed the email invite for lesson 3. Only for lesson 4. Did invites for lesson 3 get out?
Q: Make more clear that you have to takt the poll in the webinar screen. That was not obvious to me.
Q: I thought it was just a PPT slide.
Q: Then I saw the % in the next page.
Q: You can also use IncludeTrailingPathDelimiter
Q: (Boy I dislike that sometimes you guys use abbreviations and sometimes you don’t. Make a choice. Stick to it)
A: We do tend to use abbreviations, but only once we have said what they are. Sorry if there is confusion or we get this wrong from time to time.
Audience Question
Q: If I program 2 different applications with connection to a local dababase – is it possible the both programs use the same local Database? Or has Program 2 no access to the database of program 1 ???
A: On iOS apps are sandboxed. SO you will need two databases (if using on the device storage) You can have 1 database in the back end using DataSnap/Soap to help syncronise data. We will look at this later in the season (lesson 5&6) especially easy direct DB access with DataSnap.
Q: I missed the email invite for lesson 3. Only for lesson 4. Did invites for lesson 3 get out?
A: The same link works for all sessions (incase you want to add a manual reminder to your diary). Tuesday and Thursday next week are the last two in the season
Q: I mean abbreviations in the RTL code. R&D has to make a choice, then stick to it, and Q&A has to be anal into watching it.
Q: TIniFile is great btw: glad you guys made that X-platform.
Q: The advantage if IncludeTrailingPathDelimiter is that only will be added if needed (depending in the running platform).
Q: I usually have a function like “GetRoamingDocumentsPath” for stuff that lives in a Roaming/Cloud environment.
Q: TIniFile is great btw: glad you guys made that X-platform.
A: :-)
Q: I usually have a function like “GetRoamingDocumentsPath” for stuff that lives in a Roaming/Cloud environment.
A: Great way to do things
Audience Question
Q: I need an encrypted local database, which can i use on iOS?
A: InterBase ToGo will be the best option. Email me about what you are doing and we can chat further.
Audience Question
Q: Do you have any example on how to access the photos directory?
A: Phot Editor Demo
Filed under: Delphi, Delphi XE4, Development, Software Development Tagged: Delphi, embarcadero, iOS, OS, software, technology
The Podcast at Delphi.org: Directions to iPhone, Windows & OS X
I was thinking about the Delphi Mobile Roadmap and got the idea of making some Highway signs to illustrate that theme. Mostly for fun.
Feel free to share this image with others who may be looking for direction to reach iPhone, iPad, Windows and OS X from a single tool.
The Wiert Corner - irregular stream of stuff: jpluimers
During code reviews, I often see people do things like this:
if (not DirectoryExists(Path)) then ForceDirectories(Path))
or this:
if (not TDirectory.Exists(Path)) then TDirectory.CreateDirectory((Path))
Half a year ago, I wrote about .NET/C#: do not do “if (!Directory.Exists(path)) Directory.CreateDirectory(path))”.
The same holds for since Delphi XE introduced the ForceDirectories method in the SysUtils and FileCtrl units and the TDirectory.CreateDirectory method in the IOUtils unit.
You don’t need the if statements here in Delphi either: The methods ForceDirectories and TDirectory.CreateDirectory (that internally calls ForceDirectories) will do nothing if the directory already exists
So your code only needs to be like this:
ForceDirectories(Path));
or this:
TDirectory.CreateDirectory((Path));
This is how a simplified ForceDirectories method implementation looks like:
function ForceDirectories(Dir: string): Boolean; begin Result := True; if Dir = '' then raise EInOutError.CreateRes(@SCannotCreateDir); Dir := ExcludeTrailingPathDelimiter(Dir); if (Dir = '') or DirectoryExists(Dir) then Exit; Result := ForceDirectories(ExtractFilePath(Dir)) and CreateDir(Dir); end;
–jeroen
Filed under: Delphi, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Development, Software Development
Behind the connection: Using RTTI to convert record to/from string
twm’s blog: tdbf updates help required
I got developer access to the tdbf sourceforge project and made the packages compile with all Delphi versions I have got:
- Delphi 6
- Delphi 7
- Delphi 2005
- Delphi 2006
- Delphi 2007
- Delphi 2009
- Delphi 2010
- Delphi XE
- Delphi XE2 (32 and 64 bits)
- Delphi XE4 (32 and 64 bits)
I also applied several bugfixes which I already had in my private repository and others I found on the web and in the project’s forums (but not all of them).
Of course compiling does not mean it works. Since I am unlikely to actually use tdbf with anything else but Delphi 2007 and XE2 32 bits in the near future, I need help for all the other versions. So, please, if you use tdbf with any of the other theoretically supported compilers, including the really ancient ones (Anybody still using Delphi 3?) and also C++-Builder and Lazarus/fpc, and are willing to help, test tdbf and send me any patches required to make it compile and work.
Please post to the forums in the tdbf sourceforge project.
I am not the new maintainer of the project, btw., I am only temporarily collecting patches because nobody else does.
Firebird News: Jaybird 2.2.4 snapshot with basic Java 8 / JDBC 4.2 support
TPersistent: Nick Advocates Open Source Unit Testing
If you aren’t subscribed to the delphi feeds or Nick Hodges blog you may not have noticed his recent post proposing that EMBT open source their unit tests. If not, do yourself a favour and subscribe…
I blogged some time ago about EMBT needing to increase their leverage of open source like Apple and other IT companies, so it comes as a nice surprise that someone who has seen behind the corporate veil advocates a similar move to what I have previously recommended.
While I would agree with Nick’s premise that EMBT should make some Delphi source code open source, I’m afraid I can’t see it happening for several reasons:
1) Logistics/Resources. As Nick concedes, resources would be necessary to act as GateKeepers for the project source. Finding trusted gatekeepers with the time and willingness to participate on an on-going basis can be challenging. If there is no compensation involved, and no corporate sponsorship in the form of donated developer time etc, it’s hard to keep a project alive. Even with gatekeepers, EMBT resources would be required, and they don’t seem to have any available cycles, or the benefits do not appear tangible enough to management.
2) Historical adversity to open source
While EMBT may be a different company from Borland, they have many of the same principal people and therefore share a similar perspective concerning open source projects. Based on their closing of the open source PNG project after they integrated the code into Delphi, and the open sourcing of Interbase 6, I would have conclude they view open source as competition, not as an opportunity. Interbase apparently only has one engineer left on the TEAM (is that expression “there is no “i” in TEAM” or “no ‘1′ in TEAM”…hard to tell sometimes). Despite having resource issues, and Interbase accounting for (I believe) a small portion of their revenue, it remains a forked project from the IB6 source code, instead of being built in concert with Firebird. Perhaps that is no longer possible since the fork took place so long ago, but EMBT has not decided to open source the current version of Interbase either. Perhaps they view IB for iOS as a strategic product now.
3) Risking IP
While units of the RTL and VCL are included with some versions of the product, some source units have always been missing AFAIK in order to keep the RTL and VCL from being compilable, and all of that IP (intellectual property) from being “known”.
4) Accepting Constructive Criticism
EMBT is just not that receptive to having staff interact with customers and accept customer code contributions and criticism of EMBT code, policy, or implementations. All you have to do is look at the evolution of FireMonkey, or in QC to see how well EMBT accepts and addresses customer criticisms of either their code, or implementations.
To write tests properly you need to have access to their code and any accompanying documentation. EMBT is not about to open up access to anyone, otherwise DelphiSpeedUp would not be a necessary project, and the issues that Andreas has found and fixed would be immediately incorporated into the product and an official service pack would be released. DelphiSpeedUp would not have to support multiple EMBT product releases with much of the same fixes.
Even open sourcing the IDE would be a good move. There are bugs from eons ago in QC, some of which have been accepted into the internal bug tracking tool, that remain unaddressed. The result is that we have code completion that produces uncompilable code, code navigation that is practically non-existent when compared to other IDEs, and multiple parsers for error insight, code completion etc, stalling the IDE’s main thread. Not to mention all the missing re-factoring capabilities, code templating, clip board management etc that were available in CodeRush in Delphi 3 era, and now are only available in third party enhancements like Castalia, or in half baked form. Why? In part because Borland didn’t work with Mark Miller, the GExperts group and other customers to foster an ecosystem for IDE add-ins. EMBT has continued this tradition and as a result, the IDE has fallen behind, just like DBX did. Perhaps EMBT will buy another editor to try to catch up, but that didn’t work out so well last time.
A new developer’s first impression is the IDE, and it needs a lot of work compared to it’s peers. The IDE is hardly EMBTs core IP, so it’s a natural one to leverage open source with. The community has also shown with SynEdit that it could and would both use and extend such an offering. Open sourcing the IDE would yield a much better result IMHO than anything else, but you don’t see EMBT doing so despite what I would call the success of leveraging the FastCode, and PNG projects, or the efforts of Andreas Hausladen.
5) Open Source is about giving back
To date, EMBT’s usage of open source seems to be about taking what they can get from open source, whether it be using Hudson internally for CI, or PNG, FastCode source code without apparently much in the way of giving back. It still baffles me, that FPC was used in XE2 for iOS support, but I didn’t heard of any EMBT contributions back to the project, and there didn’t seem to be any fan fare in the product press release. I couldn’t find a single reference to FreePascal, just “FireMonkey also enables Delphi XE2 users to create native HD and 3D applications for mobile (iOS) devices”. Apparently a compiler was not necessary for iOS support.
Certainly one of the few contributions I am aware of, as a follower of Delphi, is their recent release of LLDB code. The whole idea of open source is building a synergistic community and that requires contributions from all participants in a constructive fashion.
While progressive companies like Google, and Apple are leveraging open source projects in the commercial offerings while contributing to the evolution of those projects, EMBT still seems to be struggling to determine a strategy to do so. One of the best things about Delphi is its community with the knowledge and experience they possess. So far that has been pretty much untapped by EMBT.
while true do;: ITDevCON 2013 - Call 4 Paper
Behind the connection: Breakpoint not honored while debugging a DLL
Firebird News: GSOC LibreOffice Firebird Integration Weekly Update 07 and driver Dialect is now 3 by default
twm’s blog: dBASE: When an empty string field does not match
Filtering the current table on a field in dBASE is done like this:
set filter to [condition]
So if you want all records where ANUMBER > 10 you just type this command:
set filter to ANUMBER > 10
It’s as easy as this… unless your field ANAME is a character field and you want all records where it isn’t empty. You are probably tempted to use:
set filter to ANAME
""
Oddly enough for my table it did return an empty result, even though I knew there must be records where that field is not empty. After perusing Google (Please stop trying to guess what I am searching for, just search for what I tell you!), giving up and asking a colleague, it turned out the correct filter is this:
set filter to .not. isblank(ANAME)
Or alternatively:
set filter to .not. empty(ANAME)