Recap of RAD Studio 10.2.3 Patches and Information

The replay launch webinar done by the PM team earlier in April is available on YouTube and it is linked at https://community.embarcadero.com/blogs/entry/10-2-3-webinar-replay. You can also browse the community for all of the 10.2.3 related blog posts at https://community.embarcadero.com/blogs/tags/tag/10-2-3 Two two recent patches are: C++Builder 10.2.3 C++ Compiler 4k Stack Allocation Patch at https://cc.embarcadero.com/item/30834 RAD Studio 10.2.3 Context Help Patch at https://cc.embarcadero.com/item/30833 (notice that depending on the browser you used for download, the files might have a wrong permission setting, read the additional information in the download page) I already blogged about these previous patches: RAD Studio 10.2.3 EMS Package Wizard Patch at https://cc.embarcadero.com/item/30832 RAD Studio 10.2.3 Android Push Notification Patch at https://cc.embarcadero.com/item/30831 Finally, you can find on the GetIt package manager IBLite 2017 and IBToGo 2017 as additional downloads.
Read More

TMS announces a new training day: TMS RADical Web Day in Germany

We’re excited to inform we are organizing a new training day: TMS RADical Web Day in Germany.

Learn everything about fascinating new ways to create modern new web development with Delphi!

When you’re a passionate Delphi developer and interested in applying your skills for creating web applications, you cannot miss the TMS RADical Web Day.

On the TMS RADical Web day, you can:

  • Discover how to apply your Delphi knowledge to create high performance web applications.
  • Learn how RAD techniques can be applied to go web with components.
  • Learn how you can integrate existing web frameworks like jQuery.
  • Experience how to use REST services from your web applications.
  • Learn how TMS XData or Embarcadero RAD server data can be used from web apps.
  • Learn how you can now use FNC UI controls not only for VCL, FMX, LCL apps but also for the web.
  • Mingle with fellow Delphi developers.
  • Get a glimpse of the roadmap of future developments under the TMS RADical Web umbrella.
  • Talk in person to the experts from TMS software.
  • Receive a gift with the fully functional trial version of TMS WEB Core, samples and documentation.
  • Get 20% discount for one product of your choice, for your new licenses!

Organization

Sessions are presented by:

  • Bruno Fierens, CTO of tmssoftware.com + Embarcadero MVP
  • Roman Kassebaum, architect tmssoftware.com + Embarcadero MVP
  • Wagner Landgraf, architect tmssoftware.com + product manager TMS Business Subscription
  • Adrian Gallero, architect tmssoftware.com + product manager TMS Flexcel product line
  • Leon Kassebaum, Delphi & TMS WEB Core enthusiast

Location

This extraordinary event will take place at Hotel-Residence Klosterpforte, Klosterhof 2-3, 33428 Harsewinkel-Marienfeld, GERMANY. The location is easily accessible via the A2 motorway.

TMS software has chosen for Hotel-Residence Klosterpforte as it offers an inspiring and peaceful place in the midst of the nature and green to maximize your concentration & creativity. Facilities for hotel rooms at the event are optionally available for attendees.

Registrations

Early bird: 195 EUR (before May 1, 2018)
Regular price: 245 EUR

The registration fee includes a full day access to the sessions and coffee/drinks during this day. A 3 course hot meal is served for lunch.

Seats are limited. Don’t delay your registration and reserve your seat!

Get more information or make your reservation here!

We look forward to see you!

Read More

Read More

Artificial Intelligence Transgender: Kings and Queens

Researching for some Natural Language Processing tasks for a .NET application recently, I've come across Facebook's FastText library. FastText is an open-source, free, lightweight library that allows users to learn text representations and text classifiers. It works on standard, generic hardware. Models can later be reduced in size to even fit on mobile devices. It's written in C++ and builds on
Read More

Improve Android and iOS debug compilation speed – grijjy blog – Set the Debug information option to Limited Debug information

If you develop mobile apps with Delphi, you know it: compiling for Android and iOS is sloooooooooooooow, especially for debug builds. This little tip makes compiling Debug builds much faster…… Set the Debug information option to Limited Debug information When I read a thing like that, I always think “how come I never thought about that before?” Well done Erik! [WayBack] Improve Android and iOS debug compilation speed – grijjy blog via: [WayBack] Here’s a quick tip to improve the compilation speed of debug builds for iOS and Android… – Erik van Bilsen – Google+ –jeroen
Read More

BEAM is Embarcadero’s March Cool App Winner

