From the blog

Everything You Need To Modernize With RAD Server

In the modern age isn’t it true to say we are completely surrounded and immersed in technology of diverse forms? Much of it now is entirely cloud-based but there’s still a substantial proportion which employs a mix of both cloud and more physical hardware computing resources. However, the common thread amongst all of these technologies, even the most recent ones, is the certainty of them becoming obsolete. After all, even though all technologies evolve rapidly, they are eventually replaced by something which is either an evolutionary step thanks to advances in technological offerings or because new and more potent ways of providing a service or solving a problem emerge. To save a technology or application from fading into oblivion, its makers consistently upgrade it with new features and prepare it in anticipation of future trends and ways of doing things. As simple as this may seem, such a task can become arduous, especially if the application is complex and has a wider codebase. Additionally, many of the libraries and frameworks on which the application is built can go out of service or are superseded and need updates. To tackle the challenge of upgrading and modernizing an application, robust development studio solutions like RAD Server have powerful methods that streamline the process. Such methods help you gain a sense of the kind of changes you will have to implement. Additionally, they also guide you through the modernization tasks themselves. This article dives into what the modernization journey with RAD Server looks like and why can be essential for applications in the first place. Why Would You Need To Modernize Your Applications? The field of software development has a radically different landscape today to that of even five years ago. Applications now use their hardware resources much more efficiently thanks to advances in operating system abstraction and support. The wide range of programming languages enables you to create applications which perform complex tasks better than before and with optimizations in the code creation process thanks to a maturing of the development industry’s tooling providers and the supporting component eco-system. If your application is to survive in such a landscape, it will have to modernize and offer more than before. When it comes to web applications, advancements in what we have come to expect from a web browser and the rendering scaffolding which supports that have come by making them much more dynamic and robust. Developers can now create web applications at remarkable development velocity and, when done right, the same codebase can work on all kinds of devices thanks to the invention of techniques like adaptive rendering of user interfaces and virtualization of hardware differences to provide a generic API or set of properties and methods which address the lowest common denominator of hardware sensors and functionality . Modularity has also been achieved through microservices, and operations have become as serverless as feasible. The question of security and scalability has also become an integral part of the conversation around application development. With a rise in cybersecurity concerns, applications need to be secure throughout and use the best practices. Additionally, the applications also need to be scalable to accommodate a wider user base and deployment when necessary. Without these abilities, your application can lose its competitive edge and be eventually forgotten. What Is […]

Read More

Static code analysis for Delphi with TMS FixInsight v2021.10

