Noutați

Learn How To Use FireDAC In The Dynamic-Link Libraries With DLL Sharing Sample In Delphi

To this end, the sample uses the CliHandle and SharedCliHandle properties of the TFDConnection class. Location You can find the DLLSharing sample project at: Start | Programs | Embarcadero RAD Studio Sydney | Samples and then navigate to: Object PascalDatabaseFireDACSamplesComp LayerTFDConnectionDLL_Sharing Subversion Repository: You can find Delphi code samples in GitHub Repositories. Search by name into the samples repositories according to your RAD Studio version. How to Use the Sample Navigate to the location given above and open Project1.dproj. Press F9 or choose Run > Run. Files File in Delphi Contains Project1.dprojProject1.dpr The project itself. Unit1.pasUnit1.fmx The main form. Project2.dprojProject2.dpr The DLL. Unit2.pasUnit2.fmx The DLL form. Implementation The sample uses FireDAC to implement a connection with a dynamic-link library. To this end, the sample implements three buttons named: Button1, Button2 and Button3. Each button handles a OnClick event to implement the following features: Load a DLL Show data Unload the DLL Load DLL To transfer a connection between an application and a DLL, the sample transfers the TFDCustomConnection.CliHandle property value to the DLL. The handle must be assigned to the TFDCustomConnection.SharedCliHandle property. After the TFDCustomConnection.SharedCliHandle is assigned, the DLL connection can be activated by setting the Connected property to True. Note that there is no need to set up a connection definition, including DriverID. // Application code: FhDll: THandle; // … procedure TForm1.Button1Click(Sender: TObject); begin FhDll := LoadLibrary(PChar(‘Project2.dll’)); @FpShowData := GetProcAddress(FhDll, PChar(‘ShowData’)); end // DLL code: class procedure TForm2.ShowData(ACliHandle: Pointer); var oForm: TForm2; begin oForm := TForm2.Create(Application); oForm.FDConnection1.SharedCliHandle := ACliHandle; oForm.FDConnection1.Connected := True; oForm.FDQuery1.Active := True; oForm.Show; end; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20   // Application code:   FhDll: THandle;   // …   procedure TForm1.Button1Click(Sender: TObject);   begin     FhDll := LoadLibrary(PChar(‘Project2.dll’));     @FpShowData := GetProcAddress(FhDll, PChar(‘ShowData’));   end   // DLL code:   class procedure TForm2.ShowData(ACliHandle: Pointer);   var     oForm: TForm2;   begin     oForm := TForm2.Create(Application);     oForm.FDConnection1.SharedCliHandle := ACliHandle;     oForm.FDConnection1.Connected := True;     oForm.FDQuery1.Active := True;     oForm.Show;   end; Show data Then, the connection can be used as a normal database connection: TShowDataProc = procedure (ACliHandle: Pointer); stdcall; // … FpShowData: TShowDataProc; // … procedure TForm1.Button3Click(Sender: TObject); begin FpShowData(FDConnection1.CliHandle); end   TShowDataProc = procedure (ACliHandle: Pointer); stdcall;   // …   FpShowData: TShowDataProc;   // …   procedure TForm1.Button3Click(Sender: TObject);   begin     FpShowData(FDConnection1.CliHandle);   end Unload DLL To unload the dynimic-link library, the sample implements the following code: TShutdownProc = procedure; stdcall; // … FpShutdown: TShutdownProc; // … procedure TForm1.Button2Click(Sender: TObject); begin FpShutdown(); FreeLibrary(FhDll); end;   TShutdownProc = procedure; stdcall;   // …   FpShutdown: TShutdownProc;   // …   procedure TForm1.Button2Click(Sender: TObject);   begin     FpShutdown();     FreeLibrary(FhDll);   end; Head over and check out the full sample source code for DLL sharing with FireDAC in Delphi.

Read More

Learn To Build A Python GUI For Working with HTTP Requests With Requests Library In A Delphi Windows App