Woll2Woll’s BEAM (Beacon External Advanced Mapper) is the missing feature for RAD Server’s BeaconFence technology and the March 2018 Winner of our Cool App contest. With RAD Server and BeaconFence it is easy to create an application that accurately tracks indoor location. Using the IDE map layout editor you place beacons on your floor plan, and then your app can accurately track its location through the map.

                                                                       

That is where Woll2Woll’s BEAM technology comes in. It makes it easy to let your end users edit and create their own maps for use with your BeaconFence app. This flexibility makes your apps so much more flexible and powerful. You can build your app around BeaconFence without concern about the specifics of the location where it will be used. Then with BEAM it can be updated to based on beacon placement and the floor plan.

Beyond BeaconFence and FireMonkey BEAM also makes use of Woll2Woll’s amazing FirePower components to round out its user interface. According to Roy Wall of Woll2Woll software, “BEAM uses RAD Studio’s FireMonkey so it is a universal application that shines in both usability and performance . . . with a common codebase it is trivial to add advanced features with a single development team.” The great thing is BEAM is available on iOS, macOS, Windows, and Android, supporting touch input as well as keyboard and mouse. It is in all the major App stores.

 

  

 

BEAM was developed by Roy Woll of Woll2Woll software. You can find more information on Woll2Woll’s website and while you are there check out some of Woll2Woll’s other great products like FirePower.

Watch BEAM in action:

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

 

Interested in submitting for the Embarcadero’s Cool App contest? It’s open to any business or consumer application built with RAD Studio, Delphi or C++Builder. Embarcadero awards Cool App contest winners a $500 Amazon gift card and winning submissions are also highlighted on the company’s YouTube channel. For more information on the contest and a link to the submission form, click here.

Read More

Read More

Disable the Delphi clipboard history; originally by Attila Kovacs at https://plus.google.com/u/0/108426155215159556558/posts/6MBZuMYDTCD

[WayBack] Castalia had a Clipboard History for Delphi since a long time and since the acquisition of it around Delphi XE8, that was [Archive.is] integrated into the IDE for everyone to use as the [WayBack] “Delphi Clipboard History” Some people object to the history viewer, for instance: stability reasons security issues Even though used by a […] … Read More

Read More

2018 ADUG Symposium

2018 Symposium Event Update The Australian Delphi Users Group are hosting the 2018 ADUG Symposium in May Perth – Wednesday 23rd May 2018 Melbourne – Friday 25th May 2018 Click here for Full Details and Registration Presentations Herman Schoenfeld – Sphere 10 Software PascalCoin – an Object Pascal based crypto currency Dave Nottage – Hard Won Battle Scars from Mobile App Development Peter Thönell – OO in Delphi From the ground up.… Continue reading ›
Read More

Upgrade SKU Extended to April 30th

Hello Embarcadero Developer Community!  As you all may know, we made a business decision to "end of life" our Upgrade SKU's on March 31st in an effort to simplify the purchasing process.  The demand to extend this was frankly unexpectedly high.  We listened and decided to extend the Upgrade SKU availability through April 30th.  You do not have to rush and can enjoy the entire Holiday weekend.  We know that with 10.2.3 out, and FMX now part of PRO, many will rush anyway. I personally can't wait to get many, many more Cool Apps...   It is a good time to be a Delphi developer!
Read More

Two Small RAD Studio 10.2.3 Patches

Embarcadero has releases a couple of small and focused patches for the recent RAD Studio, Delphi, and C++Builder 10.2.3 update. The first is an Android Push Notification Patch available as https://cc.embarcadero.com/item/30831. This patch resolves an issue with push notifications on Android due to missing jar files. It fixes the publicly reported issue RSP-20137. The second is fix for RAD Studio 10.2.3 RAD Server (EMS) Package Wizard Patch (and as such it is applicable only to Enterprise customers), available at https://cc.embarcadero.com/item/30832. In 10.2.2 a new RAD Server (EMS) project didn't have support for the Linux and the Win64 platforms by default. While adding it, the new wizard in 10.2.3 automatically adds the Linux target platform to both Delphi and C++Builder projects, even when not installed or not supported (C++Builder), and this causes the IDE to crash when using the wizard. In this case the readme has an incorrect reference to the issue addressed, as it lists the earlier bug resolved in 10.2.3, not the follow up problem addressed by the patch.
Read More

Database and FireDAC Enhancements in RAD Studio 10.2.3