We are pleased to announce the immediate availability of the new TMS FixInsight version v2021.10! Highlights of this new release are: Delphi 11 support Better type resolving Improved & more robust code parser 5 New code analysis rules added The first three highlights are quite obvious, but let’s have a deeper look at the 5 new code analysis rules that have been added and that will enable you to detect possible code issues faster. W537 Format parameter type mismatch The Delphi compiler is not able to check data types used in Format() function. The example below will compile, but will never work properly. FixInsight is able to catch that.  var  StringTypeParameter: string; begin   Result := Format(‘String type parameter value = %d’, [StringTypeParameter]); end; W539  Interface method call passing the same interface reference as out parameter In the example below access violation will be raised because Delphi compiler cleans up Node variable before the actual Node.GetParent() function call.  type    INode = interface   [‘{39EE5CA9-C4C1-46E1-B326-BAA2D004A5CD}’]    function GetParent(out Parent: INode): Boolean; end;  TNode = class(TInterfacedObject, INode) strict private   // INode.    function GetParent(out Parent: INode): Boolean; end; { TNode } function TNode.GetParent(out Parent: INode): Boolean; begin   Parent := TNode.Create;   Result := True; end; procedure InterfaceErrorSample; var   Node: INode; begin   Node := TNode.Create;   // Before calling Node GetParent, the compiler generates code that clears the Node variable   // because the GetParent parameter is declared with the out parameters.   // Thus calling Node.GetParent will result in AV.   while Node.GetParent(Node) do     // Getting root node.   ;   // Do somthing with root node. end; W540 String variable used twice in a call both as an output and an input parameter In the example below Str parameter in IsStringSliceNotEmpty() function will always be an empty string if you pass the same variable twice. Because the variable will be cleaned up by Delphi compiler. function IsStringSliceNotEmpty(const Str: string; out Slice: string; Index, Count: Integer): Boolean; begin   Slice := Copy(Str, Index, Count);   Result := Slice ”; end; procedure StringErrorSample; var   Str: string; begin   Str := ‘qwerty’;   if IsStringSliceNotEmpty(Str, Str, 1, Length(Str)) and (Str[Length(Str)] = ‘y’) then     ShowMessage(Str); // ShowMessage never run because Str was cleared before the SliceString call. end;  W541 Type-casting from Pointer to Integer type (or vice versa) Type casting from Pointer to Integer and Integer to Pointer is often used in legacy code. But it is not safe on some platforms, because types size are differ. For instance, Pointer is 8 byte on x64, and the code below will lead to data loss. procedure TypecastSample(A: Pointer); var   B: Integer; begin   B := Integer(A);   //… end; W542 Direct floating-point comparison There are several not obvious problems with comparing floating-point numbers. They are perfectly explained in DocWiki https://docwiki.embarcadero.com/RADStudio/Sydney/en/Floating-Point_Comparison_Routines In short, you should never use equal sign to compare two floating-point numbers, but rather use special comparison routines. var    X:Single;    Y:Double; begin   X:=0.1;   Y:=0.1;   if X=Y then    Writeln(‘Equal’)   else    Writeln(‘Not equal’);   ReadLn; end. The program outputs: Not equal Get the update & increase the quality of your code! If you have an active license for TMS FixInsight, the update is available for you free. Users with an expired license […]

Read More

Discover the Abstract IP Geolocation API with FNC

Intro You would be amazed to find out how much detailed and accurate information you can retrieve from an IP address. Collecting data based on the IP address can be key to various parts of your business. Want to know where your customers are located during an online meeting? Want to include this technology in your application to gather statistical data and don’t know exactly how to get started? The TTMSFNCCloudIPLocalization component (part of the TMS FNC Cloud Pack) is designed to retrieve detailed and accurate information from an IP address and is capable of doing this via the IP Geolocation API from Abstract. The TTMSFNCCloudIPLocalization component is able to retrieve the following information from an IP address. Country name, code & flag image Region name & code Virtual Private Network (VPN) detection Internet Service Provider (ISP) information Latitude & Longitude Timezone information Getting Started The code snippets below are based on the IP Geolocation API from Abstract to retrieve the information we want to visualize. To get started, you will need to create a free account. After logging in, go to dashboard, select IP Geolocation. The process only takes a couple of seconds, afterwards you can copy the API key which is required to work with the TTMSFNCIPLocalization component. Below you can see the page you get after setting up your account. The above steps is all we need to do get started with the TTMSFNCIPLocalization component. Drop an instance of TTMSFNCIPLocalization on the form. Set the API key and set the service property. (Replace ‘MyAPIKey’ with a valid API key). TMSFNCCloudIPLocalization1.APIKey := ‘MyAPIKey’; TMSFNCCloudIPLocalization1.Service := ipsAbstractAPI; TMSFNCCloudIPLocalization1.OnGetIP := DoGetIP; After assigning the OnGetIP event, add a button with the following code to retrieve your own IP address. TMSFNCCloudIPLocalization1.GetIP; Alternatively, you can also add a custom IP address. This can be done with the following code. (Replace ‘x.x.x.x’ with a valid IP address) TMSFNCCloudIPLocalization1.GetIP(‘x.x.x.x’); After clicking the button, calling the GetIP procedure, the OnGetIP event will be triggered. In this event, we have immediate access to the information retreive from the IP address. Backtracing which IP address was requested can be done via AIP.IPAddress procedure TGetIPDataForm.DoGetIP(Sender: TObject; AIP: TTMSFNCCloudIPLocalizationIP; AError: Boolean; const ARequestResult: TTMSFNCCloudBaseRequestResult); begin //retrieve IP address information via the AIP parameter end; Below is an overview of the properties that are available when using the AIP parameter after the request has finished executing. Demo Included in the distribution is a demo, which shows the capabilities of the TTMSFNCCloudIPLocalization component. Below is a screenshot of the demo in action. Note that the IP address and coordinates have been blurred for privacy reasons. Additional Services The blog post focuses on the IP Geolocation API from Abstract, but the TTMSFNCCloudIPLocalization component is also capable of connecting to the following additional services. The account creation and API retrieval process is different for each service, but the way the component operates remains identical. To select one of the other services, set the Service property to either ipsIPData or ipsIPStack and set the API key for that specific service. IPData IPStack Available Today! The TTMSFNCCloudIPLocalization component is available in the latest update, available today. So go ahead and download the latest version of the TMS FNC Cloud Pack. The TMS FNC Cloud Pack is part of the FNC family, so as a reminder, below is an overview […]

