Lazarus Linux support for FNC webbrowser



Intro

Up until now, the only way to use the TTMSFNCWebBrowser in a Linux environment was through FMXLinux. Today, we can proudly announce official Linux support through Lazarus as well. A couple of FNC products were already working in Linux, but the browser based components, such as the TTMSFNCWebBrowser and the TTMSFNCMaps components (& descendants) were not working. We have been working hard the past months to make our browser based products ready for Linux. With Linux support through Lazarus, we add yet again a new platform to the wide variety of already supported platforms in FNC.

TMS FNC Components can be used simultaneously on these frameworks

  • VCL
  • WEB
  • FMX
  • LCL

TMS FNC Components can be used simultaneously on these operating systems/browsers

  •           

TMS FNC Controls can be used simultaneously on these IDEs

  •    

Getting Started

The components have been tested and deployed on a Linux environment (Ubuntu 20.04) after properly setting up Lazarus and other dependencies required for various parts of FNC.

To setup your Linux environment please execute the following commands

    sudo apt install joe wget p7zip-full curl openssh-server build-essential zlib1g-dev libcurl4-gnutls-dev libncurses5
    sudo apt-get install zlib1g-dev
    sudo apt install libgl1-mesa-glx libglu1-mesa libgtk-3-common libgstreamer1.0-0 libgstreamer-plugins-base1.0-0
    sudo apt install libwebkit2gtk-4.0-dev
    
    Uninstall previously installed FNC packages and rebuild the Lazarus IDE. Remove LIB folders generated in the source directory. During compilation of dependant packages, checksum errors might appear. If this is the case, follow the exact steps below.
    LCLTMSFNCCorePkg.lpk >> Install
    LCLTMSFNCCorePkgDE.lpk >> Install >> Error
    LCLTMSFNCCorePkg.lpk >> Only compile
    LCLTMSFNCCorePkgDE.lpk >> Install >> OK
    LCLTMSFNCMapsPkg.lpk >> Install
    LCLTMSFNCMapsPkgDE.lpk >> Install >> Error
    LCLTMSFNCMapsPkg.lpk>> Only compile
    LCLTMSFNCMapsPkgDE.lpk >> Install >> OK
    Repeat steps 5-8 for other FNC products if necessary

    GTK 3.0

      Note that the TTMSFNCWebBrowser is relying on GTK 3.0 as a minimum. By default Lazarus applications target GTK 2.0. To change this, select “Project Options”, go to “Additions and Overrides”, and change the default “LCLWidgetType” to GTK 3.0
      Start the application to explore the capabilities of the TTMSFNCWebBrowser

      TMS FNC Maps

      Lazarus Linux support for TTMSFNCWebBrowser also means the TMS FNC Maps component set is available. Below is a screenshot of one of the demos in action.

      Stay tuned!

      With Linux support through Lazarus we add yet another major and exciting platform to the already huge amount of platforms FNC has to offer. Stay tuned for more FNC improvements and features coming up in the near future!.

      Read More

      Read More

      Opening an exciting new world full of amazing resources for Delphi developers

      


      Imagine

      Imagine your access to functionally useful
      libraries, components, controls that are hard to find in the Delphi developer
      community suddenly became easily available.

      Visualize

      Visualize you had no more concerns what
      platform or what framework to choose for developing your next solution for your
      customers.

      Dream

      Dream you can start adding seamlessly
      exciting new functionality to your existing applications.

      That is exactly the core goal of the brand
      new WX concept we reveal today with TMS FNC WX Pack. In a nutshell, WX means
      Packaging Web technology in easy-to-use components for integration in any
      type of Delphi application
      “.

      With WX Pack, you can leverage existing Web
      libraries in VCL Windows applications, FMX cross-platform applications for
      Windows, macOS, iOS, Android & Linux, or TMS WEB Core Web applications for
      any device running a modern browser.

       

      How does it work?

      The foundation of the WX concept is our
      powerful TMS FNC Browser component with its accompanying bridge technology. The
      FNC browser wraps the native operating system browser for the VCL, FMX, or LCL
      framework and offers a sort of virtual embedded browser in a TMS WEB Core Web
      application. This FNC browser is used to host a Web library with the choice to
      host it for offline or for online use. You can opt for online use to make the
      component lighter or offline use which means that the component will take up
      somewhat more size in your executable (depending on the component of course)
      but with the guarantee it will run fine without an Internet connection. Thanks
      to the FNC bridge technology, the native application-level component can
      communicate with the browser hosted library and vice versa. As a Delphi
      developer, this is all abstracted and you only deal with it at Object Pascal
      level as a component and its properties, methods, and events.

      Where do we start?

      There is an abundance of existing Web
      libraries, so where to start was the big question. The answer was simply
      listening to you, the user. For quite some time, among the most popular
      requests for new components were a barcode generator component, a QR code
      generating component, an HTML editor, a PDF viewer, …

      And so, that is exactly where we started
      our research and initial development to bring these components as part of the
      WX concept. It enables us to deliver these kinds of components in a fraction of
      the time otherwise needed to build them from the ground up, and it is an
      opportunity to leverage proven, well-tested, and widely popular existing
      libraries.

       

      The first group of components

      In the first beta build of TMS FNC WX Pack,
      we have:

      TTMSFNCWXBarCode
      This components offers close to hundred different barcode types with lots of customization properties for these barcode types.

      TTMSFNCWXQRCode
      Component to generate QR codes of different type and with several customizations like logo in QR code for example

      TTMSFNCWXHTMLMemo
      Edit HTML directly with the 
      TTMSFNCWXHTMLMemo component. It has an optional embedded format toolbar or can be used with external toolbar. Programmatic access to all formatting capabilities is available. Content is loaded and saved directly as HTML.

      TTMSFNCWXPDFViewer

      With this component on the form, you can display PDF files in your applications, including page thumbnails. There is programmatic access to navigate through pages, search text, …

      TTMSFNCWXCamera

      Access your device camera with the TTMSFNCWXCamera component and programmatically take pictures


      Curious?

      Eager to see it in action, check our first video we prepared:


       

      Availability?

      The first beta build is available for all
      TMS ALL-ACCESS users with an active license. You will find this beta build in
      your account, or you can access it from the TMS Subscription Manager. You can
      download this new product now and start tinkering with it.

        

      What’s next?

      With your feedback, this will lead to the
      release of the first version TMS FNC WX Pack (v1.0). It will be available as
      part of TMS ALL-ACCESS, TMS FNC Component Studio, and as a stand-alone product.

      In the meantime, additional components for
      TMS FNC WX Pack are already in development, and we will reveal these shortly.
      But other than this, it will be mostly YOU who will determine the future shape
      & content of the TMS FNC WX Pack
      . If you have the need for specific
      functionality not readily available in the Delphi component offerings but
      easily available for Web developers, let us know and our team will research
      wrapping it into a Delphi component with the WX concept. Leave a comment or
      send us a direct email with your ideas!

       

       

      Read More

      Read More

      TMS FNC Maps v2.1: Introducing OverlayViews

      

      The new TMS FNC Maps update includes support for OverlayViews. This is a heavily improved equivalent of the Marker Labels functionality in TMS VCL WebGMaps and TMS FMX WebGMaps. OverlayViews are a Google Maps API specific functionality and therefore currently only available in TTMSFNCGoogleMaps. OverlayViews can be positioned anywhere on the map and support HTML tags.

      3 ways to use OverlayViews

      1. Connected to a Marker

      The OverlayView is automatically displayed below an existing Marker and functions as a Marker Label. 

      In code, adding a call to AddOverlayView on an existing Marker with the text that goes in to the OverlayView as a parameter value is all that is needed.

      var
        m: TTMSFNCGoogleMapsMarker;
      begin
        TMSFNCGoogleMaps1.BeginUpdate;
      
        m := TTMSFNCGoogleMapsMarker(TMSFNCGoogleMaps1.AddMarker(TMSFNCGoogleMaps1.Options.DefaultLatitude, TMSFNCGoogleMaps1.Options.DefaultLongitude));
        m.AddOverlayView('Hello <font color="red">World</font>!<br>This is an <b>OverlayView</b>.');
      
        TMSFNCGoogleMaps1.EndUpdate;
      
      

      2. Positioned at a fixed Coordinate

      The OverlayView is positioned at a fixed coordinate on the map. The size of the OverlayView remains fixed regardless of the map’s zoom level.

      In code, setting the Latitude and Longitude coordinates will position the OverlayView at that exact location on the map.

      var
        ov: TTMSFNCGoogleMapsOverlayView;
      begin
        TMSFNCGoogleMaps1.BeginUpdate;
      
        ov := TMSFNCGoogleMaps1.AddOverlayView;
        ov.CoordinatePosition := cpCenterCenter;
        ov.Coordinate.Latitude := TMSFNCGoogleMaps1.Options.DefaultLatitude;
        ov.Coordinate.Longitude := TMSFNCGoogleMaps1.Options.DefaultLongitude;
        ov.Padding := 5;
        ov.Width := 500;
      
        ov.Text := '' +
            '<h1 id="firstHeading" class="firstHeading">Uluru</h1>'+
            '<div id="bodyContent">'+
            '<p><b>Uluru</b>, also referred to as <b>Ayers Rock</b>, is a large ' +
            'sandstone rock formation in the southern part of the '+
            'Northern Territory, central Australia. It lies 335 km (208 mi) '+
            'south west of the nearest large town, Alice Springs; 450 km '+
            '(280 mi) by road. Kata Tjuta and Uluru are the two major '+
            'features of the Uluru - Kata Tjuta National Park. Uluru is '+
            'sacred to the Pitjantjatjara and Yankunytjatjara, the '+
            'Aboriginal people of the area. It has many springs, waterholes, '+
            'rock caves and ancient paintings. Uluru is listed as a World '+
            'Heritage Site.</p>'+
            '<img src="https://www.tripsavvy.com/thmb/XHi4Ec428VJFk_bsvNtv6fx5-bE=/2000x1500/filters:fill(auto,1)/GettyImages-675746097-5a8b94a427364afc89f054f71ceda86f.jpg" width="200"></img>' +
            '<p>Attribution: Uluru, <a target="_blank" href="https://en.wikipedia.org/w/index.php?title=Uluru&oldid=297882194">'+
            'https://en.wikipedia.org/w/index.php?title=Uluru</a> '+
            '(last visited June 22, 2021).</p>'+
            '</div>';
      
        TMSFNCGoogleMaps1.EndUpdate;

      3. Positioned between preset Bounds

      The OverlayView is positioned between fixed Bounds coordinates on the map and the size changes depending on the map’s zoom level.

      When the map is zoomed out, the size of the OverlayView image automatically adapts to keep it inside the Bounds coordinates.

      In code, set the OverlayView Mode to omBounds to keep it positioned and sized between the Bounds coordinates.
      In this example an image is used to display a different style of map at that location. To make sure the image fills the entire available space,  it’s width and height must be set to 100%. Optionally the Padding, BackgroundColor, BorderColor and other configuration settings can be added.

      var
        ov: TTMSFNCGoogleMapsOverlayView;
      begin
        TMSFNCGoogleMaps1.BeginUpdate;
      
        ov := TMSFNCGoogleMaps1.AddOverlayView;
        ov.Mode := omBounds;
        ov.Text := '<img src="https://storage.googleapis.com/geo-devrel-public-buckets/newark_nj_1922-661x516.jpeg" style="position:absolute;width:100%;height:100%;">';
        ov.Bounds.NorthEast.Latitude := 40.773941;
        ov.Bounds.NorthEast.Longitude := -74.12544;
        ov.Bounds.SouthWest.Latitude := 40.712216;
        ov.Bounds.SouthWest.Longitude := -74.22655;
        ov.Padding := 0;
        ov.BackgroundColor := gcNull;
        ov.BorderColor := gcNull;
      
        TMSFNCGoogleMaps1.EndUpdate;

      Available now

      The TMS FNC Maps v2.1 update is available now. You can download the latest version and start using the new OverlayViews feature right away!

      Read More

      Read More

      Universal Audio, Waves, AVID, Steinberg – Daily Research Writer

        

      ” Contriver Datum Insights offers a comprehensive study based on research and analysis on the global Audio Plug-in Software Application Market, covering growth prospects, market development potential, profitability, supply and demand, and other important topics. The report presented here stands as a very reliable source of information and data about the global Audio Plug-in Software Application Market. The researchers and analysts who prepared the report have used advanced research methodology and authentic primary and secondary sources of market information and data. Readers have a clear understanding of the current and future status of the Global Audio Plug-in Software Application Market based on revenue, volume, production, trends, technology, innovation, and others. critical factors.
      Free Sample Report + All Related Charts & Charts (Including COVID19 Impact Analysis) @: https://www.contrivedatuminsights.com/request-sample/66093
      Some of the major players in the global audio plug-in software applications market are Universal Audio, Waves, AVID, Steinberg, Apple
      Impact of COVID-19: The Audio Plug-in Software Applications Market report analyzes the impact of Coronavirus (COVID-19) on the Audio Plug-in Software Applications industry. Since the COVID-19 virus outbreak in December 2019, the disease has spread to nearly 180+ countries around the world, with the World Health Organization declaring it a public health emergency. The global impacts of coronavirus disease 2019 (Covid-19) are already starting to be felt and will have a significant impact on the audio plug-in software application market in 2021
      COVID-19 can affect the global economy in 3 main ways: by directly affecting production and demand, by creating supply chain and market disruptions, and by its financial impact on businesses and financial markets.
      By Product Types of Industrial Audio Plug-in Software Market: Market segmentation by type: Windows, iOS, Android,
      By Industrial Audio Plug-in Software Application Market Applications: Market segmentation by application: professional, amateur,
      The report provides a complete and in-depth analysis of the regional segments which cover Global audio plug-in software application market segmented in North America [U.S., Canada, Mexico], Europe [Germany, UK, France, Italy, Rest of Europe], Asia Pacific [China, India, Japan, South Korea, Southeast Asia, Australia, Rest of Asia Pacific], South America [Brazil, Argentina, Rest of Latin America], Middle East and Africa [GCC, North Africa, South Africa, Rest of Middle East and Africa]
      The study was conducted using an objective combination of primary and secondary information, including contributions from key industry participants. The report contains a comprehensive market and vendor landscape in addition to a SWOT analysis of the major vendors.
      Enjoy 20% Off Various Types of Buy It Now Licenses @: https://www.contrivedatuminsights.com/request-discount/66093

      REPORT ATTRIBUTE
      DETAILS

      YEAR OF REFERENCE
      2019

      HISTORICAL YEAR
      2015 – 2019

      FORECAST PERIOD
      2021 – 2028

      COVER OF THE REPORT
      Revenue forecast, company ranking, competitive landscape, growth factors and trends

      GLOBAL MARKET SEGMENTS
      Types, applications, end users

      BEST PLAYERS
      Universal Audio, Waves, AVID, Steinberg, Apple

      BY TYPE
      Market segmentation by type: Windows, iOS, Android,

      BY APPLICATION
      Market segmentation by application: professional, amateur,

      REGIONAL REACH
      North America, Europe, Asia-Pacific, Latin America, Middle East and Africa

      MARKET FORECAST
      Forecast by region, forecast by demand, environmental forecast, impact of COVID-19, geopolitical overview, economic overview of major countries

      MAIN REASONS FOR PURCHASING

      For in-depth market analysis
      Evaluate production processes
      To understand the most touching conduct and restraint
      Market strategies by the main respective organizations.
      Understand the future outlook and market outlook

      Main questions addressed in this global research report:

      What are the demanding industries to drive this global audio plug-in software applications market?
      Who are the main key players and competitors?
      What will be the market size of the global market?
      What are the recent advancements in the global audio plug-in software application market?
      What are the restraints, threats and challenges in the market?
      What are the global opportunities in front of the market?
      How does the digital footprint help expand business structure and economic results?

      Get Research Report Within 48 Hours @: https://www.contrivedatuminsights.com/buy/66093
      Other key aspects of the report indicate that:
      Chapter 1: Research Scope: Product Definition, Type, End Use and Methodology
      Chapter 2: Global Industry Summary
      Chapter 3: Market dynamics
      Chapter 4: Global Market Segmentation by Region, Type and End Use
      Chapter 5: North America Market Segmentation by Region, Type and End Use
      Chapter 6: Europe Market Segmentation by Region, Type and End Use
      Chapter 7: Asia-Pacific Market Segmentation by Region, Type and End Use
      Chapter 8: South America Market Segmentation by Region, Type and End Use
      Chapter 9: Middle East & Africa Market Segmentation by Region, Type and End Use.
      Chapter 10: Market Competition by Firms
      Chapter 11: Market Forecast and Environment Forecast.
      Chapter 12: Industry Summary.
      To note: This content does not contain all the report information, please fill out the form (via a link) and get all the interesting information with one click in PDF with the latest update with chart and table of contents
      Any special requirement for this report, please let us know and we can provide a custom report.
      About Us:
      Contrive Datum Insights (CDI) is a global partner in market intelligence and advisory services to managers in various industries such as investment, telecommunications, information technology, consumer technology, and consumer technology markets. manufacturing. CDI helps investor communities, business leaders and IT professionals make accurate decisions based on technology purchasing statistics and promote strong growth tactics to support market competitiveness. Comprised of a team of over 100 analysts and a cumulative market experience of over 200 years, Contrive Datum Insights ensures the provision of industry knowledge combined with global and national expertise.
      Contact us:
      Anna boyd
      Contrive Datum insights Pvt. Ltd.
      Canada: +19084598372
      Website – www.contrivedatuminsights.com “

      Source link

      Read More

      ARM Yourself

        

      These days as the Pandemic continues to disrupt society, reducing individual rights, many people are buying guns and preparing for the end of days.  Fewer in Canada than the US as the Trudeau government has seen to it that more guns have been banned, even if it makes no sense.  Certainly the future looks darker than ever in terms of the environment, politics and the economy, but this article is not about any of that or about guns.  It’s about ARMs that you can and should buy.
      I bought an Apple M1 Mac mini and the thing is fast! I would highly recommend it as a dev box.  Apple’s M1 has made it perfectly clear that the detractors of the RISC CPU architecture were mistaken. The Power PC processor may have been anemic, but the M1 is not, and after reading Arnaud’s article it’s evident that Apple is not the only player raising the bar in the ARM market.
      CISC is not superior, because the future is in parallel processing with lower power consumption.  RISC dominates mobile and is now poised to take over the server side aka cloud market.  With Apple switching their desktop CPUs to ARM chips and seeing companies like Ampere producing CPUs targeting the server market, I think it might be time to sell Intel and AMD stock.  I think it’s only a matter of time before ARM gains a significant share of the desktop and server markets.  Unfortunately, Ampere does not seem to be public.  Other than Apple, has anyone got some suggestions for good ARM stock?

      Read More

      delphi – How to embed the MIDAS.DLL in the client executable – Stack Overflow

      I hardly use the [WayBack] TClientDataSet Class any more, so every once in a while I bump into a legacy project that does. Often that forgets provide a deployment list, so usually with deployment of the underlying DLL is forgotten. Those moments, it slips my mind that the original name for the underlying DataSnap technology […] … Read More

      Read More

      Summertime DIY project webinar!

      “Learning while having fun”, is what our upcoming webinar is about! In about one hour, you will learn how to build your very own navigation system for your summertime hikes, bicycle tours or old-timer car trips!

      The webinar is planned for Aug 19, 15h00 UTC (17h00 CET)  and you can register here

      A PWA DIY navigation system for your smartphone or tablet

      The DIY navigation system will be built as a PWA (progressive web application) with TMS WEB Core. This means you write the code once and you can install the application on any modern iOS or Android mobile device from an URL. No app stores to get approval from, no delays with deploying updates, all is installed in seconds after open the URL. 

            

      Giving the 1996 Mercedes SLK R170 Youngtimer a Tesla touch with the TMS DIY Navigation system Delphi project

      During the webinar, we will build and explain the application step by step. You’ll learn about using Google Maps, the Openroute directions REST API, access to your device geo-location + orientation and take advantage of the browser speech synthesis to give you directions by voice during the trip.

      Get the entire project will full source code

      Exclusively for all attendees of the webinar we offer at the end of the webinar the full source code. You will receive the source code via the TMS Web Academy during the webinar itself. Yes, we have meanwhile also introduced a couple of new features to the TMS Web Academy that will allow this file distribution live during the webinar!  
      With the full source code, you can further fine-tune the DIY navigation system and add your own cool features to it.

      Requirements

      The DIY navigation system uses only the TMS WEB Core framework latest version either for Delphi, Lazarus or TMS WEB Core for Visual Studio Code. You will be able to build the project even with the trial version. So, if you haven’t tried TMS WEB Core yet, download and install it now in your preferred IDE!

      Read More

      Read More

      Some links on the Delphi VolatileAttribute

        

      Some links, because I had a hard time finding good documentation on VolatileAttribute (which is the name of the type; you use it as [Volatile] on variables, parameters and fields.
      TL;DR

      Volatile
      The volatile attribute is used to mark fields that are subject to change by different threads, so that code generation does not optimize copying the value in a register or another temporary memory location.
      You can use the volatile attribute to mark the following declarations:

      Variables (global and local)
      Parameters
      Fields of a record or a class.

      You cannot use the volatile attribute to mark the following declarations:

      Type
      Procedures, Functions or Methods
      Expressions

      type
      TMyClass = class
      private
      [volatile] FMyVariable: TMyType;
      end;

      Searches

      [WayBack] Delphi “VolatileAttribute” – Google Search (which gives almost no information as VolatileAttriute is only used as [Volatile]).
      [WayBack] Delphi “Volatile attribute” – Google Search (which gives more useful documentation)

      Links

      [WayBack] Owl’s perspective: DelphiのRTLで定義済の属性 (Google translated):

      September 3, 2014

      Attributes defined in Delphi RTL

      This attribute feature is included in the new RTTI added in Delphi 2010, but there are some attributes that are predefined in RTL, although there are differences depending on the Delphi version. However, there is no descriptive description of these predefined attributes in the help. So I examined it (I have not checked out XE6 / XE7 because I do not have it at hand, but I don’t think there is any difference between XE5 and existing one(I also checked Delphi XE6 / XE7 / XE8 / 10 Seattle / 10.1 Berlin).

      System unit

      TCustomAttribute
      [2010..10.3 Rio] Root class of custom attribute To
      define a new attribute, derive from TCustomAttribute
      WeakAttribute [Weak]
      [XE3..10.3 Rio] Indicates a “weak” reference that prevents situations where ARC cannot destroy objects such as circular references
      10 Seattle and earlier NEXTGEN compiler only
      Reference: Compiler attributes-RAD Studio
      reference : Weak references (automatic reference counting with Delphi mobile compiler)
      UnsafeAttribute [Unsafe]
      [XE3..10.3 Rio] Prevents ARC destruction when the reference count is 0, such as when an object is created
      10 Seattle and earlier NEXTGEN compiler only
      Reference: Compiler attributes-RAD Studio
      Reference: Unsafe attribute (Delphi Mobile (Automatic reference counting by the compiler)
      Reference: Delphi language for mobile development (white paper)
      RefAttribute [Ref]
      [XE3..10.3 Rio] Force constant parameter to pass by reference
      According to help, RefAttribute is a new feature of XE4 , but it can actually be used in XE3.
      Reference: Compiler attribute-RAD Studio
      Reference: Constant parameter (Parameter ( Delphi))
      VolatileAttribute [Volatile]
      [XE4..10.3 Rio] Do not perform optimizations that copy values ​​to registers or other temporary memory areas during code generation for fields that may be rewritten by threads
      10 Seattle and earlier NEXTGEN compiler only
      Reference: Compiler attributes-RAD Studio
      Reference: Delphi compiler new attributes (new in Delphi XE4 and C ++ Builder XE4)
      Reference: volatile (compiler attribute)
      StoredAttribute [Stored]
      [XE7..10.3 Rio] See System.Classes.StoredAttribute
      HPPGENAttribute [HPPGEN]
      [XE8..10.3 Rio] It seems to be information used when generating hpp file for C ++ Builder, but details are unknown
      HFAAttribute [HFA]
      [XE8..10.3 Rio]There seems to be information on pageId = 86770118 (what it), but details are unknown ( commented with For internal use only. )Override RTTI HFA information generated for record / array types for ARM64 platforms
      AlignAttribute [Align]
      [10 Seattle..10.3 Rio] It seems to specify the alignment of objects in memory, but there is a comment , For internal use only.

      System.Classes unit

      ComponentPlatformsAttribute [ComponentPlatforms(<params>)]
      [XE2..10.3 Rio] Specify the platform on which the component operates. Specify
      the logical sum of the following constants defined in System.Classes for the parameter (Word value).

      pidWin32 [XE2..10.3 Rio]
      pidWin64 [XE2..10.3 Rio]
      pidOSX32 [XE2..10.3 Rio]
      pidiOSSimulator32 [10.3 Rio], pidiOSSimulator [XE3..10.3 Rio]
      pidAndroid32Arm [10.3 Rio], pidAndroid [XE3..10.3 Rio]
      pidLinux32 [XE3..10.3 Rio]
      pidiOSDevice32 [XE8..10.3 Rio], pidiOSDevice [XE3..10.3 Rio]
      pidLinux64 [XE8..10.3 Rio]
      pidWinNX32 [XE3..10.3 Rio]
      pidWinIoT32 [XE8..10.3 Rio] (“Embedded IoT (Internet of Things) Windows w / Intel Galileo”)
      pidiOSDevice64 [XE8..10.3 Rio]
      pidWinARM32 [10.3 Rio], pidWinARM [10 Seattle..10.2 Tokyo]
      pidOSX64 [10.1 Berlin..10.3 Rio], pidOSXNX64 [10.1 Berlin..10.2 Tokyo]
      pidLinux32Arm [10.1 Berlin..10.3 Rio]
      pidLinux64Arm [10.1 Berlin..10.3 Rio]
      pidAndroid64Arm [10.3 Rio], pidAndroid64 [10.1 Berlin..10.2 Tokyo]
      pidiOSSimulator64 [10.3 Rio]

      TDefaultAttributeBase
      [XE3..10.3 Rio] DefaultAttribute / NoDefaultAttribute inheritance source
      DefaultAttribute [Default(<param>)]
      [XE3..10.3 Rio] The property storage specifier default is equivalent
      to the default value (Boolean type, AnsiChar type, Char type, Integer type, Cardinal type, Int64 type, UInt64 type, String type, Extended type) Any)
      NoDefaultAttribute [NoDefault]
      [XE3..10.3 Rio] Property storage specifier equivalent to nodefault
      StoredAttribute [Stored(<param>)]
      [XE3..XE7] Specify the name of a boolean value (False | True) or storage handler (a method that returns a Boolean value without a Boolean property or parameter) for the specified parameter equivalent to the property storage specifier stored
      (Move to System unit after XE8)
      ObservableMemberAttribute [ObservableMember(<param>)]
      [XE3..10.3 Rio] In LiveBindings compatible component, specify the member name used by LiveBindings component when generating an expression as a parameter

      System.JSON.Serializers unit

      JsonConverterAttribute[JsonConverter<param>]
      [10.3 Rio] Specifying the converter used by TJsonSerializer
      JsonIgnoreAttribute[JsonIgnore]
      [10.3 Rio] Specifying members to be ignored by TJsonSerializer
      JsonNameAttribute[JsonName<param>]
      [10.3 Rio] Explicitly specify key name in TJsonSerializer
      JsonInAttribute[JsonIn]
      [10.3 Rio] When TJsonMemberSerialization.In is specified in the parameter of JsonSerialize attribute, it is serialized / deserialized with TJsonSerializer
      JsonObjectHandlingAttribute[JsonObjectHandling<param>]
      [10.3 Rio] Specify handling of class type members when deserializing with
      TJsonSerializer Specify one of the following values ​​from enumeration type TJsonObjectHandling as a parameter

      Auto [10.2 Tokyo..10.3 Rio]
      Reuse [10.2 Tokyo..10.3 Rio]
      Replace [10.2 Tokyo..10.3 Rio]

      JsonObjectOwnership[JsonObjectOwnership<param>]
      [10.3 Rio] Specify handling of original instance when class type member is generated when deserializing with
      TJsonSerializer Specify one of the following values ​​from enumeration type TJsonObjectOwnership for parameter

      Auto [10.2 Tokyo..10.3 Rio]
      Owned [10.2 Tokyo..10.3 Rio]
      NotOwned [10.2 Tokyo..10.3 Rio]

      JsonSerializeAttribute[JsonSerialize<param>]
      [10.2 Tokyo..10.3 Rio] Specifying the member to be serialized / deserialized with
      TJsonSerializer Specify one of the following values ​​from enumeration type TJsonMemberSerialization for the parameter

      Fields [10.2 Tokyo..10.3 Rio]
      Public [10.2 Tokyo..10.3 Rio]
      In [10.2 Tokyo..10.3 Rio]

      Data.DBXJSONReflectUnit ( REST.JsonReflectreplaced with unit in XE5 )

      JsonReflect [JsonReflect(<params>)]
      [XE..10.3 Rio] TJSONMarshal / TJSONUnMarshal
      parameters for customizing the behavior when marshalling / unmarshalling objects in JSON format include converter type, reverter type, interceptor type, population customizer type, marshalling Specifies whether to automatically release generated intermediate objects
      JSONBooleanAttribute
      [XE..10.3 Rio] Inheritance of JSONMarshalled / JSONOwned
      JSONMarshalled [JSONMarshalled(<param>)]
      [XE..10.3 Rio] Use parameter (False | True) to specify whether the field or type is subject to marshalling / unmarshalling
      JSONOwned [JSONOwned(<param>)]
      [XE..10.3 Rio] Specify with parameter (False | True) whether to release the field during unmarshalling

      Datasnap.DSAuth unit

      TRoleAuth [TRoleAuth(<params>)]
      [XE..10.3 Rio] When authenticating with DataSnap, specify the role to allow / deny access to the server method class and server method Specify
      the list of allowed roles and the list of denied roles as parameters
      Reference: Role (authentication and authorization)

      REST.Json.Types unit

      JSONBooleanAttribute [JSONBoolean]
      [XE6..10.3 Rio] See Data.DBXJSONReflect.JSONBooleanAttribute
      JSONMarshalledAttribute [JSONMarshalled]
      [XE6..10.3 Rio] See Data.DBXJSONReflect.JSONMarshalled
      JSONOwnedAttribute [JSONOwned]
      [XE6..10.3 Rio] See Data.DBXJSONReflect.JSONOwned
      JSONNameAttribute [JSONName]
      [XE6..10.3 Rio]

      REST.JsonReflect unit

      JsonReflect(XE5)/JsonReflectAttribute(XE6以降) [JsonReflect]
      [XE5..10.3 Rio] Refer to Data.DBXJSONReflect.JsonReflect (class name changed in XE6)
      JSONBooleanAttribute [JSONBoolean]
      [XE5] Refer to Data.DBXJSONReflect.JSONBooleanAttribute (Move to REST.Json.Types unit after XE6)
      JSONMarshalled [JSONMarshalled]
      [XE5] Refer to Data.DBXJSONReflect.JSONMarshalled (Move to REST.Json.Types unit after XE6)
      JSONOwned [JSONOwned]
      [XE5] Refer to Data.DBXJSONReflect.JSONOwned (Move to REST.Json.Types unit after XE6)

      EMS.ResourceType unit

      TResourceCustomAttribute [TResourceCustom]
      [10.1 Berlin..10.3 Rio] EndPointRequestSummaryAttribute (10.1 Berlin..10.2 Tokyo) / EndPointRequestParameterAttribute (10.1 Berlin..10.2 Tokyo) / EndPointResponseDetailsAttribute (10.1 Berlin..10.2 Tokyo) / EndPointObjectsYAMLDefinitionsAttribute (10.1 Berlin..10.2 Tokyo) / EndPointObjectsJSONDefinitionsAttribute ( 10.1 Berlin..10.3 Rio) / AllowAnonymousTenantAttribute (10.1 Berlin..10.2 Tokyo) / ResourceNameAttribute (10.3 Rio) / EndPointObjectsYAMLDefinitionsAttribute (10.3 Rio)
      TEndpointCustomAttribute [TEndpointCustom]
      [10.3 Rio] ResourceSuffixAttribute / EndpointNameAttribute / EndPointRequestSummaryAttribute / EndPointRequestParameterAttribute / EndPointResponseDetailsAttribute / AllowAnonymousTenantAttribute / EndPointProduceAttribute / EndPointMethodAttribute inheritance source
      ResourceSuffixAttribute [ResourceSuffix]
      [XE7..10.3 Rio] Specify URL suffix with EMS
      Reference: Overview of EMS resources-RAD Studio
      ResourceNameAttribute [ResourceName]
      [XE7..10.3 Rio] Specify resource name in EMS
      Reference: EMS Resource Overview-RAD Studio
      EndpointNameAttribute [EndpointName]
      [XE7..10.3 Rio] Specify endpoint method name in EMS
      Reference: Overview of EMS resources-RAD Studio
      EndPointRequestSummaryAttribute [EndPointRequestSummary]
      [10.1 Berlin..10.3 Rio] Generate method description on API document with EMS
      Reference: Custom API document-RAD Studio
      EndPointRequestParameterAttribute [EndPointRequestParameter]
      [10.1 Berlin..10.3 Rio] Generate description of parameters used in request in EMS on API document
      Reference: Custom API document-RAD Studio
      EndPointResponseDetailsAttribute [EndPointResponseDetails]
      [10.1 Berlin..10.3 Rio] Generate request response description on API document with EMS
      Reference: Custom API document-RAD Studio
      EndPointObjectsYAMLDefinitionsAttribute [EndPointObjectsYAMLDefinitions]
      [10.1 Berlin..10.3 Rio] Generate YAML version object definition on API document with EMS
      Reference: Custom API document-RAD Studio
      EndPointObjectsJSONDefinitionsAttribute [EndPointObjectsJSONDefinitions]
      [10.1 Berlin..10.3 Rio] Generate JSON object definition on API document with EMS
      Reference: Custom API document-RAD Studio
      AllowAnonymousTenantAttribute [AllowAnonymousTenant]
      [10.2 Tokyo..10.3 Rio] Skip the tenant verification procedure in EMS
      Reference: Sample RAD server Multi-tenant application-RAD Studio
      EndPointProduceAttribute
      [10.3 Rio]
      Reference: RAD Server extension URL mapping-RAD Studio
      EndPointConsumeAttribute
      [10.3 Rio]
      Reference: RAD Server extension URL mapping-RAD Studio

      Macapi.ObjectiveC unit

      MethodNameAttribute [MethodName]
      [XE4..10.3 Rio] Specify the original method name on Objective-C for Objective-C method defined in Delphi

      Androidapi.JNIBridge unit

      JavaSignatureAttribute [JavaSignature]
      [XE5..10.3 Rio] Specify the original class name on Android for Android (JNI) class (interface) defined in Delphi

      System.Win.WinRT unit

      WinRTClassNameAttribute [WinRTClassName]
      [10 Seattle..10.3 Rio] Specify the original class name on WinRT for the WinRT API interface defined in Delphi

      Differences between Delphi versions:

      In Delphi 2010 there are no predefined attributes to use in the system.
      Delphi XE defined TRoleAuth for DataSnap and JSON … for JSON reflection for DBX.
      Delphi XE2 defines ComponentPlatformsAttribute for multi-platform support.
      Delphi XE3 defined WeakAttribute / UnsafeAttribute / RefAttribute for ARC, possibly TDefaultAttributeBase / DefaultAttribute / NoDefaultAttribute / StoredAttribute for the transition from the old RTTI to the new RTTI, and ObservableMemberAttribute for LiveBinding.
      In Delphi XE4, MethodNameAttribute is defined for iOS.
      In Delphi XE5, JSON reflection is separated from DBX, so Data.DBXJSONReflect’s JSON … is redefined in REST.JsonReflect, and JavaSignatureAttribute is defined for Android.
      In Delphi XE6, the class name of REST.JsonReflect.JsonReflect has been changed to REST.JsonReflect.JsonReflectAttribute, and the definition of Json … other than JsonReflectAttribute has been moved from the REST.JsonReflect unit to the REST.Json.Types unit.
      Delphi XE7 moved the StoredAttribute definition from the System.Classes unit to the System unit, and defined ResourceSuffixAttribute / ResourceNameAttribute / EndpointNameAttribute for EMS.
      Delphi XE8 defined HPPGENAttribute and HFAAttribute.
      In Delphi 10 Seattle, AlignAttribute and WinRTClassNameAttribute were defined.
      Delphi 10.1 Berlin now supports the [weak] [unsafe] [volatile] attribute for all compilers (only NEXTGEN compiler before 10 Seattle). In addition , TResourceCustomAttribute / EndPointRequestSummaryAttribute / EndPointRequestParameterAttribute / EndPointResponseDetailsAttribute / EndPointObjectsYAMLDefinitionsAttribute / EndPointObjectsJSONDefinitionsAttribute for custom API document used for EMS API resource acquisition was defined.
      In Delphi 10.2 Tokyo, the System.JSON.Serializers unit was added to define JSON serialization-related Json …, and AllowAnonymousTenantAttribute was defined to support EMS multi-tenancy. The System.JSON.Serializers unit is not officially documented at the moment (2017/04/10), so changes that are unlikely to be written in Lyna ‘s Delphi 10.2 Tokyo docwiki. – Zenryokuwawa , use of TJsonSerializer. – Zenryokuwawa , practical examples of TJsonSerializer – Zenryokuwawa See the per.
      In Delphi 10.3 Rio, the inheritance relationship of attribute classes on the EMS.ResourceTypes unit has been rearranged.

      If you want to specify an attribute for the return value of a method, such as the Unsafe attribute, [Result: <attr>]add a prefix before the method declaration ,

      [Result: Unsafe]function Foo: TObject;

      Like this.
      2015/06/19 update: Added information about Delphi XE6 / XE7 / XE8.
      2015/10/05 update: Added information about Delphi 10 Seattle.
      2016/05/02 postscript: Added information about Delphi 10.1 Berlin.
      2017/04/10 postscript: Added information about Delphi 10.2 Tokyo. I quoted a lot from Lyna . Thank you very much.
      2019/03/07 update: Added information about Delphi 10.3 Rio.

      Category: Delphi 10 Seattle , Delphi 10.1 Berlin , Delphi 10.2 Tokyo , Delphi 10.3 Rio , Delphi 2010 , Delphi Programming Tips , Delphi XE , Delphi XE2 , Delphi XE3 , Delphi XE4 , Delphi XE5 , Delphi XE6 , Delphi XE7 , Delphi XE8 At 15 : 25: 00

      [WayBack] Compiler Attributes: Volatile – RAD Studio Berlin
      [WayBack] Compiler Attributes: Volatile – RAD Studio XE8
      [WayBack] Parameters (Delphi) – RAD Studio Rio (does not mention you can use attributes, bit you can)
      [WayBack] Automatic Reference Counting in Delphi Mobile Compilers: UnsafeAttribute – RAD Studio Rio
      [WayBack] Automatic Reference Counting in Delphi Mobile Compilers: WeakAttribute – RAD Studio Rio
      [WayBack] What’s New: Attributes Supported by All Compilers – RAD Studio Berlin
      Now, all Delphi compilers support the following attributes:

      unsafe
      volatile
      weak

      [WayBack] multithreading – Does Delphi have any equivalent to C’s volatile variable? – Stack Overflow

      Q
      In C and C++ a variable can be marked as volatile, which means the compiler will not optimize it because it may be modified external to the declaring object. Is there an equivalent in Delphi programming? If not a keyword, maybe a work around?
      My thought was to use Absolute, but I wasn’t sure, and that may introduce other side effects.
      A
      According to The Delphi Language for Mobile Development whitepaper, Delphi’s mobile compilers have supported a [volatile] attribute since they were first introduced:
      The volatile attribute is used to mark fields that are subject to change by different threads, so that code generation does not optimize copying the value in a register or another temporary memory location.
      You can use the volatile attribute to mark the following declarations:

      Variables (global and local)
      Parameters
      Fields of a record or a class.

      You cannot use the volatile attribute to mark the following declarations:

      Type
      Procedures, Functions or Methods
      Expressions

      type
      TMyClass = class
      private
      [volatile] FMyVariable: TMyType;
      end;

      Starting with Delphi 10.1 Berlin, the desktop compilers now support [volatile] as well.
      Attributes Supported by All Compilers
      Now, all Delphi compilers support the following attributes:

      unsafe
      volatile
      weak

       

      WhitePaler link above is behind a product registration wall despite the PDF also being available without registration at [WayBack] delphilanguagemobiledevelopmentwhitepaper170413.pdf via [WayBack] White Paper: The Delphi Language for Mobile Development and [WayBack] “The Delphi Language for Mobile Development” – Google Search.

      System.VolatileAttribute

      Delphi

      VolatileAttribute = class(TCustomAttribute);

      Properties

      Type
      Visibility
      Source
      Unit
      Parent

      class
      public
      System.pas
      System
      System

      Description
      TCustomAttribute is the base class for all Delphi attributes.
      System.VolatileAttribute inherits from System.TCustomAttribute. All content below this line refers to System.TCustomAttribute.
      TCustomAttribute is the base class for all Delphi attributes.
      Declare descendants of TCustomAttribute to later use them as attributes in Delphi code. An attribute is a special kind of class that can be annotated to any type or member in Delphi.
      See Also

      System.Rtti.TRttiContext

      Attributes
      TObject Branch

      Code Examples

      AttributesAndRTTI Sample[WayBack] System.VolatileAttribute – RAD Studio API Documentation

      Pointing to [WayBack] RTL.AttributesAndRTTI Sample – RAD Studio Code Examples

      Pointing to a non-existing branch on the defunct open source repository: [WayBack] Page not found – SourceForge.net

      Demos
      Demos now are in either of these:

      [WayBack] GitHub – Embarcadero/RADStudio10.3Demos: Delphi and C++Builder Demos for Embarcadero RAD Studio version 10.3 Rio
      [WayBack] GitHub – Embarcadero/RADStudio10.3.2Demos: Delphi and C++Builder Demos for Embarcadero RAD Studio version 10.3.2 Rio

      Unlike the past sourceforge version control archive, where you could track all the changes over Delphi versions (major, minor and work inbetween), now each major and minor version of Delphi gets a new repository with only a main branch.
      This clearly shows Embarcadero has no clue on version control, and is oblivious of the majority of their sales being upgrades of customers interesting in changes over Delphi versions instead of only the last few commits for the current version.
      –jeroen

      Read More

      Built with XData: HealthLy App for iOS and Android

      A couple of weeks ago I received an awesome e-mail from a customer, Vladimir Atanackovic. We have exchanged e-mails before. As a TMS Business customer, he was using TMS XData and naturally asking for help here and there with technical issues.

      Our previous e-mail conversation was four months before, just a regular support question, but this one was different. He sent a kind e-mail for letting me know that his company has finally released their application, HealthLy, built with TMS XData.

      About HealthLy

      HealthLy is a mobile application, available for iOS and Android, that help users to manage their health life: track health data, provide reminders for taking medicines and injections, monitor health indicators, organize doctor appointments, offer information about drug interactions, etc.

      In this blog post we added some screenshots of the application, but of course you are invited to visit the following links to know more about it, or even download and use it, it never hurts to take better care of your health!

      It was so nice to receive a personal message as a feedback from a customer, and even nicer to see our product, TMS XData, helping to build such a well built, well regarded, professional product like HealthLy (I has received 5 stars in both Apple and Google stores).

      Vladimir shares his experience

      After that, I asked Vladimir if he could share more technical information for the readers of this blog. He kindly agreed, and I sent him some questions. The pace of the “interview” or the questions might look a little strange, but it’s just because all the questions were made in advance without a previous answer.

      If you are a TMS XData user, I hope you will find encouraging to see how many nice things can be built with it. If you are not a TMS XData user, well I can only invite you to join the family! I hope you like what Vladimir has to say about his development process, XData and, of course, HealthLy.

      Wagner Landgraf: Can you please say in a few words for our audience what is your application for? Who can benefit from it?

      Vladimir Atanackovic: Managing all the aspects of health development and history can be a big task. Even more challenging is when a person is struggling with a chronic condition or is helping someone else in that struggle.

      Personalized health management depends heavily on health data analysis and well-organized health-related activities. HealthLy is a health management system and a companion.

      It is encompassing the crucial health improving and monitoring tools together with personal health data to create a platform for individuals, families, and physicians, or pharmacists.

      Two years ago, in order to validate our idea, we created a mobile app Tableta, designed only for a local market and with limited features. Through the organic growth and no marketing money, we have managed to reach 3,000 users and achieve 4.8 stars ratings on both PlayStore and AppStore.

      WL: I see your app has 5 stars score in both App Store and Google Play. Congratulations about that! What do you consider are the strong points of your app and what makes it so appreciated by your customers?

      VA: HealthLy has 5 stars score in both App Store and Google Play and about 50 reviews till now.

      I think the biggest strength of the app itself is precisely the team of people behind HealthLy.

      The team includes professional and good developers, people from the medical profession, as well as from business.

      The application is very intuitive, and we have 2 years of experience with the MVP application Tableta, as well as 20 years of experience of people in the field of medicine, exclusively in working with patients, who are an important part of our team. We strive to create an application that is easy and intuitive to use for patients (of all ages), and which in turn includes the ability to monitor everything related to user health.

      I think that the strength lies in covering all the needs of users in the easiest, fastest and simplest way possible. Of course, we put a lot of energy into the security and stability of the application itself.

      WL: What did you use to develop the frontend and backend of your application?

      VA: As the idea creator, and at the same time an experienced Delphi programmer, it was logical for backend to be developed in Delphi. In addition to decades of experience working with Delphi, I did not work with backend programming before this project, I mainly developed Windows desktop applications.

      Exploring which tool is best and easiest to use for backend development, I came across XData and blown me away by the ease, speed of development, as well as scalability, simply “that was it”.

      The frontend was developed in Kotlin for Android and Swift for iOS. The Delphi community in Serbia is relatively small and this was, somehow, the most logical solution for the front, in order to quickly gather a great team of developers for the frontend.

      WL: What is the architecture of the backend, hardware used, costs…?

      VA: Server is hosted on MS Azure in USA (because application is covering Serbian and US market at the moment, and we are currently planning expansion on EU). We are using XData Console Application, base is FireBird 2.5 (planning 3.0 soon).

      Application is not very demanding thanks to XData performance and server that we are using is Windows Server 2019, 2 cores i 8GB RAM.

      We also used blob fields in the database, but we also save larger files on Azure Blob Storage.

      Backend costs are affordable for now. Once again, XData is a great product that manages data very quickly and well without too much hardware requirements.

      WL: How was the development experience? Was the learning curve steep, what were the main difficulties you had?

      VA: The development experience, in addition to a lot of challenges and new things that needed to be learned, went quite quickly and easily. The challenges were great, switching from desktop applications to cloud based applications is not easy.

      Delphi is something I love and a lot is known, XData just builds on previous knowledge, the challenges were somehow on another field.

      For the first time, I also encountered Google Payment and Apple payment APIs related to subscription applications, etc. Other things were more or less familiar. We also tried to prepare the application for HIPAA compliance, for which we plan to apply in the USA, so we had to study and research there. One of the challenges is the security of the database and data, encryption of the same, because it is also sensitive, health data of users.

      WL: What good surprises, good experience you had during the development?

      VA: Every new thing I learned made me even more interested in the possibilities of the environment itself and the improvement of the application itself. XData is a really great product, very fast to learn, but also very fast and stable to use.

      I also remember one true anecdote during development: when we included one frontend developer in the iOS team, he was looking for something from the server and the GET was so fast that his comment was: it’s coming from a local core data. Then I told him it was not, it came from the server 🙂

      Indeed, most XData functions depend only on the internet flow of the frontend application, and the server is so fast that you often have the impression that it extracts data locally.

      WL: How is the reliability of the solution? Did/do you have any issues with memory consumption, stability, performance…?

      VA: The solution is very stable and there are very little resource requirements. I have followed it a lot and believe me, I execute queries over large tables very quickly with a very small load on memory or processor. Our database contains a complete database of FDA drugs, as well as over 250,000 pharmacies and hospitals in the USA and Serbia with all address data and the codebooks themselves are over 1.2 GB of data, the server is almost “playing” with the data 🙂 We also supported the Cyrillic alphabet for users in Serbia and behaves well there.

      WL: Is the server heavily requested? Are you allowed to share numbers like user base size, and/or number of simultaneous requests, or something like that?

      VA: The server is not heavily requested and I am very enthusiastic about it. As far as user data is concerned, it’s hard for me to say for now, because we are just at the beginning, but we have a constant growth of new users and downloads.

      I can say that we had the most access when we appeared in Serbia on national television and presented the application, then over 1000 users registered in less than 15 minutes and it went very well.

      The application itself in that part is not demanding, you update the therapies, enter examinations, health indicators and sometimes there are a lot of users, and sometimes less at the same time. What is important is that the server works great and XData really solves it perfectly.

      WL: Were you satisfied with the support you received from TMS Software? Was it valuable to have a company behind the product to help you out and guarantee bug fixes? What could be improved in the support?

      VA: Now here to praise you and really you personally, you answered my every question and email very quickly and helped me solve the problems. TMS is a great company and I am a very satisfied user, so I can only say the best.

      WL: Anything else you would like to comment or share to our audience, who are mainly Delphi developers looking about how to bring their applications to the cloud, build mobile solutions?

      VA: A warm recommendation that if you plan to develop applications to the cloud XData is a very good solution for that, it works quickly and reliably. It is easy to learn if you are a Delphi programmer and have experience working with databases.

      Thank you

      I just want to send a big “thank you” to Vladimir for building such nice application and having the time to share his experience with us.

      What about you? Did you find it interesting? Do you also have similar stories to share? Comment below or send us a note, we are eager to know the great things you are building with TMS solutions over there. Let us know!

      Read More

      Read More

      Built with XData: HealthLy App for iOS and Android

      A couple of weeks ago I received an awesome e-mail from a customer, Vladimir Atanackovic. We have exchanged e-mails before. As a TMS Business customer, he was using TMS XData and naturally asking for help here and there with technical issues.

      Our previous e-mail conversation was four months before, just a regular support question, but this one was different. He sent a kind e-mail for letting me know that his company has finally released their application, HealthLy, built with TMS XData.

      About HealthLy

      HealthLy is a mobile application, available for iOS and Android, that help users to manage their health life: track health data, provide reminders for taking medicines and injections, monitor health indicators, organize doctor appointments, offer information about drug interactions, etc.

      In this blog post we added some screenshots of the application, but of course you are invited to visit the following links to know more about it, or even download and use it, it never hurts to take better care of your health!

      It was so nice to receive a personal message as a feedback from a customer, and even nicer to see our product, TMS XData, helping to build such a well built, well regarded, professional product like HealthLy (I has received 5 stars in both Apple and Google stores).

      Vladimir shares his experience

      After that, I asked Vladimir if he could share more technical information for the readers of this blog. He kindly agreed, and I sent him some questions. The pace of the “interview” or the questions might look a little strange, but it’s just because all the questions were made in advance without a previous answer.

      If you are a TMS XData user, I hope you will find encouraging to see how many nice things can be built with it. If you are not a TMS XData user, well I can only invite you to join the family! I hope you like what Vladimir has to say about his development process, XData and, of course, HealthLy.

      Wagner Landgraf: Can you please say in a few words for our audience what is your application for? Who can benefit from it?

      Vladimir Atanackovic: Managing all the aspects of health development and history can be a big task. Even more challenging is when a person is struggling with a chronic condition or is helping someone else in that struggle.

      Personalized health management depends heavily on health data analysis and well-organized health-related activities. HealthLy is a health management system and a companion.

      It is encompassing the crucial health improving and monitoring tools together with personal health data to create a platform for individuals, families, and physicians, or pharmacists.

      Two years ago, in order to validate our idea, we created a mobile app Tableta, designed only for a local market and with limited features. Through the organic growth and no marketing money, we have managed to reach 3,000 users and achieve 4.8 stars ratings on both PlayStore and AppStore.

      WL: I see your app has 5 stars score in both App Store and Google Play. Congratulations about that! What do you consider are the strong points of your app and what makes it so appreciated by your customers?

      VA: HealthLy has 5 stars score in both App Store and Google Play and about 50 reviews till now.

      I think the biggest strength of the app itself is precisely the team of people behind HealthLy.

      The team includes professional and good developers, people from the medical profession, as well as from business.

      The application is very intuitive, and we have 2 years of experience with the MVP application Tableta, as well as 20 years of experience of people in the field of medicine, exclusively in working with patients, who are an important part of our team. We strive to create an application that is easy and intuitive to use for patients (of all ages), and which in turn includes the ability to monitor everything related to user health.

      I think that the strength lies in covering all the needs of users in the easiest, fastest and simplest way possible. Of course, we put a lot of energy into the security and stability of the application itself.

      WL: What did you use to develop the frontend and backend of your application?

      VA: As the idea creator, and at the same time an experienced Delphi programmer, it was logical for backend to be developed in Delphi. In addition to decades of experience working with Delphi, I did not work with backend programming before this project, I mainly developed Windows desktop applications.

      Exploring which tool is best and easiest to use for backend development, I came across XData and blown me away by the ease, speed of development, as well as scalability, simply “that was it”.

      The frontend was developed in Kotlin for Android and Swift for iOS. The Delphi community in Serbia is relatively small and this was, somehow, the most logical solution for the front, in order to quickly gather a great team of developers for the frontend.

      WL: What is the architecture of the backend, hardware used, costs…?

      VA: Server is hosted on MS Azure in USA (because application is covering Serbian and US market at the moment, and we are currently planning expansion on EU). We are using XData Console Application, base is FireBird 2.5 (planning 3.0 soon).

      Application is not very demanding thanks to XData performance and server that we are using is Windows Server 2019, 2 cores i 8GB RAM.

      We also used blob fields in the database, but we also save larger files on Azure Blob Storage.

      Backend costs are affordable for now. Once again, XData is a great product that manages data very quickly and well without too much hardware requirements.

      WL: How was the development experience? Was the learning curve steep, what were the main difficulties you had?

      VA: The development experience, in addition to a lot of challenges and new things that needed to be learned, went quite quickly and easily. The challenges were great, switching from desktop applications to cloud based applications is not easy.

      Delphi is something I love and a lot is known, XData just builds on previous knowledge, the challenges were somehow on another field.

      For the first time, I also encountered Google Payment and Apple payment APIs related to subscription applications, etc. Other things were more or less familiar. We also tried to prepare the application for HIPAA compliance, for which we plan to apply in the USA, so we had to study and research there. One of the challenges is the security of the database and data, encryption of the same, because it is also sensitive, health data of users.

      WL: What good surprises, good experience you had during the development?

      VA: Every new thing I learned made me even more interested in the possibilities of the environment itself and the improvement of the application itself. XData is a really great product, very fast to learn, but also very fast and stable to use.

      I also remember one true anecdote during development: when we included one frontend developer in the iOS team, he was looking for something from the server and the GET was so fast that his comment was: it’s coming from a local core data. Then I told him it was not, it came from the server 🙂

      Indeed, most XData functions depend only on the internet flow of the frontend application, and the server is so fast that you often have the impression that it extracts data locally.

      WL: How is the reliability of the solution? Did/do you have any issues with memory consumption, stability, performance…?

      VA: The solution is very stable and there are very little resource requirements. I have followed it a lot and believe me, I execute queries over large tables very quickly with a very small load on memory or processor. Our database contains a complete database of FDA drugs, as well as over 250,000 pharmacies and hospitals in the USA and Serbia with all address data and the codebooks themselves are over 1.2 GB of data, the server is almost “playing” with the data 🙂 We also supported the Cyrillic alphabet for users in Serbia and behaves well there.

      WL: Is the server heavily requested? Are you allowed to share numbers like user base size, and/or number of simultaneous requests, or something like that?

      VA: The server is not heavily requested and I am very enthusiastic about it. As far as user data is concerned, it’s hard for me to say for now, because we are just at the beginning, but we have a constant growth of new users and downloads.

      I can say that we had the most access when we appeared in Serbia on national television and presented the application, then over 1000 users registered in less than 15 minutes and it went very well.

      The application itself in that part is not demanding, you update the therapies, enter examinations, health indicators and sometimes there are a lot of users, and sometimes less at the same time. What is important is that the server works great and XData really solves it perfectly.

      WL: Were you satisfied with the support you received from TMS Software? Was it valuable to have a company behind the product to help you out and guarantee bug fixes? What could be improved in the support?

      VA: Now here to praise you and really you personally, you answered my every question and email very quickly and helped me solve the problems. TMS is a great company and I am a very satisfied user, so I can only say the best.

      WL: Anything else you would like to comment or share to our audience, who are mainly Delphi developers looking about how to bring their applications to the cloud, build mobile solutions?

      VA: A warm recommendation that if you plan to develop applications to the cloud XData is a very good solution for that, it works quickly and reliably. It is easy to learn if you are a Delphi programmer and have experience working with databases.

      Thank you

      I just want to send a big “thank you” to Vladimir for building such nice application and having the time to share his experience with us.

      What about you? Did you find it interesting? Do you also have similar stories to share? Comment below or send us a note, we are eager to know the great things you are building with TMS solutions over there. Let us know!

      Read More

      Read More

      Separate lists for VCL and FMX in GExperts Rename Components expert

      The Rename Components expert in GExperts now has separate lists for the names and additional properties for VCL and FMX components. Previously it was a hassle to have additional properties shown in the rename dialog if these have different names in VCL vs. FMX e.g. the Caption vs. Text property of TLabel. Now you simply […]Read More

      Read More

      DUnit with FastMM: Detecting memory leaks in individual tests.

      Steps: Add the conditional define FASTMM to your project Ensure you have $(BDS)\source\DUnit\src  in your search path in your project (as otherwise Delphi will pick the pre-built TestFramework.dcu file which was compiled without the FASTMM conditional define) Inside a test method, or the SetUp method of a class, set FailsOnMemoryLeak to True If the SetUp method […] … Read More

      Read More