SyncThing for Android

I blogged about SyncThing before, when BitTorrentSync started to annoy the hell out of me. SyncThing is an open source tool for synchronizing directory trees between different devices without requiring a cloud service (it needs a discovery server though in order to actually find these devices). There is also an Android app for it as […]Read More

Read More

Delphi 10.2 Tokyo Godzilla ISO and other download links including hashes

I thought I already posted this, but since hashes were mentioned at [WayBack] Still can’t get Rad Studio 10.2 to install on my laptop. It’ll install now, but then it can’t load several BPLs and then it crashes before the IDE gets … – Phillip Woon – Google+ From [WayBack] cc.embarcadero.com/reg/delphi and [WayBack] Rad Studio Tokyo 10.2 | Board4All: […] … Read More

Read More

Some interesting Delphi posts by Stefan Glienke – Spring4D maintainer

One of the Delphi programmers I keep an eye on is [WayBack] Stefan Glienke, the maintainer of the great Spring4D Delphi framework at spring4d.org. His blog posts come in bursts, though his G+ posts are spreaded a bit more evenly. Some of his recent posts and references: [WayBack] Delphi-PRAXiS – Einzelnen Beitrag anzeigen – Delphi Spring4D: Nullables Via: […] … Read More

Read More

Delphi and Xcode 8.3.x deployment solution

Since Apple updated Xcode to version 8.3.x, iOS IPA deployment is broken with Delphi up to 10.2 (Tokyo). There is an official workaround, which basically instructs to download Xcode 8.2 and use that for now: http://docwiki.embarcadero.com/PlatformStatus/en/Main_Page#iOS_10 Unfortunately though, Apple started sending out notifications, that it won’t accept any builds created…Read More
Read More

Build Healthcare Apps with Delphi and FireMonkey (FMX)

Today Healthcare is one of the hottest areas for Technology innovation. It is globally a $6B opportunity based on startup funding trends, which is a lot, but there is also a $3 Trillion industry to transform!

 

Delphi has a particularly strong presence in Healthcare. There are many, many Healthcare systems that are written in Delphi that service literally million of patients and thousands of providers. From primary care EHRs, Dental Software, all kinds of Radiology Suites, the lists goes on, and this is true across the globe. We have multiple existing integrations with some of the largest EHR systems in the World (Mumps integration anyone?).

 

I believe that there is substantial opportunity to leverage Delphi for Cross-Platform apps in Healthcare. It is an opportunity that is drastically underleveraged. Today, there are very few frameworks that can address this need as well as FireMonkey (FMX) with Delphi. Windows has been a great platform for this with very good security and performance that are critical for healthcare apps. Building HTML5 applications is relatively fast, but disconnected performance is particularly important in Healthcare and security can be stronger with native applications that provide far more encryption options.

 

The biggest opportunity is for highly functional purpose built applications. Traditional EHRs are very complicated, as they cover many use cases and huge ranges of functionality. However, provider’s time is particularly valuable. Building apps that make providers function more efficiently is super important. Optimizing patient flow to reduce waste is similarly important. These apps do not need to do everything, they need to do some things well. Some of you have probably noticed how providers drag these huge workstations around to type their notes… tablets are lighter, but few UX’s hit the mark. Plenty of room for innovation.

The following example is a nice conceptual view of a Doctor’s office registration application. The use case is super simple, yet think of the last times you’ve been in a doctor’s office and you have see things like this. I have been in some of the largest medical institutions in New York, and guess what – paper everywhere. The only place with an app was an Orthopedist that was charging $500 for a finger splinter that costs $5 at the pharmacy and the insurance covered it, but that is a separate story. Let’s build some great apps!

 