Read More

What Is It Like To Be A Developer Brian Barr?

Hello. This article is part of a series where we speak with professional software developers, ask them what it’s like to write code for a living, and perhaps gain a few insights into the software development industry along the way. Talking to us today we have fellow British Delphi fan Brian Barr. Brian is based in Norfolk, England nestled by the English East Coast which brought back many nostalgic memories to me of driving through the wonderful local countryside since my own late father used to live in that area. Brian has a fascinating background coding Delphi programs for use in the TV and radio industry even before the launch of Delphi 1. His Barrcode application reaches an astounding 50 million listeners and viewers products every week. Thank you for taking part in the interviews Brian! Thanks for the homework! 😂 What would be your brief evening news summary of who you are and what you do? Written Delphi programs for the TV and radio industry before Delphi 1 came out. Started writing in BBC Basic for the BBC Model B. Wrote digital playout systems for the biggest commercial radio stations in the UK. Now writes software for the major TV channels in the UK. How and/or why did you become a developer? I was a radio station engineer working with electronics, I needed to learn programming to write some automation systems to support diversely skilled staff. Do you think you will ever stop being a developer? If so, what would be next? Never Brian is not actually from Florida What made you start using Delphi/C++ Builder? As I recall, I saw Delphi 1 in a magazine. I needed to program on the Windows PC platform and Delphi showed much promise. If you could give some advice to a student who is considering a career as a software developer, what would it be? Research the subject thoroughly. Principles of programming are pretty universal – all languages have an IF statement and various loops. Get used to structuring your code so that when you are old, you can still work out what it does. Tabs… or spaces? Spaces – silly!! Don’t get me started on where the “begin” should be. What’s the best day you ever had as a developer? Too many – getting a major contract for Capital Radio in London – led to many more stations. What’s the worst thing about being a developer? When things go wrong – you feel responsible for the chaos. What’s the coolest development tip you know? When things don’t work – it’s always YOUR fault! Work from home, work from an office, work in an open plan / shared space? What do you prefer and why? Do you get to choose? Work from home. My time is my own, also the freedom to leave the keyboard when my brain aches. Tell us something interesting you think we might not know. Darth Vader IS Luke’s father!! Have you been to Silicon Valley? If so, how was it? If not, have you ever wanted to? Who wouldn’t want to program in the sunshine? Have you ever met any famous/well known tech figures? Who was it? How did it go? Because I was in a radio station, I met many “famous” people. Once was shown round […]

Read More

How To Create A Super-Fast Pusher Notification App