I already blogged about RAD Server changes and RTL fixes in the Delphi, C++ Builder and RAD Studio 10.2.3 update. Another area that has received attention is the database support in general, and FireDAC in particular. Below is a list with some of the most notable improvements, with the Quality Portal entry, if available. FireDAC Improvements FireDAC work was mostly focused at better handling of corner case scenarios, like the management of Null vs. Empty values for ftMemo fields (RSP-19938), a reduction of CPU consumption for idle applications (RSP-19881), a query OpenOrExecute method updating RowsAffected (RSP-19385), better Login Dialog scaling for HiDPI (RSP-16776). The dev team also addressed specific database issues including an issue with Oracle queries with parameters over 1000 characters long (RSP-20057), some general issues in identifying parameters (RSP-19744), issues on DirectExecute with PostreSQL (RSP-19701), a MongoDB access from a Linux Apache Module (RSP-19908), and a MySQL "Data too large for variable" exception on certain string params. A set of improvements relate with FireDAC's BatchMove architecture, including TFDBatchMoveSQLWriter support of NULL value (RSP-19746), OnWriteValue with text BLOBs (RSP-19733) and TFDBatchMoveDataSetWriter with the same data type (RSP-19732), but also RSP-19660 for dmAppendUpdate, reading CVS files on Android and iOS (RSP-19637) DataSnap Fixes Contrary to rumors, we are still actively involved in fixing issues in DataSnap and cleaning up some of the related infrastructure. This release adds the ability for a Datasnap server method on Apache to takes a TJSONObject parameter even if the method name does not start with "update", addresses memory leaks in WebModule.Response.SendResponse (RSP-20063), lack of OnError event on TDSServer (RSP-19661), C++ DataSnap wizard issues (RSP-19444), proxy server problems (RSP-18760), resolved a memory leak in TCP Datasnap server when OnCreateInstance and OnDestroyInstance event are handled and some more. ReFind Update This is a search replace tool helping in code migration, we fixed issues with {$IF CompilerVersion} claused (RSP-20025). The tools is available in our binaries and scripts are in the database section of the demos folder. Conclusion This is all for the database side of things in 10.2.3. Not a lot of feature work, but some good quality improvements, along with the feature work on RAD Server.
Read More

WhereontheMap Honored as Embarcadero Cool App for February

If you’re a parent like I am, you understand the feeling of comfort in knowing where your children are at all times and that they are safe. Modern smartphone technologies have provided parents, spouses and others to track the whereabouts of loved ones, but our Cool App for February, WhereontheMap, has taken that capability to the next level.

WhereontheMap — based on Delphi — is a simple, intuitive Android app that helps you keep an eye on your kids or helps companies support their fleet management systems. One of the cool things the developers of this app did was to use a mix of techniques to reduce power consumption so it doesn’t drain your phone battery like so many apps that run in the background. They utilize the accelerometers sensor which uses the least amount of current to detect motion of the device, and only when it detects motion the app turns on the more accurate localization sensor.

WhereontheMap is a great example of how you can combine some of the turn-key features of Delphi to create a useful app. Click here to download the app on Google Play.

 

                             

This video shows Whereonthemap in action:

