Noutați

Delphi 10.4 Sydney – the best tool for creating Windows Apps

Delphi has long been a favorite tool of many Windows developers. After launching new Delphi 10.4 Sydney that statement may be considered as simply wishful thinking to many people, but sometimes the truth is not as obvious as it should be. The ‘truth’ to many is that Visual Studio is the ultimate tool for Windows developers. While I may concede that truth for many C++ developers, it’s definitely debatable for .NET developers. (Simply ask a Visual Basic developer how they feel about no more language features planned.) Many .NET developers started with WinForms back in 2002 – including a whole bunch of Delphi developers that jumped ship to the greenfields of .NET from what many consider a historical pinnacle of Delphi development, Delphi 7 (an ancient version which many developers still use today!) Some developers have stayed with WinForms over the years, but many moved to WPF and XAML in .NET 3.0 back in 2006. Others chose to take the five-year Silverlight boondoggle starting in 2007. WPF went stagnant around 2013 as the year prior Microsoft released Metro Apps in Windows 8. Microsoft quickly shifted the label to WinRT in Windows 8.1. By 2015, an updated app platform for Windows 10 was named UWP as the new ‘final’ solution but again the improvements didn’t help it to gain traction. Microsoft was recognizing the obvious resistance and quickly created new technologies to bridge applications across various platforms. They developed an iOS bridge, an Android bridge, a web apps bridge, and a classic Win32 desktop apps bridge. (Did you know that there still is an Objective-C for Windows?) The Android bridge is dead. While the Win32 bridge is still active, it has not been utilized much. The new ultimate solution starting in late 2019 has been .NET Core 3.0 and most of the old technologies like WinForms are being reinvigorated to work with it (well, except Silverlight of course!) The new goal is to make “every platform feature available to every developer” to solve the “massive divide” between platforms due to the rejection of UWP. (Note that WinForms and WPF are not cross-platform options with .NET Core 3.0 so they get rejected once again.) The very latest technology revolution unveiled by Microsoft in the last few days is Project Reunion. This is supposed to be the new way to drag all the Win32 applications into the future (something they have been trying very hard to do over the last 14+ years!) A quote from Microsoft: “The idea behind Project Reunion is that it allows developers to build one Windows application and target all 1 billion Windows devices….We’re bringing together the combined power of Win32 and UWP so developers no longer have to choose because we’re unifying these existing APIs and in some way decoupling them from the OS.“ I would pose a fairly significant question behind Microsoft’s bold statement of a billion Windows devices out there: how many applications on those billion devices are Win32 versus UWP? I’m sure Embarcadero has a strong opinion on that specific topic! To be fair, there are a few dozen people in that commune in Belize which still use Windows Phones. And there are a few thousand people using the $3,500 HoloLens headsets. (It’s $1,500 less than their first version after all so it’s bound to […]

Read More

Top 3 features in Delphi 10.4 Sydney to try

Following the beta testing period and some blog post-pre-announcing some of the key features, on 27 Mai 2020 Embarcadero officially released RAD Studio 10.4 Sydney, which includes Delphi 10.4 Sydney. My Top Three Features There are many new features in the product. For Delphi developers the key are: The first cut of Code Insight based on Language Server Protocol. This is a huge step for the product, a new foundation for the future of the “IntelliSense” capabilities. From this foundation, we’ll continue to improve and expand in the future. Top feature is completion within words — rather than starting with what you type. Nice side effects, much better red squiggles. The introduction of custom managed records. Records in Delphi are extremely powerful and handy (with methods and operators overloading) now custom initialization and finalization add more power The extensive enhancements on VCL, with support for High DPI Styles and new platform support with TEdgeBrowser control, among many other features (Per Controls styling, TTitleBar, Virtual Image component, updated API declarations…). FMX and RTL and many other areas got improvement, but the work on VCL has been really extensive for this release There is way more in the product, this is just my personal take of the top 3 areas we worked on. Extensive bug fixing is another key element of Delphi 10.4 Sydney, with one of the highest numbers of public reported bug fixed in a release. And the return of a very nice classic Delphi Greek helmet logo! Noteworthy Links The official RAD Studio 10.4 announcement by Sarina is at https://community.idera.com/developer-tools/b/blog/posts/rad-studio-10-4-now-available-learn-more Direct download of the online installer from the new download portal: https://my.embarcadero.com/#downloadDetail/692 The YouTube What’s New video: https://www.youtube.com/watch?v=cRWWzd_yaig&feature=youtu.be The 10.4 Demos on GitHub at: https://github.com/Embarcadero/RADStudio10.4Demos What’s new web page: https://www.embarcadero.com/products/rad-studio/whats-new-in-10-4-sydney What’s new docwiki page: http://docwiki.embarcadero.com/RADStudio/Sydney/en/What%27s_New Minor features and list of fixed issues: http://docwiki.embarcadero.com/RADStudio/Sydney/en/New_features_and_customer_reported_issues_fixed_in_RAD_Studio_10.4 Official press release: https://www.businesswire.com/news/home/20200526005263/en/RAD-Studio-10.4-Accelerates-Native-Windows-Development (I’m even quoted in it!) Interested in a trial? https://www.embarcadero.com/products/rad-studio/start-for-free Feature matrix (PDF): https://www.embarcadero.com/docs/rad-studio-feature-matrix.pdf

Read More

PyCharm for Data Science

PyCharm Professional Edition integrates with Jupyter Notebook to combine the interactive nature of Jupyter Notebook with the benefits of the most intelligent Python IDE – PyCharm for Data Science. In addition to the built-in Python coding assistance, you can also install a plugin that adds the R support. Intelligent Jupyter notebooks PyCharm for Data Science combines the full intelligence of its code editor with the collaborative and interactive capabilities of Jupyter notebooks. Work with local or remote Jupyter notebooks as you would do in a web-based Jupyter application, but with intelligent coding assistance and overall ergonomics the IDE provides to let you keep your focus on the code and the data. Conda integration PyCharm makes it easy for you to create and select the right environment — keep your dependencies isolated by having separate Conda environments per project. Jupyter Notebook debugger Jupyter Notebook integration not only includes auto-completion, navigation and code analysis, but provides a full-featured graphical debugger with the ability to step into declarations. PyCharm for Data Science and scientific libraries and plots PyCharm has built-in support for scientific libraries. It supports Pandas, Numpy, Matplotlib, and other scientific libraries, offering you best-in-class code intelligence, graphs, array viewers and much more. What’s New in PyCharm 2020.1? Interactive rebasing, smarter debugging, and a font designed for programming. Interactive rebasing If you care about keeping your commit history clean, you’re definitely familiar with interactive rebasing. We’ve now made this easier, and more graphical. Just pick a commit in the history, right-click, and choose ‘interactively rebase from here’, and we’ll help you make your git log look great! New VCS commit tool window If you’re the kind of developer who likes commits that are atomic and tell a story, you probably go back and forth between the commit window and your code to get everything ready. We’ve just made this easier: if you’d like to, you can choose to have the commit window appear as a tool window next to your code. New and improved branches popup Usually, when you see a list of things in PyCharm (or any of our other IDEs), you can start typing to search in this list. Not everyone is aware of this, however, so we’ve now added an explicit search field to the branches popup. We’ve also improved a couple of other things, like indications to show if a branch has incoming or outgoing commits, and made it easier to update remote branches.

Read More

Start your IoT solution with RAD Studio 10.4

Let’s say for example that you want to create a heart rate monitor app. You’ll need information about the heart rate GATT profile to connect to and collect data from the bluetooth enabled HR monitor device. GATT profiles are high level definitions that define how to use standard services in your applications. The heart rate GATT profile is used for fitness or health applications. The server device with a heart rate sensor exposes the standard heart rate service so that the Bluetooth LE client discovers the service and starts collecting data, for example the bpm (beats per minute). The GATT profile is the combination of service + characteristics. You could research all of these specifications on your own, or you could skip ahead by using our prebuilt IoT heart rate sensor component.  IoT Solution with RAD Studio 10.4, we not only provide  Bluetooth components out of the box, but also offer over 50 prebuilt IoT device components for many popular devices, ranging from home automation, to fitness gadgets, medical devices, environmental sensors and more. They are downloadable via the GetIt Package Manager in RAD Studio 10.4 Sydney (Tools > GetIt Package Manager) and include both BLE and Z-Wave components. For example, you can quickly build your own fitness application using either the generic ThingConnect heart rate service component or a device specific IoT component. We provide ready-to-use sample apps for each of the IoT components in GetIt.   The IoT framework for Bluetooth LE based devices uses TBluetoothDeviceDiscoveryManager to manage the connection with an IoT device as a general Bluetooth LE based connection mechanism and wraps each device as a component. For instance, the TWahooTICKRHeartRateMonitor component wraps the Wahoo TICKR Heart Rate Monitor. The TBluetoothDeviceDiscoveryManager component provides the basic mechanism for connecting to Bluetooth LE based devices. In the TBluetoothDeviceDiscoveryManager component, you can define timeout and a number of re-tries to connect for these devices. To build a ThingConnect application, you need the following components: The TBluetoothDeviceDiscoveryManager component is used to set up the connection with the device. The corresponding ThingConnect device component is used to retrieve the services and the characteristics data from the device. Using the TPolarHeartRateMonitor component, it’s easy to connect to the Polar H7 heart rate sensor, and start monitoring the Heart Rate service, including subscribing to HR measurement data updates, and retrieving the building sensor location. You can find a step-by-step tutorial on how to build your own heart rate tracking application using RAD Studio here. IoT Solution With RAD Studio 10.4, we provide fully customizable user interface templates. Using one of the FireMonkey UI templates provides a great starting point for building a visually stunning fitness application. Shown: FireMonkey UI template – Home Screen 3, available in GetIt.  

Read More

InterBase 2020 Update 1 deja disponibil

InterBase is a powerful, zero-administration, small footprint database engine that can power your server and even run on your mobile devices as an embedded database. InterBase 2020 Update 1 added a number of new features, including tablespaces support for InterBase server, new OS platform support for embedded versions, enhanced performance monitoring, SQL optimizations and more.  Today Embarcadero is releasing InterBase 2020 Update 1, which adds the following features:  Linux support for InterBase 2020 Server and Developer Editions Tablespaces support for the OnlineDump technology Updated IBConsole support for Backup, Dump, and Restore operations of databases that use tablespaces Performances improvements and fixes for defects reported by customers Here are some additional links: https://www.embarcadero.com/products/interbase/version-history http://docwiki.embarcadero.com/InterBase/2020/en/Main_Page http://docwiki.embarcadero.com/InterBase/2020/en/What%27s_New_in_InterBase_2020_Update_1 The installers for different platforms are available for download on the following trial and developer edition download pages: https://www.embarcadero.com/products/interbase/start-for-free https://www.embarcadero.com/products/interbase/developer/free-download This release continues to extend the power of InterBase 2020, along with continuing to focus on its reliability and stability. Moreover, RAD Studio developers already have an InterBase developer edition license and also the ability to distributing IBLite or IBToGo with their mobile applications, depending if they are on the Professional or Enterprise edition SQL Optimizations Transform inequality operators and not operators to their opposite representation for index based retrieval. Inequality operators, such as <, <=, !=, <>, >, >= can be transformed and optimized. For e.g. Conditions of the form “NOT A>0” can now get transformed to “A <= 0” by the SQL optimizer to use index retrieval for better performance. Security Enhancements InterBase 2020 uses OpenSSL 1.0.2s across all platforms to avail recent vulnerability fixes from OpenSSL project. IBConsole Improvements InterBase 2020 comes with an enhanced IBConsole GUI for Windows. It supports the latest feature set including Tablespaces and Data Dictionary modifications and includes enhanced support for InterBase’s patented Change Views functionality. InterBase 64-bit Edition now includes a 64-bit native IBConsole application, that will allow larger datasets to be retrieved in the query window. Phased Delivery InterBase 2020 embedded versions and InterBase Server Edition for Windows are immediately available. Server editions for Linux and macOS will follow shortly.

Read More

Getting Started with InterBase for RAD Users

Most, if not all, of your applications will connect to some database backend.  For Delphi and C++Builder users, most have either used it previously or have heard of it. InterBase is a zero admin, small footprint database engine that offers enterprise grade database capabilities like granular transparent database encryption, powerful access control, point-in-time recovery and patented data change tracking. It’s the database running across a range of industries, from POS systems to medical laboratories and CRM to railway systems. In fact, even RAD Server uses an InterBase database for the storage of user information, user groups, analytics, registered devices, version information, registered Edge Modules, push notification messages and more. So why not see if it can further your development efforts. What’s to lose? It’s included in your RAD Studio license. How do I use InterBase for RAD Development? All versions of RAD Studio/Delphi/C++Builder come with support for InterBase 2020 databases. InterBase 2020 is installed with RAD Studio in the following directory: C:\Program Files (x86)\Embarcadero\Studio\20.0\InterBase2020 Installing and Starting the InterBase Server In the additional options of the web installer for RAD Studio, check and install the InterBase Developer Edition and InterBase Express Components. InterBase 2020 Developer Edition is installed with RAD Studio, Delphi or C++Builder and is in the RAD Studio integrated license. Choose Start | Programs | Embarcadero InterBase 2020 | 64-bit/32-bit instance = gds_db | InterBase Server Manager [instance = gds_db] On the InterBase 2020 64 Server Manager, start the InterBase server if it is not running Connecting to InterBase Connecting to the server and database will require entering the host, port, database user and password. InterBase databases are defaulted to the port 3050 or 3051 and provide the default system administrator user, SYSDBA (not case-sensitive) with a password of masterkey (all lowercase). Note: It is recommended that you change the SYSDBA password for improved security. IBConsole IBConsole is a simple, yet powerful and complete system for managing InterBase servers and databases. IBConsole lets you look into the details of the database structure, query the data, backup and restore the database, and perform any other admin tasks.  For more on what IBConsole can do, click here Command Line isql tool The command-line isql is a utility for processing SQL data definition (DDL) and data manipulation (DML) statements from interactive input or from a source file. It enables you to create and view metadata, add and modify data, grant user permissions, test queries, and perform database administration tasks. For more on invoking isql, click here. Developing Database Applications Delphi includes many components for accessing databases and representing the information they contain. They are typically grouped by their access mechanism. The two recommended data access components are: FireDAC FireDAC is the set of standard data-access and data-aware visual components for developing with various database systems including InterBase. FireDAC is designed to deal with real-world high load applications and enables the developer to concentrate on developing the application, not on the complexities of database interaction InterBase Express InterBase Express components or IBX, is a set of custom data aware components and controls that allow you to connect to and access data from InterBase servers and databases. Applications built using IBX components should work better and faster (even if only marginally), giving you more control over the specific features of the server.  The components are broken down into two sections, the IBX Dataset components and Administrative Components.  Using IBLite and InterBase […]

Read More

GetIt Package Manager

GetIt Package Manager Enhancements Coming in RAD Studio 10.4 RAD Studio has a light weight package manager, a mechanism for downloading additional product features, add-on libraries and components, demos, VCL and FMX styles and more. Some of the content is provided by Embarcadero, but a lot comes from our community of developers and third-party vendors. Now in the coming 10.4 release of Delphi and C++Builder, the GetIt Package manager is going to see significant changes in 10.4. The key addition is that now each entry has an associated release date, technically a timestamp. This is the foundation of different features: the ability of sorting the list of entries by date, seeing the most recent ones on top for each entry you have already installed, the indication that an updated version is available the ability to list all installed entries that have an update available Updated Filters In terms of UI change, the Filter section of the GetIt dialog UI will be modified: We are removing older, inactive filters (like Free and Paid) and keeping 2 options offering 2 new ones: All for all entries Installed for the packages installed on the current system Subscription only is a new filter for exclusive content published by Embarcadero and limited to customers with an active update subscription license Updates lists packages installed on the current system and for which a new release is available (that is a package with a newer timestamp than the installed version timestamp) This is the updates filter in action: Another change is in the Sort By section of the GetIt Dialog box, which is going to have a new option to sort packages by release date (or timestamp). GetIt Entries UI The UI of the individual entry in the GetIt dialog will also be modified to indicate the specific date the package was published and (eventually) the date you installed that package. Depending on the status, the entry UI includes new buttons for the action(s) — there are now more actions available, including Updating a package. Here you can see the standard UI for an entry and the same after the package has been installed and an update has been made available: Notice that the two dates indicated in the last image are the release date of the last update and the release date of the one currently installed (the timestamp of the installed item, not the date it was installed). RAD Studio Patches Another key feature we are enabling in 10.4 is the ability to use GetIt to distribute patches, with a specific way to alert customers that a patch is available. We’ve added a new section to the Welcome page to indicate when a patch is available and you have not installed it: Once installed, that indication will disappear. Combined to this Welcome page hint, we’ll have a new category in the GetIt package manager for patches. But this is not the only related change. We have technically introduced a deferred installation mode, so that a patch requiring to update files used by the RAD Studio IDE itself can be installed by a separate process once you close RAD Studio (or as you restart it). This will account for the installation of more complex patches, that require you to close RAD Studio first. Additional GetIt Features Beside the features […]

Read More

TMS WEB Core for Visual Studio Code

TMS WEB Core for Visual Studio Code beta is ready for TMS ALL-ACCESS users. On July 26, 2018, we released the first version of TMS WEB Core for the Delphi IDE, hereby offering a RADically new way for creating web applications directly from the Delphi IDE. RADically different because TMS WEB Core offers RAD component based rich web client application development thanks to the technology of compiling the Object Pascal code to JavaScript with the pas2js compiler. The next step was to also enable using TMS WEB Core from the Lazarus IDE with the first version introduced in October 2018. At the same time, TMS WEB Core was extended with support for creating PWA’s, which is progressive web applications, meaning web applications that can be installed on mobile devices or Chrome desktop browsers, run offline, and access several parts of the device hardware. In a later step, February 2019, we announced support for creating cross-platform desktop applications via the Electron framework. On November 15, 2019, we unveiled that TMS WEB Core was also coming to Visual Studio Code. And now, today, after a huge amount of intensive work, we feel confident to give our baby in the hands of TMS ALL-ACCESS users. It took more time than expected to reach this level as the challenges turned out to be quite complex. Challenges we couldn’t have coped without having the absolute best engineers on board. In the first place, José Leon Serna, the architect of the IDE integration into Visual Studio Code, Roman Kassebaum overlooking and ensuring the Visual Studio Code integration works on 3 operating systems and remains compatible with Delphi’s project management, the pas2js compiler team assisting with debugging integration, the framework team itself taking up the huge task for making the UI controls all design-time editable. Let’s go back to the WHY of taking up this huge & challenging task. Before embarking on this project, José Leon Serna, former Embarcadero IDE architect and head of the engineering team in Spain, and myself mutually shared the vision that Visual Studio Code offered a couple of unique technical features that could potentially make it an ideal candidate for using it for TMS WEB Core web client development. Visual Studio Code is based on web technology. Visual Studio Code is an Electron application and internally, everything is rendered via web views. This makes it ideal to offer design-time live rendering of the forms designed by TMS WEB Core. This is the primary driver. But there are nice additional benefits coming with Visual Studio Code. So, in a nutshell, key decision factors for our endeavour were: Based on web technology, offers a live web rendered designer form Is cross-platform, Visual Studio Code can be used on Windows, macOS, Linux Designed to be extended via plugins with seamless plugin ‘marketplace’ distribution A powerful established Pascal code editing plugin OmniPascal is already available It is a high-DPI compliant IDE Features built-in mechanisms for debugging of applications running in a browser It features side-by-side editing, multi-view code editor windows that can be freely arranged It has a very low barrier of entry, as Visual Studio Code itself is free and open-source Just like our support for Lazarus adds freedom of choice, the capability to use Visual Studio Code now is extra freedom of choice. Of course, this won’t stop nor influence our plans for TMS WEB Core for Delphi. Version 1.4 of TMS WEB Core […]

Read More

Nou în Delphi 10.4: Redesigned Code Insight

What do we mean by Code Insight? First, some background. If you’re familiar with Code Insight, skip ahead… Code Insight is our name for a set of IDE productivity features in the editor. For the purposes of this blog post, those features are: Code Completion: the dropdown list box that predicts what you want to type. Appears when you type a period (.) after an identifier, or when you press Ctrl+Space. Parameter Completion: the hint that appears showing the parameters for a method, including multiple variations for an overloaded method. Ctrl+Shift+Space inside method braces (). Find Declaration: right-click on an identifier and click Find Declaration, and it will take you to where that method, variable, type etc is defined. You can also hold Control down and move your mouse over the editor, and applicable identifiers will turn into hyperlinks you can click on to find their declaration, which is known as Code Browsing. Tooltip Insight: hover your mouse over a variable or type, and you will be shown information about it. Sometimes this includes XMLDoc, and is known as Help Insight. (We need to clarify names in our doc.) Error Insight: displays errors in your code before you compile. These are otherwise known as ‘red squigglies’, many people’s preferred terminology – the red zigzag lines under your code. Errors are also shown in the Errors node in the Structure view. These features have been available in Delphi for many years. Features like this are a key benefit to you when coding an IDE. Code completion especially saves a lot of typing, and error insight helps you make sure your code is working before you spend time compiling. Classic Code Insight As the language has grown and time has passed, these features have no longer always worked as well as we have wanted. The technology was cutting-edge when it was introduced, but there were definite improvements we could make today. It’s been common to see bug reports about spurious errors (ie errors reported in the editor or in the Structure view when the source code is actually perfectly correct code.) Or that the IDE worked in the main thread, so would not respond to keystrokes while it was working to show the code completion list. (You could only press Escape to cancel.) Sometimes, for gigantic projects, calculating the data for code completion could use a lot of memory in the IDE. In addition, the features were implemented with multiple code parsers: code completion and error insight each had a different understanding of the code. And finally, code insight was disabled while debugging, so if you wrote code while debugging you had no productivity assistance. We did not want this to continue. Our goals for 10.4 have been to: Make Code Insight asynchronous – that is, run on another thread or in another process (or both) so that the IDE is always responsive when you type even if it’s doing work in the background Reduce or even completely remove (you can see where this is going) the potential memory usage for code completion from the IDE Ensure Error Insight always gives correct results – that is, it should give exactly the errors the compiler would, and correct code should show no errors Help us move closer to having a single parser for Delphi source in the IDE, so that there is a ‘single source of truth’ or single understanding […]

Read More

Nou în Delphi 10.4 – Custom Managed Records

What is a Custom Managed Record in Delphi? Records in Delphi can have fields of any data type. When a record has plain (non-managed) fields, like numeric or other enumerated values there isn’t much to do for the compiler. Creating and disposing the record consists of allocating memory or getting rid of the memory location. (Notice that by default Delphi does not zero-initialize records.) If a record has a field of a type managed by the compiler (like a string or an interface), the compiler needs to inject extra code to manage the initialization or finalization. A string, for example, is reference counted so when the record goes out of scope the string inside the record needs to have its reference count decreased, which might lead to de-allocating the memory for the string. Therefore, when you are using such a managed record in a section of the code, the compiler automatically adds a try-finally block around that code, and makes sure the data is cleared even in case of an exception. This has been the case for a long time. In other words, managed records have been part of the Delphi language. Records with Initialize and Finalize Operators  Now in Delphi 10.4 record type supports custom initialization and finalization, beyond the default operations the compiler does for managed records. You can declare a record with custom initialization and finalization code regardless of the data type of its fields, and you can write such custom initialization and finalization code. This is achieved by adding specific, new operators to the record type (you can have one without the other if you want).Below is a simple code snippet: type TMyRecord = record Value: Integer; class operator Initialize (out Dest: TMyRecord); class operator Finalize(var Dest: TMyRecord); end; You need to write the code for the two class methods, of course, for example logging their execution or initializing the record value — here we are also logging a reference to memory location, to see which record is performing each individual operation: class operator TMyRecord.Initialize (out Dest: TMyRecord); begin Dest.Value := 10; Log(‘created’ + IntToHex (Integer(Pointer(@Dest))))); end; class operator TMyRecord.Finalize(var Dest: TMyRecord); begin Log(‘destroyed’ + IntToHex (Integer(Pointer(@Dest))))); end; The huge difference between this construction mechanism and what was previously available for records is the automatic invocation. If you write something like the code below, you can invoke both the initializer and the finalizer, and end up with a try-finally block generated by the compiler for your managed record instance. procedure LocalVarTest; var my1: TMyRecord; begin Log (my1.Value.ToString); end; With this code you’ll get a log like: created 0019F2A8 10 destroyed 0019F2A8 Another scenario is the use of inline variables, like in: begin var t: TMyRecord; Log(t.Value.ToString); which gets you the same sequence in the log.  The Assign Operator The := assignment flatly copies all of the data of the record fields. While this is a reasonable default, when you have custom data fields and custom initialization you might want to change this behavior. This is why for Custom Managed Records you can also define an assignment operator. The new operator is invoked with the := syntax, but defined as Assign: class operator Assign (var Dest: TMyRecord; const [ref] Src: TMyRecord); The operator definition must follow very precise rules, including having the first parameter as a reference […]

Read More