What is Pusher ? Pusher is a set of bidirectional APIs targeted on real time communication. The main use case of those APIs are : Real time charts (cryptocurrency values) Network games (synchronization of players) In app chat (application support) Real time results (basketball, soccer, baseball) Instant geolocation (products to home delivery) What are the main specifications of Pusher ? Pusher is a publish-subscribe messaging system that allows to exchange messages reliably and effectively. Pusher solves by design the problems of : Scale of number of messages and users The real time constraint of messages delivery. Pusher supports the concept of channels. A channel of communication can have 4 different type : Public Private Encrypted Presence What is a Public Channel in Pusher? Public channels should be used for publicly accessible data as they do not require any form of authorisation in order to be subscribed to. What is a Private Channel in Pusher? Private channels should be used when access to the channel needs to be restricted in some way. In order for a user to subscribe to a private channel permission must be authorized. The authentication occurs via a HTTP Request to a configurable authentication url when the subscribe method is called with a private- channel name. What is an Encrypted Channel in Pusher? An encrypted channel is similar to a private channel. However the content of the message is end-to-end encrypted  This encryption follows the specifications of the Secretbox encryption standard defined in NaCl and the message is encrypted before it leaves the server. Only authorized subscribers have access to the channel specific decryption key. This means that nobody except authorized subscribers can read the payload data, not even Pusher. End-to-end encrypted channels also provide end-to-end authenticity; that is your messages are protected from forgery, and that they are guaranteed to come from someone who holds the encryption master key. What is a Pusher Presence Channel? Presence channels build on the security of Private channels and expose the additional feature of an awareness of who is subscribed to that channel. This makes it extremely easy to build chat room and “who’s online” type functionality to your application. How can I integrate Pusher into my Delphi app? The first step is to create an “application” on Pusher.com First of all users need to subscribe to the Pusher network and create an application. Pusher will generate several ids and keys needed to use the Pusher system as follows: With all this data, the developer will be able to interact with the Pusher system. How do I connect to the Pusher network with the TsgcWSAPI_Pusher component of ESEGECE? The low-level communication with Pusher is based on web socket. As a result you can find a Pusher component in the websocket component suite of ESEGECE. You can download the component suite from here. The component installation is done by the compilation the bpl for the Delphi version. There are full instructions and it’s quite easy to do, even for novices. Now, in RAD Studio Delphi, create a new application and drop on the main form the web socket component TsgcWebSocketClient and the Pusher component TsgcWSAPI_Pusher. In the property of the pusher component we will need to set : sgcPusher.Pusher.Cluster := ‘eu’; sgcPusher.Pusher.AppId := myAppid; sgcPusher.Pusher.Key := myKey; sgcPusher.Pusher.Secret := mySecret; sgcPusher.Pusher.TLS := True; […]

Read More

Stay on top of what’s happening in the Delphi world with new webinars in October

The Delphi train is unstoppable. Not only did Embarcadero bring a brand new Delphi 11 with tons of valuable new features, our team also worked around the clock to keep bringing useful add-ons to get even more out of Delphi. Here is your chance to stay on top of this with three webinars we have scheduled in October so far: The Aurelius dictionary : Oct 7, 2021 4h00PM UTC / 18h00 CET Learn more about the brand new TMS Aurelius dictionary feature, and how it will bring even more capabilities to your favorite ORM framework for Delphi. Get compile-time errors, check for dictionary validation and make your database queries even easier to build.In short, a webinar that is not to miss for anyone pondering about adding ORM technology to existing applications or get even more out of Aurelius based applications! Your host is Wagner Landgraf, the architect and product manager for TMS Aurelius. Register here now! The new WX pack, new territories open for your Delphi apps : Oct 12, 2021 3h00PM UTC / 17h00 CET WX Pack controls bring a brand new approach to leverage existing non-trivial and complex components and libraries for Delphi VCL Windows applications, cross-platform FireMonkey applications or web client apps. Among the first such components in WX Pack will be: PDF viewer, QR code generator, barcode generator, text to speech, OCR, JSON viewer, …  Learn about the architecture of the new WX controls and see how these are universal and work in VCL, FMX, LCL or WEB Core apps. See the first WX controls in action. We will show also new WX controls in development, what further WX controls we have on our radar and we listen to your questions and inputs, suggestions for more WX controls. Your host is Bruno Fierens, CTO of tmssoftware.com.  Register here now! Miletus brings creating Raspberry Pi apps from your Delphi IDE : Oct 19, 2021 3h00PM UTC / 17h00 CET Miletus technology now also enables you to create applications running directly on the Raspberry Pi SBC. And this all directly from the Delphi IDE. And of course, from the Miletus application, you can control various hardware accessories via the i²c, SPI or UART on the Raspberry Pi. Discover how Miletus will empower you to bring Raspberry Pi apps from the Delphi IDE in this webinar!  Your host is Bruno Fierens, CTO of tmssoftware.com.  Register here now! TMS WEB Academy All webinars will be brought to you via the TMS WEB Academy. Our TMS WEB Academy is our platform, fully created with TMS WEB Core to host webinars for you. During the webinars, interaction is encouraged, you can ask questions via messages or directly spoken and when extra resources are coupled with the webinar content, these will also be live shared during the webinar.