[YoutubeButton url=’https://youtu.be/OnbsKX0bM30′]

Read More

Read More

Rapid Prototyping Mobile Projects with Arduino and Open Hardware

These are the slides from my Mobile Dev and Test session on Rapid Prototyping Mobile Projects with Arduino and Open Hardware in San Diego. I’ll update later with links and more resources. slides download (v0.9) SlideShare Visuino Links Main Site – www.visuino.com Documentation – www.visuino.com/wiki Instructables – www.instructables.com/member/BoianM/instructables/ Hackster.IO – www.hackster.io/visuino YouTube – bit.ly/MitovYT Blog – labpacks.blogspot.com
Read More

FMX.Dialogs basically blocks mixing VCL with FMX…

Nice find: Stefan Glienke+4 Look into the initialization block of FMX.Dialogs. The call to ActivateClassGroup(TFmxObject); turns off all the TRegGroups that don’t contain at least one type that inherits from TFmxObject which also happens to be the group that you register your form class to. GetClass then ignores such groups. I don’t have the slightest […] … Read More

Read More

TMS FixInsight and the inline directive

The Delphi compiler allows functions and procedures to be tagged with the inline directive to improve performance. If the function or procedure meets certain criteria, the compiler will insert code directly, rather than generating a call. Embarcadero docwiki gives a list of conditions under which inlining does or does not occur. One of basic conditions says: within a unit, the body for an inline function should be defined before calls to the function are made. TMS FixInsight 2017.04 introduces rule O805 “Inline marked routine comes after its call in the same unit”. Let’s check FMX and VCL code to see if Embarcadero follows their own rules. Short answer: it doesn’t. I will give a couple of examples from Delphi 10.1 Berlin (version 24.0.22858.6822). Vcl.Controls.pas //at line 8529 procedure TWinControl.ReadState(Reader: TReader); begin DisableAlign; try inherited ReadState(Reader); finally EnableAlign; end; FixupTabList; if FParent nil then Perform(CM_PARENTCTL3DCHANGED, 0, 0); UpdateControlState; end; Vcl.Controls.pas //at line 9010 procedure TWinControl.AlignControl(AControl: TControl); var Rect: TRect; begin if not HandleAllocated or (csDestroying in ComponentState) then Exit; if FAlignLevel 0 then Include(FControlState, csAlignmentNeeded) else begin DisableAlign; try Rect := GetClientRect; AlignControls(AControl, Rect); finally Exclude(FControlState, csAlignmentNeeded); EnableAlign; end; end; end; Vcl.Controls.pas //at line 9030 procedure TWinControl.DisableAlign; begin Inc(FAlignLevel); end; TWinControl.DisableAlign is an inline marked procedure. It is called at line 8531 and line 9019, but its body is defined after the calls – at line 9030. Obviously, this function will not be inlined. One more example from another unit: Fmx.ListView.pas //at line 2430 procedure TListViewBase.UpdateDeleteButtonLayout; var RelRect: TRectF; begin if (Adapter.Count < 1) or (FDeleteLayout = nil) or ((FDeleteButtonIndex = -1) and (FPrevDeleteButtonIndex = -1)) then Exit; if (FListingService nil) and (TListingTransitionFeature.DeleteButtonSlide in FListingService.GetTransitionFeatures) then begin FDeleteLayout.Width := DefaultDeleteButtonWidth * FDeleteModeTransitionAlpha; FDeleteButton.Opacity := 1; end else begin if FDeleteModeTransitionAlpha > 0 then FDeleteLayout.Width := DefaultDeleteButtonWidth else FDeleteLayout.Width := 0; FDeleteButton.Opacity := 0.5 + (FDeleteModeTransitionAlpha / 2); end; FDeleteLayout.Height := GetItemHeight(FDeleteButtonIndex); FDeleteLayout.Position.X := Width - FDeleteLayout.Width; if FDeleteButtonIndex = -1 then RelRect := GetItemRelRect(FPrevDeleteButtonIndex, LocalRect) else RelRect := GetItemRelRect(FDeleteButtonIndex, LocalRect); FDeleteLayout.Position.Y := (RelRect.Top + RelRect.Bottom - FDeleteLayout.Height) / 2; end; The method above contains two GetItemRelRect calls (lines 2457 and 2459), but both are before the actual GetItemRelRect body position in that unit (line 2868): Fmx.ListView.pas //at line 2868 function TListViewBase.GetItemRelRect(const Index: Integer; const LocRect: TRectF; const SideSpace: Integer = 0): TRectF; begin Result := RectF(LocRect.Left + FSideSpace + SideSpace, LocRect.Top + FSideSpace + FHeightSums[Index] - FScrollViewPos, LocRect.Width - ((SideSpace + FSideSpace) * 2), GetItemHeight(Index)); if (FScrollBar nil) and (not HasTouchTracking) and FScrollBar.Visible then Result.Right := Result.Right - FScrollBar.Width; end; Despite being declared as inline, this method will not be inlined. It is not a critical issue, but this makes inline directive useless. There are more occurrences of this issue in Vcl.ExtActns.pas, FMX.ASE.Lexer.pas, FMX.Graphics.pas, FMX.Types.pas, FMX.Utils.pas and FMX.ZOrder.Win.pas. This means that inlining conditions are not easy to follow, even though at first glance inline directive seems to be an easy way to slightly optimize your code. TMS FixInsight may help to make inlining more useful by avoiding such mistakes. You can download TMS FixInsight trial and check your own code.
Read More