[YoutubeButton url=’https://www.youtube.com/watch?v=UM0xjZ7dfeg’]

Interested in submitting for the Embarcadero’s Cool App contest? It’s open to any business or consumer application built with RAD Studio, Delphi or C++Builder. Embarcadero awards Cool App contest winners a $500 Amazon gift card and winning submissions are also highlighted on the company’s YouTube channel. For more information on the contest and a link to the submission form, click here.

Read More

Read More

TMS RADical WEB, custom controls using HTML elements

In a previous blog, it was demonstrated how custom controls for TMS WEB Core could be created using the FNC framework and how easy it was to use FNC code that was written for VCL, FMX or LCL applications also for web applications.
In this article, we want to cover custom controls from an entirely different angle. That means custom controls that are built from a hierarchy of HTML elements. The example via which we want to explain building such custom controls is about a commonly used UI concept in web development, i.e. a login panel. This is where the user enters his username & password to authenticate. So, in this article, we’ll show the details how to make a TMS WEB Core custom UI control that represents such reusable login panel.

In terms of HTML, the login panel consists of an outer DIV element. In this DIV, we put different DIV elements to hold label text to indicate where the username HTML INPUT element is and where the password HTML input element is. Finally, there is a HTML BUTTON used to confirm the actual entry and do a login.

From a TMS WEB Core custom control perspective, this means we will create a Pascal class descending from TCustomControl and we’ll override the CreateElement virtual method. This CreateElement virtual method is what is responsible for returning the hierarchy of HTML elements representing the UI control. In this case, the code for CreateElement is:

function TLoginPanel.CreateElement: TJSElement;
var
  br: TJSElement;
begin
  Result := document.createElement('SPAN');
  FCaption := TJSHTMLElement(document.createElement('DIV'));
  FUserInput := TJSHTMLElement(document.createElement('INPUT'));
  FPasswordInput := TJSHTMLElement(document.createElement('INPUT'));
  FPasswordInput.setAttribute('type','password');
  FUserLabelSpan := TJSHTMLElement(document.createElement('DIV'));
  FPasswordLabelSpan := TJSHTMLElement(document.createElement('DIV'));
  Result.appendChild(FCaption);
  Result.appendChild(FUserLabelSpan);
  Result.appendChild(FUserInput);
  Result.appendChild(FPasswordLabelSpan);
  Result.appendChild(FPasswordInput);
  br := document.createElement('BR');
  Result.appendChild(br);
  FButton := TJSHTMLElement(document.createElement('BUTTON'));
  Result.appendChild(FButton);
  FButton.addEventListener('click', @HandleLoginClick);
end;

Here FCaption, FUserLabelSpan, FUserInput, FPasswordLabelSpan, FPasswordInput and FButton are Pascal references to the HTML elements SPAN, INPUT and BUTTON used in the control.
You can see that the HTML elements are created with document.createElement(). This is almost as if one would do this in Javascript, but via the Pascal to Javascript compiler, you can see the DOM object document can be used as Pascal object.

One more note about the CreateElement method, you can see that the purpose of the last line in the method:
FButton.addEventListener(‘click’, @HandleLoginClick);
is to attach a TLoginPanel method HandleLoginClick to the HTML element ‘onclick’ event handler.
The HandleLoginClick method is declared as

function HandleLoginClick(Event: TJSMouseEvent): Boolean; virtual;

To see how this HTML element event handler is eventually hooked up to trigger the TLoginPanel.OnLogin event, see this code snippet from the TLoginPanel class:

TLoginPanel = class(TCustomControl)
private
    FOnLogin: TNotifyEvent;
    function HandleLoginClick(Event: TJSMouseEvent): Boolean; virtual;
protected
   procedure DoLogin; virtual;
published
    property OnLogin: TNotifyEvent read FOnLogin write FOnLogin;
end;

function TLoginPanel.HandleLoginClick(Event: TJSMouseEvent): Boolean;
begin
  DoLogin;
end;
procedure TLoginPanel.DoLogin;
begin
  if Assigned(OnLogin) then
    OnLogin(Self);
end;

To interface our Pascal class with the HTML elements two more virtual method overrides are important. There is the UpdateElementVisual method and the UpdateElementData method. The purpose of the UpdateElementVisual method is to do changes to HTML element properties that affect the UI control visually. The UpdateElementData method is to do changes with respect to data contained in the HTML elements.
For this TLoginPanel control, we expose a few properties to set captions for labels in the UI control as well as the values of the HTML INPUT elements for username and password.

The properties of the TLoginPanel used for the login panel data are:

TLoginPanel = class(TCustomControl)
published
    property CaptionLabel: string read FCaptionLabel write SetCaptionLabel;
    property LoginLabel: string read FLoginLabel write FLoginLabel;
    property Password: string read GetPassword write SetPassword;
    property PasswordLabel: string read FPasswordLabel write SetPasswordLabel;
    property User: string read GetUser write SetUser;
    property UserLabel: string read FUserLabel write SetUserLabel;
end;

The UpdateElementData method is:

procedure TLoginPanel.UpdateElementData;
begin
  inherited;
  FUserLabelSpan.innerHTML := FUserLabel;
  FPasswordLabelSpan.innerHTML := FPasswordLabel;
  FButton.innerHTML := FLoginLabel;
  FCaption.innerHTML := FCaptionLabel;
  (FUserInput as TJSHTMLInputElement).value := FUser;
  (FPasswordInput as TJSHTMLInputElement).value := FPassword;
end;

To customize the look and feel of the login panel, there is a dual approach. The first and classic Pascal like approach is the basic properties are defined to set the background & border color of the panel and the padding and margin of the controls within the panel. The second approach is that the CSS class can be set for the HTML elements used and that also via CSS full customization of look and feel is possible. This leaves the choice to either stick to classical Delphi style RAD development and do all from the form designer or work with separate CSS and perhaps leave the styling to a graphic designer instead of letting the developer do everything.

The visual properties exposed for the TLoginPanel class are:

TLoginPanel = class(TCustomControl)
published
    property BorderColor: TColor read FBorderColor write SetBorderColor;
    property Color: TColor read FColor write SetColor;
    property ElementClassName: string read FElementClassName write SetElementClassName;
    property ElementCaptionClassName: string read FElementCaptionClassName write SetElementCaptionClassName;
    property ElementInputClassName: string read FElementInputClassName write SetElementInputClassName;
    property ElementButtonClassName: string read FElementButtonClassName write SetElementButtonClassName;
    property ElementLabelClassName: string read FElementLabelClassName write SetElementLabelClassName;
    property Margin: integer read FMargin write SetMargin;
    property Padding: integer read FPadding write SetPadding;
end;

The Element*ClassName properties allow to set CSS class names for the control itself (outer DIV), the SPAN elements for the labels associated with the INPUT elements and of course of also for the HTML INPUT and BUTTON elements.

The UpdateElementVisual override becomes:
procedure TLoginPanel.UpdateElementVisual;
var
  strpadding,strmargin: string;
begin
  inherited;
  if Assigned(ElementHandle) then
  begin
    strpadding := IntToStr(Padding)+'px';
    strmargin := IntToStr(Margin)+'px';
    ElementHandle.setAttribute('class',ElementClassName);
    if (ElementClassName = '') then
    begin
      ElementHandle.style.setProperty('background-Color',ColorToHTML(Color));
      ElementHandle.style.setProperty('border', 'solid 1px '+ColorToHTML(BorderColor));
      ElementHandle.style.setProperty('padding',strPadding);
    end;
    ElementHandle.style.setProperty('display','table');
    FCaption.setAttribute('class',ElementCaptionClassName);
    if (ElementCaptionClassName = '') then
    begin
      FCaption.style.setProperty('margin-top',strMargin);
      FCaption.style.setProperty('margin-bottom',strMargin);
      FCaption.style.setProperty('font-weight','bold');
    end;
    FUserInput.setAttribute('class',ElementInputClassName);
    FPasswordInput.setAttribute('class',ElementInputClassName);
    if (ElementInputClassName = '') then
    begin
      FUserInput.style.setProperty('margin-top',strMargin);
      FUserInput.style.setProperty('margin-bottom',strMargin);
      FPasswordInput.style.setProperty('margin-top',strMargin);
      FPasswordInput.style.setProperty('margin-bottom',strMargin);
    end;
    FUserInput.style.setProperty('width','100%');
    FUserInput.style.setProperty('display','table-cell');
    FPasswordInput.style.setProperty('width','100%');
    FPasswordInput.style.setProperty('display','table-cell');
    FUserLabelSpan.setAttribute('class',ElementLabelClassName);
    FPasswordLabelSpan.setAttribute('class',ElementLabelClassName);
    if (ElementLabelClassName = '') then
    begin
      FUserLabelSpan.style.setProperty('margin-top',strMargin);
      FUserLabelSpan.style.setProperty('margin-bottom',strMargin);
      FPasswordLabelSpan.style.setProperty('margin-top',strMargin);
      FPasswordLabelSpan.style.setProperty('margin-bottom',strMargin);
    end;
    FButton.setAttribute('class',ElementButtonClassName);
    if (ElementButtonClassname = '') then
    begin
      FButton.style.setProperty('margin-top',strMargin);
      FButton.style.setProperty('margin-bottom',strMargin);
    end;
    FButton.style.setProperty('float','right');
  end;
end;

Notice how the properties are set when no CSS class is specified for HTML elements or otherwise the look and feel will be determined by the CSS.

The result becomes:

This is the basic look and feel without CSS.

Now, let’s bring bootstrap CSS and some custom CSS in the game and see the new look and feel.

Bootstrap is introduced with adding

<link rel=”stylesheet” href=”https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css”>

to the project HTML file and in addition we add CSS in the project HTML file <STYLE> section to control the LoginPanel look & feel:

<style>
    .labelcenter {
      text-align: center;
    }
    .loginpanel {
      padding: 15px;
    }
    .loginpanelelement {
      margin-top: 2px;
      margin-bottom: 2px;
    }
</style>

Now the appearance of the panel becomes:

We have only scratched the surface here of the many possibilities to enrich the TMS WEB Core framework with custom UI controls but we hope we have generated interest and enthusiasm.

Get started today: Technical previews of TMS WEB Core, TMS FNC UI web-enabled controls, web-enabled TMS XData, the first parts under the TMS RADical WEB umbrella are exclusively available now for all active TMS-ALL-ACCESS customers.

Read More

Read More