Read More

Miletus brings Raspberry Pi target in Delphi

Last week, we showed a first glimpse in our lab where we demonstrated building a Raspberry Pi application from the Delphi IDE using Miletus. Today, we have a closer look at some of the new components as well as an extra video. Creating a new Miletus Raspberry Pi app From the IDE, simply select TMS WEB Miletus Application: Now, in the project manager, under build targets, you see all the build targets Miletus offers. And there you have Raspberry Pi debug and release new targets.  With this Miletus project created and the Raspberry Pi target selected, you are ready to create your first Miletus application. XCOPY deployment When you compile the Miletus for Raspberry Pi project from the Delphi IDE, you’ll find the generated application and Raspberry Pi OS desktop shortcut link file in the output folder. Just XCOPY these 2 files to your Raspberry Pi with the Raspberry Pi OS and run the application. There is possibly just one extra step needed to prepare your Raspberry Pi to run the app and that is: sudo apt install libwebkit2gtk-4.0-dev New components While the entire array of TMS WEB Core components and TMS FNC Components is available to build a Miletus Raspberry Pi app, the Raspberry Pi target introduces three new components to access hardware attached to your Raspberry Pi SBC: You see here: TMiletusRaspberryI2C : read and write via the i²c ports to various sensors or other devices TMiletusRaspberrySPI : read and write via the SPI port to various hardware extensions using the SPI port TMiletusRaspberryUART : read and write from the UART to devices connected to the Raspberry Pi I²C I²C is a standard 2 wire protocol to communicate with devices. The Raspberry Pi offers out of the box two I²C interfaces. There is SCLK and SDA signal, i.e. the clock signal and the data signal that is open-collector based input / output. Communicating over I²C works via sending first an 8bit address and read or write bit over the SDA signal and then either write or read data bits. We exposed this in the TMiletusRaspberryI2C component via methods: TMiletusRaspberryI2C.Open; TMiletusRaspberryI2C.Close; TMiletusRaspberryI2C.ReadByte(Address:byte): TJSPromise; TMiletusRaspberryI2C.ReadSmallInt(Address:byte): TJSPromise; TMiletusRaspberryI2C.ReadBuffer(Address:byte, Size: integer): TJSPromise; Yes, you can see that the response of the read instruction is a promise as the read methods are asynchronous. Thanks to the promise based approach, we can still write sequential code to deal with reading and writing over I²C.   To write data, six methods exist TMiletusRaspberryI2C.WriteByte(Address: byte; AData: byte); TMiletusRaspberryI2C.WriteByteP(Address: byte; AData: byte): TJSPromise; TMiletusRaspberryI2C1.WriteAddress(Address: byte); TMiletusRaspberryI2C1.WriteAddressP(Address: byte): TJSPromise; TMiletusRaspberryI2C1.WriteBuffer(AData: Array of byte; ASize: integer); TMiletusRaspberryI2C1.WriteBufferP(AData: Array of byte; ASize: integer): TJSPromise As you can see, you can write a byte to some specific address or write an address followed by a buffer of data. The methods are all asynchronous and a promise based variant exists to allow to create sequential code. This code snippet shows how to write two register values from an I²C device in a sequential way thanks to await()   ac1 := await(Integer, MiletusRaspberryI2C1.ReadSmallInt($AA));   ac2 := await(Integer, MiletusRaspberryI2C1.ReadSmallInt($AC)); SPI The SPI protocol (Serial peripheral interface) uses a 3-wire connection, a clock and the data-in and data-out signal. Other than this, it is similar to I²C, meaning, it also uses an address and reads and writes data serialized over this 2 data wires. The methods for […]