Python for Delphi (Python4Delphi , P4D) with Requests library allow you to execute Http requests in Python GUI for Windows. Python4Delphi is a free tool that can run Python scripts, work with new Python types and modules in Delphi. In this post, we will learn at how to run Requests library in Python for Delphi. Build your own Python GUI apps for Windows with Delphi and C++Builder and Python4Delphi using various Python libraries. Open and run project Demo1, then select Python script that you want execute in Python for Delphi. Use text fields for inserting Python script and for viewing results. Click Execute button for running Python script. Go to GitHub and download Demo1 source. procedure TForm1.Button1Click(Sender: TObject); begin PythonEngine1.ExecStrings( Memo1.Lines ); end; procedure TForm1.Button1Click(Sender: TObject); begin PythonEngine1.ExecStrings( Memo1.Lines ); end; Requests is a simple Python library that allows you to execute standard HTTP requests. Using this library, you can pass parameters to requests, add headers, receive and process responses, execute authenticated requests. Let’s look at some examples. Make GET Request It is very easy to call GET request. Just use method get() and pass URL to this method. From response object you can get a lot of useful information. This example shows how to get content, status and list of response headers. You also can get other properties. import requests r = requests.get(‘https://example.com’) print(r.text) print(r.headers) print(r.status_code) import requests r = requests.get(‘https://example.com’) print(r.text) print(r.headers) print(r.status_code) POST Request with payload and timeout With Requests library, you can perform post requests by calling post() method. It is also possible to pass input data to the parameter payload. Different types of input data are possible. For example, dictionaries, tuples, lists import requests payload1 = {‘key1’: ‘value1’, ‘key2’: ‘value2’} r = requests.post(“https://httpbin.org/post”, data=payload1) print(r.text) payload2 = [(‘key1’, ‘value1’), (‘key1’, ‘value2’)] r1 = requests.post(‘https://httpbin.org/post’, data=payload2) print(r1.text) payload3 = {‘key1’: [‘value1’, ‘value2’]} r2 = requests.post(‘https://httpbin.org/post’, data=payload3) print(r2.text) import requests payload1 = {‘key1’: ‘value1’, ‘key2’: ‘value2’} r = requests.post(“https://httpbin.org/post”, data=payload1) print(r.text)   payload2 = [(‘key1’, ‘value1’), (‘key1’, ‘value2’)] r1 = requests.post(‘https://httpbin.org/post’, data=payload2) print(r1.text)   payload3 = {‘key1’: [‘value1’, ‘value2’]} r2 = requests.post(‘https://httpbin.org/post’, data=payload3) print(r2.text) Authenticated Request In this example we will take a look at how to execute authenticated requests. It is very easy, just pass the username and the password in the auth parameter. If authorization is successful, then we will receive a response status code 200, otherwise there should be non-authorization error 404. import requests from getpass import getpass r=requests.get(‘https://test.org’, auth=(‘username’, getpass())) print(r.status_code) import requests from getpass import getpass r=requests.get(‘https://test.org’, auth=(‘username’, getpass())) print(r.status_code) Check out the Requests library for Python a use it in your own projects. Check out Python4Delphi which can build Python GUIs for Windows using Delphi.

Read More

Sencha News: November Edition

  [Blog] From the General Manager’s Desk 2020 is nearly through, and what a year it’s been! Get a look into the mind of our General Manager, Kegan Blumenthal, with our latest blog as he takes a look back at what’s new and what’s next for Sencha for the remainder of the year. There’s still plenty of surprises in store that we wouldn’t want you to miss—so be sure to give this GM update a read! [Read the Blog]   [Webinar On-Demand] Analyzing Ext JS Apps with Chrome Performance Tools Even the best-built application is bound to experience the occasional dip in performance—if you’ve ever clicked a button or selected a row in a grid in an Ext JS app, only for it to take longer than desired for the action to complete, you know what we’re talking about. Fortunately, Chrome developer tools enable devs to diagnose what’s hindering their application’s performance—and we’re here to show you how to utilize them. Sencha product expert Marc Gusmano provided an in-depth look at the performance panel and how you can apply this tool to your own application—check it out! [Watch On-Demand]   [Product Release] Blazing Fast Web App Development for ASP.NET—Ext.NET Has Arrived Building great looking and blazing fast web apps with ASP.NET Core technology and Ext JS has never been easier! Our team is excited to introduce Sencha Ext.NET—an advanced ASP.NET Core UI framework that incorporates the powerful component library for efficient and scalable web & mobile app development. If you’re an ASP.NET dev, Ext.NET is the perfect choice for your app development: Drop-and-go components Cross-browser & Cross-platform support Simplified client-to-server communication Flexible layout manager and responsive config system Out-of-the-box modern themes And so much more! Learn everything there is to know about the latest addition to our Sencha product suite by checking out the release blog: [Read the Release Blog]   [Webinar On-Demand] How and When to Use Trees in Your Ext JS App Trees are an essential component for Ext JS developers to utilize when showing grouped, hierarchical, and drill-down data—and we want to enable you to do just that. Sencha product expert Max Rahder returned by popular demand to host a live demonstration where Ext JS devs learned to configure trees, organize and detch tree data, update and manipulate tree nodes, use tree plugins, and more for both the modern and classic toolkits. The whole presentation is available to view at your leisure—check it out! [Watch On-Demand]   [Free Guide] Secure Your Software Pipeline with a Safer Front-end The deepest concern haunting most enterprises is the security aspect of software development—particularly around security monitoring, maintenance and ownership.  Threats to mission-critical applications need immediate intervention and can add more time, money and resources to an already complex software pipeline. In our latest free guide, Securing Your Software Pipeline with a Safer Front-end Framework Solution, you’ll learn what security vulnerabilities are, what types of vulnerabilities you need to be on the lookout for with open source, and how adopting a safer front-end framework solution could protect your application development. [Get Your Free Copy]   [Video Guide] Getting Started with Ext JS in 3 Easy Steps Getting started with the latest and greatest version of Ext JS has never been easier—our new video guide is here to walk you through the […]

Read More

Achieve High Performance By Using The string_view C++17 Feature In C++Builder

In this tutorial, you will learn another modern C++17 feature to work with strings. This feature is a std::string_view. The purpose of any kinds of string reference proposals is to bypass copying data that already owned someplace and of which only a non-mutating representation is required. The std::string_view is one such proposal. There was an earlier one named string_ref. The std::string_view is a picture of the string and cannot​ be utilized to alter the original string value. When a std::string_view is constructed, there’s no need to replicate the data. Besides, the std::string_view is smaller than std::string on the heap. How can you use std::string_view with C++ Builder? string_view lives in the header file Benefits of the string_view string_view is useful when you want to avoid unnecessary duplicates The creation of string_view from literals does not need a dynamic allocation. The following code illustrates how string_view supports save memory by restricting unnecessary dynamic allocations: #ifdef _WIN32 #include #else typedef char _TCHAR; #define _tmain main #endif #include #include #include #include #include // string_view // Unified way to view a string (memory and length) – without owning it // No allocation std::size_t parse(std::string_view str) { return std::count(str.begin(), str.end(), ‘e’); } int _tmain(int argc, _TCHAR *argv[]) { const std::string str = “hello world”; const char* c = “Rio de Janeiro”; std::cout 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #ifdef _WIN32 #include #else typedef char _TCHAR; #define _tmain main #endif   #include #include #include #include #include   // string_view // Unified way to view a string (memory and length) – without owning it // No allocation std::size_t parse(std::string_view str) {     return std::count(str.begin(), str.end(), ‘e’); }   int _tmain(int argc, _TCHAR *argv[]) {     const std::string str = “hello world”;     const char* c = “Rio de Janeiro”;       std::cout “Occurrences of letter ‘e’: “ parse(std::string_view(str.data(), str.length())) std::endl;     std::cout “Occurrences of letter ‘e’: “ parse(std::string_view(c, strlen(c))) std::endl;     system(“pause”);     return 0; } So, std::string_view is an extraordinary utility for great performance. But, the programmer must assure that std::string_view does not outlive the pointed-to character array. Additional functions provided by std::string_view can be found here, on the official documentation. Head over and check out the Windows string_view demo for C++Builder on GitHub.

Read More

Boost C++Builder Compile Speed with TwineCompile – Deep Dive Webinar

TwineCompile is an advanced compile system that uses multi-threading technology and caching techniques to make your C++Builder compiles 50x faster! This IDE Plugin is included free with an active Update Subscription for all C++Builder and RAD Studio customers via the GetIt Package Manager. Install TwineCompile today from GetIt, before the webinar, so you can easily follow along as Jonathan demos the power of TwineCompile. Deep Dive Webinar: Boost C++Builder Compile Speed with TwineCompile Dec 14th, 2020 at 11 AM CST/1700 UTC [Register] with Jonathan Benedicto of JomiTech, creator of TwineCompile From an elevated RAD Studio Command prompt, you can install it with the command: getitcmd -i=TwineCompile-5.2.1 getitcmd –i=TwineCompile–5.2.1 Other TwineCompile features: Automatic background compiling engine ensures that files are compiled as fast as they are saved! A highly tuned, pre-compiled header handling system automatically maximizes simultaneous use of pre-compiled headers between multiple threads! Seamless integration into the C++Builder 10.4 Sydney IDE Theme support for all IDE themes providing a unified workspace! Full support for 32-bit and 64-bit compilers! Register now for the deep-dive webinar to maximize your C++Builder productivity and rocket your compilation speeds to new heights. TwineCompile performing an automatic background compile (SORTA) in C++Builder 10.4 Sydney. TwineCompile building a project in C++Builder 10.4 Sydney using the Dark Theme.

Read More

Learn How To Build A REST API App For iOS In 45 Minutes With Delphi

In this CodeRage session, you can find the most valuable information and best practices on building an application for iOS using Delphi FireMonkey. Easily learn how to build a real-world application using Delphi FireMonkey! Overview: Recipes app which fetches data from an open API Deploying to App Store After learning best practices, you can apply to your future projects easily As you walk through the session, you can find interesting approaches for refreshing the recipe list with the TTask. TTask means everything in the inside of the TTask, gonna be executed in the background. As you can see one of the best functionality of the TTask is to prevent the user interface from locking up if you want to start something in the background. And in this case, the response from an endpoint could get more time. Be sure to check out the whole session and learn how to deploy Delphi FireMonkey applications to the App Store! Learn more about using TTask in the parallel programming library. Learn more about deploying your Delphi apps to iOS. Find out more about using the REST debugger in RAD Studio to quickly connect to REST services.

Read More

Learn How To Use Connection Pooling With A Multi-threaded Environment In Delphi

This sample implements a multithreaded application, where each thread uses the IFDPhysConnection interface to establish a connection. The multiple connection establishments may lead to performance degradation across the whole system. To avoid this, you can enable the Pooled property to use the connection pooling. Location You can find the Pooling sample project at: Start | Programs | Embarcadero RAD Studio Sydney | Samples and then navigate to: Object PascalDatabaseFireDACSamplesPhys LayerIFDPhysConnectionPooling Subversion Repository: You can find Delphi code samples in GitHub Repositories. Search by name into the samples repositories according to your RAD Studio version. How to Use the Sample Navigate to the location given above and open IFDPhys_Pooling.dproj. Press F9 or choose Run > Run. Interact with the sample: Select an option from the Use Connection Definition combo box. Click the Run button and see the execution time. Select the Run Pooled check box, click the Run button and see the execution time. Compare both execution times. Files File in Delphi Contains IFDPhys_Pooling.dprojIFDPhys_Pooling.dpr The project itself. fPooling.pasfPooling.fmx The main form. Implementation When you run the application, you can interact with the sample using the following objects: A TComboBox object labeled as Use Connection Definition.Click the Use Connection Definition combo box and select an option in order to define a connection to a database. The menu shows all the persistent connections defined on the file C:UsersPublicDocumentsEmbarcaderoStudioFireDACFDConnectionDefs.ini. Once you select a connection definition, the sample enables the Run button and the Run Pooled check box. A TButton object labeled as Run.If you click the Run button, the sample launches 10 threads. Each thread uses the CreateConnection method of IFDPhysManager to create a connection to the database. Moreover, each thread uses the CreateCommand method of IFDPhysConnection to create a command for each connection. Finally, each thread uses the Prepare method of IFDPhysCommand to execute 50 SQL queries. The executed SQL query is the following SELECT command: ‘select count(*) from {id Region}’. Therefore, in this case, each thread creates and uses a dedicated connection object working with the database. A TCheckBox object labeled as Run Pooled.If you select this check box, the Pooled property of the connection setting is set to True. The database connection pooling is a method used to keep database connections open so they can be reused by others. Therefore, if you select the option, the threads can reuse the current opened connection.Note: The connection pooling can be enabled only for a persistent or private connection definition. A TMemo object.The sample uses the memo object to display the type of connection. If you select the Pooled property, the memo displays the following message: ‘Run pooled…’. On the other hand, if you uncheck the Pooled property, the memo displays the following message: ‘Run non pooled…’. Through the link below you can visit the original post about this sample: http://docwiki.embarcadero.com/CodeExamples/Sydney/en/FireDAC.IFDPhysConnection.Pooling_Sample

Read More

Quickly Log Python Script Output To The Delphi Debug Log In Your Windows Apps

Sometimes developers need to log the output messages in Delphi for debugging purposes. You might aware this can be achieved by the windows API OutputDebugStringA . How about direct your python output messages to the Delphi Events Log Window? Yes, Python4Delphi has a flexible component PythonInputOutput to redirect your python output to the Delphi Events Log window with less code. You can also use Python4Delphi with C++Builder. Python4Delphi Demo23 Sample App shows how to create a Python script in Delphi Application which demonstrates creating thread and output the result in the Delphi Event log window. You can find the Demo23 source on GitHub. Prerequisites: Download and install the latest Python for your platform. Follow the Python4Delphi installation instructions mentioned here. Alternatively, you can check out this video Getting started with Python4Delphi. Components used in Python4Delphi Demo23 App: TPythonEngine: A collection of relatively low-level routines for communicating with Python, creating Python types in Delphi, etc. It’s a singleton class. TPythonInputOutput: Inherited from TPythonInputOutput (which works as a console for python outputs) Using this component event you can direct your Python Output to the Delphi Event log window. You can find the Python4Delphi Demo23 sample project from the extracted GitHub repository ..Python4DelphiDemosDemo23.dproj. Open this project in RAD Studio 10.4.1 and run the application. Implementation Details: PythonEngine1 provides the connection to Python or rather the Python API. This project uses Python3.9 which can be seen in TPythonEngine DllName property. It uses a Python Script file threading_test.py where the below list of modules was used. threading: This module constructs higher-level threading interfaces on top of the lower level _thread module.  collections: This module implements specialized container datatypes providing alternatives to Python’s general-purpose built-in containers, dict, list, set, and tuple. In this sample, deque is used. time: This module provides various time-related functions. threading_test.py contains, ProducerThread, ConsumerThread, BoundedQueue class within the function _test. Memo1, used for providing the Python Script to execute. On Clicking Execute Button the below code executes the python script. procedure TForm1.Button1Click(Sender: TObject); begin PythonEngine1.ExecStrings( Memo1.Lines ); end; procedure TForm1.Button1Click(Sender: TObject); begin   PythonEngine1.ExecStrings( Memo1.Lines ); end; The script below is executed which will opens a window console, create threads put in a queue and execute one after other. import threading_test import sys # the following is needed to use the newly allocated console! sys.stdout = sys.stderr= open(‘CONOUT$’, ‘wt’) try: count = int(sys.argv[1]) except: count = 3 for i in range(count): print (“**** Pass”, i) threading_test._test() print (“**** Done.”) import threading_test   import sys # the following is needed to use the newly allocated console! sys.stdout = sys.stderr= open(‘CONOUT$’, ‘wt’)   try:   count = int(sys.argv[1]) except:   count = 3   for i in range(count):   print (“**** Pass”, i)   threading_test._test() print (“**** Done.”) PythonInputOutput1 provides a conduit for routing input and output between the Graphical User Interface (GUI) and the currentlyexecuting Python script. The OnSendData event helps to send the python output data to the Delphi Event log window using the below code. procedure TForm1.PythonInputOutput1SendData(Sender: TObject; const Data: AnsiString); begin {$IFDEF MSWINDOWS} OutputDebugStringA( PAnsiChar(Data) ); {$ENDIF} {$IFDEF LINUX} WriteLn( ErrOutput, Data ); {$ENDIF} end; procedure TForm1.PythonInputOutput1SendData(Sender: TObject;   const Data: AnsiString); begin {$IFDEF MSWINDOWS}   OutputDebugStringA( PAnsiChar(Data) ); {$ENDIF} {$IFDEF LINUX}   WriteLn( ErrOutput, Data ); {$ENDIF} end; Python4Delphi Demo23 You can customize your Events Debug Output messages background and foreground colors easily to differentiate your output messages with Delphi IDE. Right-click in the Events Tab -> Properties->Event Log->Colors -> Output Debug String-> Select Foreground and Background.

Read More

Powerful Petroleum And Mining Software For Surface And Subsurface Data Visualization Is Built In Delphi

Over the past three decades, Golden, Colorado-based RockWare, Inc. has established itself as a leader in the highly specialized geological mapping and modeling sector. Its flagship product, RockWorks, creates 3-dimensional geological models of the earth’s subsurface for customers in environmental (toxic cleanup, contamination audits), hydrogeology (surface and sub-surface water), and industrial minerals (e.g. gypsum, sand gravel) segments and it is built in Delphi. One of the key benefits of Delphi according to Jim Reed, Director R&D is that “It allows us to put in millions of lines of code and do it in an efficient way without maxing out memory. Because of that, we can have a monster program that does 50 zillion different things, but can be downloaded comfortably in a reasonable amount of time. Given that 65% of our business is outside of North America, executable files have to be small enough so that someone in Sudan can download data over a lousy connection.” He attributes this capability to the overlay features in Delphi, which allow for exceptional memory management. “Delphi allows you to easily load and unload things in memory so our software can run on any basic machine. In fact with a low-end PC you could have our application up and running in an hour. We couldn’t live without that.” Case Study https://www.embarcadero.com/case-study/rockware-inc-case-study Website https://www.rockware.com/ Screenshot Gallery

Read More

New Major Release for Delphi Code Analyzer v2.4 with Free Download

Delphi Parser has a new major release … Download Free The New & Powerful Delphi Parser Static Code Analyzer 2.4 & Get Your Delphi Code Analyzed in Minutes! This is an exciting year for Delphi programmers with one of the more significant new RAD Studio releases. With multiple new features and quality improvements, the time to upgrade your Delphi projects has never been better. Delphi Parser is the premier tool to support a wide range of Upgrade needs from simple projects to ones with millions of lines of code. We built it and improved it based on multiple projects. RAD Studio 10.4 allows developers to create amazing modern applications and Delphi Parser is the tool to get you there faster and cheaper. The Delphi Parser Analyzer 2.4 is the Newest Most Valuable Tool For Delphi Developers. It is built & aimed for dealing with huge legacy Delphi projects with hundreds of applications, thousands of unit files & libraries with millions of lines of code & decades of development & developers. It is a must-have tool in every development team through all the development life cycle. No Hard Work. You just need to provide the Delphi Parser Analyzer 2.4 the project source or code base folder you want to analyze, and the search path for the libraries & the Analyzer wizard will do the rest. The Delphi Parser’s Analyzer 2.4 is an automatic code analyzing wizard. It scans & analyzes an entire code base against all available Delphi’s system units, 3rd party components, libraries & even DCUs (using a special De-Compiler). Delphi Parser 2.4 – A Full Blown Independent Parser & Linker. The Analyzer 2.4 is built on the all new Delphi Parser 2.4 framework that has the ability to read millions of lines of code & parse the code into a unified run-time object mode. Multi Pass Parser – The Delphi Parser runs in several phases in order to remove all unnecessary compiler directives while stepping over syntax errors & bridging all Delphi versions differences, from Delphi 2 to 10.4 Sydney In order to build a unifying structured code in an object model in run-time memory. Built-in Linker & Semantic Objects Tree. As the New Delphi Parser v2.4 core technology reads all the code, it links between objects, find source declaration, links implementation code to objects & methods, checks for code dependencies, count references & usage, discover missing objects, and provides the developer an ability to review & drill down into the parsing & linking process in run-time like never been done before (as well as in any other language compilers). The Delphi Parser Analyzer 2.4 Wizard is available for all Delphi versions, as Express & Enterprise edition & also in an open-source edition based on the Delphi Parser 2.4 Developer’s Framework. The Delphi Parser Analyzer 2.4 helps your development team maintain a cleaned project’s codebase. Run it whenever you wish to release a new version update & removes unnecessary files & libraries from code before it is deployed. Take Control Over Your Code. Every software project contains many components that may become unnecessary or obsolete over the development process & stay there untouched, cause no one knows what to do with them & the fear of taking them out leaves them there for eternity. Today, with the Delphi Parser Analyzer 2.4 you can easily & quickly analyze your code on any given Delphi version, from the Legacy Borland to the Newest Embarcadero’s Delphi 10.4 Sydney – and get a true insight into what is going on in your code & […]

Read More