Read More

The 5 Best Reasons Why Security First Is A Good Idea

Balancing data privacy and security with user experience is one of the most complex tasks for software developers.  Many projects have higher priority for business functionality and security-related tasks are lower priority which leads to an insecure system. Here are some reasons why putting security to the forefront of our designs and development are essential. The security by design methodology should be enforced in the product design and development stages to make more secure and reliable software. Rather than applying security at the final stages of the software, it is better to start the project with security awareness. Finding the issues related to the security of the project at the final stage of the development process might force the development team to expend further unplanned time to re-architecture or make dozens of changes.  One of the problems with poor security design on software is the exposure of sensitive data. For instance, the simple scenario is that the user enters his/her account and clicks an image to download it. What if that link is available to others and there is no authentication or resource protection? Something as simple as a compromised linking strategy can be difficult to fix after the fact and could eventually lead to a steep drop-off in user confidence and corresponding plummet in adoption of your app or service. When talking about security by design we need to define several terms. Classic information security usually includes confidentiality, integrity, and availability. Keeping information secret that should not be made known to the public. For instance, your healthcare record – Confidentiality When your information is safe and does not change by any third party, this is Integrity. For instance, votes for election. Availability implies that the information is at hand on time. For example, when there is a call for a hospital, they need to know the location and the address immediately. All 3 factors are mandatory if you are concerned about security by design in your project. Moreover, in recent years many governments and legal bodies have introduced rules which require traceability of data use, access and dissemination. This features in laws such as the European GDPR regulations. Traceability is another factor we must consider to ensure that if the data is accessed, that connection should be traceable. Security by design starts from the approaches that you do with your code. If you ask five developers to design software, you will get five different answers. But only a few of them ask how the objects interact with each other and how the system should be protected.  To create better software you should care about: Design patterns System architecture Activities and connection of classes Even writing if statement or utilizing for loop security These all qualify as part of the software design process. In the traditional software development process, security should be a top priority when developing and write code. So, everyone involved in the process should be trained and experienced in software security. At the very least developers need to know about the cross-site scripting attacks, vulnerabilities in low-level protocols, and the OWASP Top 10. By being aware of these, developers approach the development process differently, for example, they start to care about input sanitization, security configurations, or outdated components in their toolset. Dozens of tools and services are available that protects your entire […]

Read More

5 Ultimate Ways To Modernize Your Apps For Windows 11

Delphi offers a modern, robust & enterprise-grade UI developer environment with Visual Component Library (VCL) for Windows only and FireMonkey (FMX) for cross-platform development. Delphi VCL offers the latest features and modern UI controls for your Windows app development.  Moreover, you can enjoy the native performance in your Delphi app, and accessing to hardware and latest features of Windows is quick with Delphi. In this article, we try to point out five main ways to modernize your apps for Windows 11. Users love when they can easily find what information the app is gathering and easy-to-understand privacy-policy notices. So, informing about all this and giving access to enable or disable telemetry settings is always welcome. The comprehensive design forms a more reliable product and environment for everyone. For instance, if your app is consists of lots of text content, it is more salutary to add an assistive screen reader that is also satisfactory for people with disabilities. Describe the UI controls or menus with beautiful and simple animations. Make your app scalable and responsive as much as you can. Provide font size changing option. Because you never know how your app represents in different sized screens. If your app welcome screen shows different information with several frames, make sure to give the option to redesign the frames. Delphi 11 IDE gives access to alter the layout On Windows 11, you can see most of the icons are updated with shiny and coherent icons. Besides, the new UI font called Segoe UI Variable makes the typography of your app more readable and softer. Src: Windows Docs Delphi VCL provides modern Windows UI controls with native performance.  By bringing beautiful and modern UI controls, your app looks shiny and up-to-date with Windows 11. Since Windows 11 itself has so many UI innovations, your app needs compatible with it! In addition to that, using lightweight and scalable animation in your app can increase user experience. Because everyone loves beautiful things. One of the popular ways of adding animations to the applications is using Lottie animation files.  Do you know how to add Lottie animation files to your Delphi app? Well, it is easy because of community contribution to the Delphi development ecosystem! Skia4Delphi is a cross-platform 2D graphics API for Delphi platforms based on Google’s Skia Graphics Library. Here you can watch the Desktop First session about Lottie and SVG in Delphi by Jim McKeeth Windows 11 introduced a wide array of UI elements and rounded corners to the desktop operating system. The usual sharp edges are now rounded and smooth corners which gives another feeling about desktop apps.  As you utilize Windows 11, the rounded corners on every UI control look great in both dark and light modes.  Here you can learn how to controls Windows 11 rounded corners with code: Delphi VCL has exceptional options to make your app look modern with VCL Styles. With dozens of different and unique styles, you can create modern-looking Windows apps in seconds by just applying styles.  How to design Fluent apps in Delphi – Acrylic material design? If you want to build your app by applying the Fluent design system, you can easily achieve it with the StyleControls VCL package. StyleControls VCL package uses classic drawing, system themes, GDI+, and VCL styles to make unique user interfaces. In recent years, we can see that some apps are designed for touchscreen mode also. For instance, when I use my 2-in-1 laptops, you need bigger […]

Read More

Quadruple your number of components for TMS WEB Core on Windows, macOS or Linux

Background One of the many reasons to develop TMS WEB Core for Visual Studio Code was that you could use this highly popular development environment directly on your favorite desktop Windows, macOS or Linux system. And this without any virtualization software! With this mission accomplished, a next goal was to bring our wide portfolio of TMS WEB Core enabled FNC components to TMS WEB Core for Visual Studio Code on any of these platforms.  The entire range of TMS FNC Components was already for some time available for Delphi developers on the Windows operating system. That means, when you have TMS WEB Core installed in the IDE and you install any of the TMS FNC Components using its installer, these components also become automatically available for use in TMS WEB Core web client applications or Miletus desktop applications.  Now, with TMS WEB Core for Visual Studio Code running on a macOS or Linux machine, this was somewhat more problematic. Our FNC component installer is an executable designed for Windows that does not work out of the box for macOS or Linux. Enthusiast TMS WEB Core for Visual Studio Code users did the cumbersome extra effort to find a Windows machine, install it there and then manually move over the files and install in Visual Studio Code. A new easy way to install FNC components But from today, this inconvenience is all a thing of the past! We’re pleased to announced that the full portfolio of TMS FNC Products is now also available both for trial and registered versions as simple ZIP file distributions that can be used from any desktop operating system. Simply unpack, pick from Visual Studio Code the folder where the ZIP file was extracted and pick the package to install it in the IDE. Done! Our colleague and evangelist Holger Flick has it for you all explained and demonstrated in the video he created especially for this: What do you get today? From today, you can easily install following FNC component as trial version or as registered version in TMS WEB Core for Visual Studio Code: TMS FNC Chart : business, statistical, financial & scientific data TMS FNC Dashboard Pack : dashboard UI controls TMS FNC Maps : the world of mapping services, directions, geolocation, … in your hands TMS FNC UI Pack : sophisticated UI controls including grid, planner, ribbon, treeview, navigation, … And it doesn’t end there! You have most likely seen the announcement of our new WX technology that encapsulates web technology for any type of Delphi application or TMS WEB Core application. Our upcoming TMS FNC WX Pack is also already enabled for easy install in TMS WEB Core for Visual Studio Code.  And on top of this, in the future we want to make it even easier than this as we are researching right now to use the Microsoft Visual Studio Code Market Place for FNC component distribution. With this in-place, you’ll have the ultimate experience, that is: an IDE that takes care itself of always keeping your components automatically up-to-date.  Stay tuned! There is a lot more in the pipeline and never-seen-before developments we will soon unveil.

Read More