Noutați

What’s coming in TMS WEB Core v1.7 Ancona

The new version v1.7 of TMS WEB Core has been in development for about 6 months by now. Many of its features were already in development in parallel to v1.6. And yes, our team already is working on v1.8! It will not come as a surprise to you that in v1.7 there are new game-changing features in TMS WEB Core also. Those who have been following the TMS WEB Core development since the first version TMS WEB Core v1.0 Brescia will know that we name the releases after cities along the famous historic race “MilleMiglia”. To be more precise, the legendary race of 1955. And as such, after we visited the city Pesaro with v1.6, for v1.7 we land in Ancona. The historical meaning of the word “Ancona” is elbow which is commonly associated with the shape of the coastline. After the ‘elbow’ Ancona, there are new sights towards the more southern coasts of Italy. Enough history! Let’s bring an overview of what our team has been working on for TMS WEB Core v1.7 Ancona. 1) Components wrapping browser API for local file access The W3C consortium proposed an API forlocal file access from Web browser applications and Google Chrome implements it already. Given that Microsoft uses the Google Chromium engine, it is also available in Microsoft Edge Chromium. With TMS WEB Core, you can take a head start, explore, and start using this with its three components today: TWebLocalTextFile TWebLocalBinaryFile TWebLocalFolder. These components allow you to directly open text and binary files from the local file system as well as traverse the local file system’s folder structure from a Web application. Of course, for security reasons, the users have to give their consent first. 2) Popup menu component and popup menu support in components In TMS WEB Core, we offered the regular TWebMainMenu since its inception and now we completed this trend with the new TWebPopupMenu. It works very similar to a Windows VCL TPopupMenu. Simply drop a TWebPopupMenu on your Web forms and assign it to control.PopupMenu to obtain an automatic context menu for controls. 3) USB device access The times that software developers thought you could never use a Web application for controlling your machine’s hardware are officially over. We already introduced support for Bluetooth with our TWebBluetooth component, and with this release we add two new components TWebUSBSerial and TWebUSBHID that allow you to write applications communicating with locally connected USB devices using a serial protocol or the HID protocol. This opens up a whole new field of applications that can be implemented using Web technologies. 4) TWebStringGrid & TWebDBGrid extensions We added a whole range of new grid features in TWebStringGrid and TWebDBGrid. There are now: Methods to insert & remove rows A range of different inplace editor types Cell merging and cell splitting Loading and saving to streams Loading from a stringlist with CSV data Direct access to grid data as TJSArray Add checkboxes to the grid 5) Async methods There is no way around it in the Web browser, there are different APIs that can only be used in an asynchronous way. The reason for this is very clear: Always guarantee a responsive UI even when lengthy operations are taking place in the application. Many developers struggle with implementing sequential logic for processes […]

Read More

Qualicodex Software: new TMS consulting partner

  We are proud to announce a new collaboration with the team from Qualicodex Software in Brazil to assist users of Delphi in combination with TMS products. From today, Qualicodex Software is our consulting partner for Portuguese and English speaking software developers and software development companies. Ivan Souza is a Software Engineer and a certified Delphi developer since the first version and professor of the Distributed Systems discipline at the West University of Santa Catarina, he started his career in the first versions of Object Pascal, even before Delphi and today he is always looking for updates on new technologies. He worked at Embarcadero Brasil as a Senior Consultant, is an active member of the Delphi community and coordinates the DelphiCodex channel on Youtube. He participated in several conferences and webinars, always providing high quality content to the community. In addition to consulting with Delphi, Ivan also has knowledge and expertise in the technologies that are used by incredible tools, like Web, application servers, databases, distributed systems, IoT, etc. He started his qualification in the tools of tmssoftware with TMS WEB Core, TMS XData and TMS Aurelius. At the moment he is developing an entire ecosystem where these tools are used together with the best in information processing environment (Linux, Desktop, Mobile, Databases, NoSQL, IA, etc …) This partnership is the beginning of a great friendship! Doing it with love, dedication and respect is the secret. Delphi is the key! At the same time, we would like to take the opportunity to mention that we still wish to extend our consulting partner network, foremost in the Asia area, Australia, Canada, South Africa. If you are Delphi developer with TMS component expertise and offering consulting services, get in touch and we will be happy to discuss how we can move forward!

Read More

Lambdas in FlexCel

As you might know, some months ago Microsoft released support for lambda functions in Excel. It was no small change: Lambdas turned the calculation engine into turing-complete, and they can change your spreadsheets in fundamental ways. The main reason why you might want lambdas is that they allow you to define user-defined functions in a spreadsheet, using only other formulas. No VBA or macros required. But Lambda functions are much more: they are real first-class functions that you can pass around. They can even do variable captures like a Lambda in C# or an anonymous method in Delphi. Even with them being only months old, there are a lot of articles and posts about them. So we will not repeat those here, and we will instead focus on a question that we have heard a lot lately: When is FlexCel going to support Lambdas? And the answer is, of course, today. But wait! Let me look at the date… and let me look at the other post today on this site about running FNC in a Sperry Univac Uniscope 200… What can I say? Lambdas weren’t supposed to ship on April 1st; they were supposed to ship weeks ago. But we kept finding small stuff to polish. As it is usual in FlexCel development, we wanted to cover all cases that we could and make sure everything worked as it should. And as it is usual too, we were late and I am writing this post in April 1st. You can download FlexCel 7.9 on our site, and start adding lambdas and lets everywhere. Just the usual advice: “With great power comes great responsibility”. As powerful as they are, it is simple to abuse them and end up with spreadsheets only a mother could love. Or understand. I’ve already seen pages-long lambdas written in many places, and one has to wonder how you are supposed to debug those formulas once something goes wrong. Right now, Excel tools for debugging lambdas are quite poor. Tales from the trenches Following a one post tradition, I am reviving the “tales from the trenches” section for this post. This is the section where I write about small details we find in our daily development. Of course, every day has a different tale, so I’ve chosen one at random to close this entry. Schrödinger parameter names. When we wrote the validation code for parameter names, we assumed that they would follow the same rules as Excel names. In particular, you can’t have a name that is also a valid cell reference. So you can’t have a name named “A1” or “R1C1”. You can’t either name a name “R” or “C” since that means “Full Row” and “Full Column” in R1C1 notation. But, while you can’t name a parameter “A1”, you can name it “C”. So how does this work? How does Excel know that when I write “=Sum(C)” I refer to the parameter C and not to the entire column? The only way to find out was to try it, so I set the reference mode in Excel to R1C1, and went to write the formula `=Lambda(C,Sum(C))` It gave an error of invalid name. So I tried now with `=Lambda(A1,Sum(A1))`, and Excel happily accepted it. Valid parameter names depend on the reference mode you are […]

Read More

5 Tips For Building Tabs In Javascript

Ext JS is a JavaScript framework that enables developers to build web apps for any modern device. It includes 140+ fully supported components that easily integrate with React and Angular. It features a customizable tab control to easily allow you to add powerful tabs within your Javascript application. There are a number of advanced features it supports including overflow scroller tabs, icons on tabs, and bottom tabs. Take a look at the below tips for building tabs in a Javascript application. #1. How do I implement basic tabs in Ext JS? Tabs on a component enable handy user engaging means of displaying multiple related content, one iteration of a view at a time. #2. How do I implement advanced features in tabs? There are options for anchoring the collection of tabs along any position on the perimeter of the component container, and likewise within the collection of tabs, the option of rotating the tab itself within its container. Check out this video tip on our YouTube channel: https://www.youtube.com/watch?v=SCCn3FqdMwY #3. How do I implement the overflow scroller tabs? The Tab Panel component provides the means for managing tabs in such a way where “back” and “next” buttons can allow access to tabs not readily visible within the current display, called the overflow. #4. How do I implement icons on tabs in Ext JS? Text is the most common way to signal information in a tab header, but other options, called icons, exist as well, which can be just as engaging if not more so in initiating action in an application. #5. How do I implement positioning bottom tabs in Ext JS? Tabs on a component can be configured to be docked along any position on the component’s perimeter. ExtJS has Everything you need to Create Stunning Web Applications Ext JS includes amazing UI components, such as HTML5 calendar, grids, pivot grid, D3 adapter, trees, lists, forms, menus, toolbars, panels, windows, and much more. Hundreds of user extensions are also available from the Sencha community. Find out more about Ext JS and all of the amazing HTML5 components it offers.

Read More

What’s cooking in the TMS Labs: moving Delphi and FNC forward (and backward)!

Our ever growing FNC framework now already brings a whole portfolio of components to a myriad of devices and operating systems: Windows, Android, iOS, macOS, Linux, Raspbian, Web …. So, it is clear that our R&D team is always looking out for new technology and trying to be ahead of the curve. For this reason, our team was excited to be involved in a very forward looking project for a customer that brings Delphi and our FNC framework again on the bleeding edge of technology.  For this project, we researched how we could bring the FNC framework to a new M1 CPU + NVidia Titan V based device that features an AI driven holographic display. We tweaked the Delphi OSX64 compiler to produce M1 CPU code as well as NVidia SIMD GPU instructions to render FNC on the holographic display. When we received the test device here, the results are without a doubt stunning! You can see a glimpse here: While playing with this cutting-edge technology, our team mesmerized how predictions of technology in movies of the seventies and eighties already got real and we wondered therefore, if we could bring Delphi and FNC at the same time to this for us nostalgic area. A first attempt was to port FNC to the Sharp LR35902 processor and after this was successful, it permitted us to run FNC on the Nintendo Game Boy. It is surprising how crisp the FNC graphics are rendered on the small Game Boy LCD screen as you can witness here: And this achievement inspired us to go back in time even further. Surprisingly this was somewhat easier as making Delphi compile on a Intel 8080 CP/M machine. We tweaked the original Turbo Pascal 8086 compiler to use only 8080 instructions and got it working. It was however a lot more effort to downscale the FNC graphics abstraction layer to a 80×25 character CRT screen. But as you know by now, we are not scared to make our hands dirty in such challenging task. It is with pride that we can share the first FNC components now also running on a CP/M driven Intel 8080 machine from 1974 connected to a Sperry Univac Uniscope 200 terminal.  Are you still using devices for which you like to use Delphi and FNC? Let us know, it could become the next challenge of our team! We look forward to hear what nostalgic or futuristic device you would which to bring alive with your beloved development tools.

Read More

Multi component, multi data source binding in FNC

Intro We have been working on multi component, multi data source binding for quite some time now, providing a foundation for future improvements and new features and today we can proudly announce that TMS FNC Core 2.5 makes the first version available via the TTMSFNCDataBinder component. The TTMSFNCDataBinder component is a non-visual component that acts as a bridge between components and datasources and uses RTTI to detect bindable properties. Read-only Important to know is that this initial release of the TTMSNCDataBinder component supports read-only data binding. It listens to dataset changes, and automatically updates values in the component. In future updates, writing data to the dataset is planned as well as updating the active record based on the selection. Supported modes The TTMSFNCDataBinder component supports 4 modes: single value list column/list grid (via interface) To point out how a binding is done, below is a sample of binding a single value and a list component. (Based on TTMSFNCHTMLText and TTMSFNCListBox) single value procedure TFormDataBinding.UpdateLinks; var it: TTMSFNCDataBinderItem; begin TMSFNCDataBinder1.BeginUpdate; it := TMSFNCDataBinder1.Items.Add; it.&Object := TMSFNCHTMLText1; it.BindType := dbbtSingleValue; it.DataSource := DataSource1; it.FieldName := ‘Common_Name’; it.PropertyName := ‘Text’; TMSFNCDataBinder1.EndUpdate; TMSFNCDataBinder1.Active := True; end; The below code actually sets up the same binding as the code above with a convenience method ConnectSingle. procedure TFormDataBinding.UpdateLinks; begin TMSFNCDataBinder1.ConnectSingle(TMSFNCHTMLText1, DataSource1, ‘Text’, ‘Common_Name’); TMSFNCDataBinder1.Active := True; end; list procedure TFormDataBinding.UpdateLinks; var it: TTMSFNCDataBinderItem; begin TMSFNCDataBinder1.BeginUpdate; it := TMSFNCDataBinder1.Items.Add; it.&Object := ListBox1; it.BindType := dbbtList; it.DataSource := DataSource1; it.FieldName := ‘Common_Name’; it.PropertyName := ‘Items’; TMSFNCDataBinder1.EndUpdate; TMSFNCDataBinder1.Active := True; end; Again as with the single value binding, the below code uses a convenience method to add an item and set all the properties in one go. procedure TFormDataBinding.UpdateLinks; begin TMSFNCDataBinder1.ConnectList(ListBox1, DataSource1, ‘Items’, ‘Common_Name’); TMSFNCDataBinder1.Active := True; end; HTML template For the single value and list bindings, there is support to add a HTML template instead of binding to a specific field name. The HTML template supports multiple fields as long as they follow a specific kind of format. The HTML itself is based on the mini HTML reference (https://www.tmssoftware.com/site/minihtml.asp) The format for adding fields is: . So when applying this to the single value binding for example we can add an item using the TMSFNCDataBinder1.ConnectSingleHTMLTemplate(TMSFNCHTMLText1, DataSource1, ‘Text’, ‘Name: ‘); or procedure TFormDataBinding.UpdateLinks; var it: TTMSFNCDataBinderItem; begin TMSFNCDataBinder1.BeginUpdate; it := TMSFNCDataBinder1.Items.Add; it.&Object := TMSFNCHTMLText1; it.BindType := dbbtSingleValue; it.DataSource := DataSource1; it.PropertyName := ‘Text’; it.HTMLTemplate := ‘Name: ‘; TMSFNCDataBinder1.EndUpdate; TMSFNCDataBinder1.Active := True; end; Editor The databinder component installs an editor that is available at designtime and at runtime. The editor allows to visually edit the bindings that you have set up. You can also create, update and delete new or existing bindings. To start it at runtime, call TMSFNCDataBinder1.ShowEditor; At designtime, you can right-click the TTMSFNCDataBinder component and select “Edit…” to start the editor. Want to know more? Active registered users of FNC (TMS FNC Core) can download the update and get started right away! A demo (“Databinding”), is included in the distribution and there is separate documentation that gives more details on what the TTMSFNCDataBinder component can do and can mean for your application.

Read More

Top Tips For Building Javascript Accordion And Step Swipers

Sencha Ext JS allows you to accelerate web application development with an enterprise-ready framework, components and tools built to work together seamlessly. You can build Ext JS applications using drag-and-drop features and spend less time on manual coding. The IDE and Code Editor Plugins integrate Sencha frameworks into your enterprise workflow, enabling code completion, inspection, generation, navigation, refactoring and more. How do I Implement Basic Accordion Swiper in Ext JS? The Basic Accordion Swiper component provides a container used by the listswiper plugin to display information and controls when an item is swiped. How do I implement the Undoable Step Swiper? The Undoable Step Swiper allows for a hierarchy of options in a list that provide a successive series of options that can support or nullify the previous actions. How do I implement the Undoable Accordion Swiper? The Undoable Accordion Swiper provides actions that are presented as a sub-menu of options, each of which can be acted on by a subsequent cancel, delete or more general revert action. How do I implement the Basic Step Swiper? The Basic Step Swiper demonstrates different actionable options to choose from as swiping takes place. Ext JS includes a flexible layout manager to help organize the display of data and content across multiple browsers, devices, and screen sizes. It helps you to control the display of components, even for the most complex user interfaces. Ext JS also provides a responsive config system that allows application components to adapt to specific device orientation (landscape or portrait) or available browser window size. You can use all of these features with the accordion and step swipers. Ready to get started with Sencha Ext JS? It’s as easy as 1 2 3! Sencha Ext JS is the most Comprehensive JavaScript Framework and UI Component Library. Try it now!

Read More

Beyond SolarWinds: Guarding Against the Rising Threat of Supply Chain Attacks

Published March 25, 2021 WRITTEN BY MICHAEL SOLOMON Michael G. Solomon, PhD, CISSP, PMP, CISM, PenTest+, is a security, privacy, blockchain, and data science author, consultant, educator and speaker who specializes in leading organizations toward achieving and maintaining compliant and secure IT environments. The successful attack in 2020 on the SolarWinds Orion network management software showed that indirect, or third-party, attacks on organizations of all sizes are feasible. Where direct attacks used to be the most common attack vector, especially when attempting to target large organizations, attacking smaller suppliers is becoming a more attractive approach. Any attack that attempts to compromise an organization by directly attacking one of its suppliers of hardware or software is called a supply chain attack. The SolarWinds attack was not the first attack on the IT supply chain, and it looks like the number of similar attacks is increasing. As more organizations become more secure, attackers are looking for creative ways to sneak their attacks in under the radar. Let’s look at the risk of IT supply chain attacks and what you can do to mitigate them. Understanding supply chain attacks Supply chain attacks were up 430% in 2020 over the previous year. The dramatic increase in supply chain attacks means that organizations must mobilize immediately to counter this emerging threat. Cybersecurity specialists are getting better all the time. Cybersecurity education and training is becoming more commonplace and in-depth, along with the development of increasingly sophisticated tools and techniques. Unfortunately, cybercriminals are getting better as well. Over the last decade, the increased level of security awareness and control sophistication has driven cybercriminals to search for softer targets. Security defense maturity is often consistent with size. Larger organizations generally have larger security budgets and can end up maintaining more secure IT environments. Saying that larger means more secure isn’t always accurate; there are lots of insecure large organizations and many very secure smaller ones. On average, though, cybercriminals know that smaller organizations are more likely to lack sophisticated security controls. Simply put, smaller organizations often do not have the budget for the best security. Consequently, many cybercriminals are recognizing a unique opportunity to indirectly attack large organizations by focusing their efforts on the smaller — hopefully softer — suppliers that those large organizations use. The basic approach in a supply chain attack is for the cybercriminals to add malicious code to software products during the development or release process. The malicious code becomes part of a software product that then gets sold to — and installed in — numerous unsuspecting customers’ environments. While the direct target of the attack is the supplier’s code, the eventual target is the customer’s environment into which the tainted code gets installed. The main reason an attack like this works is due to its novelty and the presence of general trust between supplies and customers. Few customers of SolarWinds products probably worried about the quality of the SolarWinds product line before the news of the Orion attack. The general perception is that a trusted supplier takes the necessary precautions to ensure their software is clean. Very few existing security tools or procedures validate the security of purchased products. That’s the problem, and the opportunity for cybercriminals. It has long been known that tampering with a product during delivery is possible, and controls […]

Read More

TMS Aurelius 5 is here! Come see it Live!

TMS Aurelius 5 has been released with lots of new features! Photo by Tony Hand on Unsplash As we have antecipated in a previous blog post, lots of new features were expected for the next major release of TMS Aurelius, our state-of-art ORM framework for Delphi. And indeed, Aurelius 5 was released last week! The what’s new section in the documentation provides you can see the full list of new features, improvements and bug fixes. Here are the major new features, and at the end of this article we have a special invitation for you! Data Validation You can now add data validation via attributes directly to your entity classes. [Entity, Automapping] [Filter(‘Multitenant’)] TTrack = class strict private FId: Integer; [Required] FName: string; FGenre: TGenre; FComposer: Nullable; [Range(0, 3600000)] FMilliseconds: Nullable; FTenantId: Nullable; function GetDuration: string; public All fields will be proper validated according to the validation attributes applied. With a few lines you will guarantee that the entity will be persisted with a valid state. The above class is part of the Music Library demo provided with TMS Aurelius (trial and registered versions). Note how the track name is required, and the duration must not be greater than one hour (3600000 milliseconds). If you try to save something with wrong data, Aurelius will automatically prevent the user from doing so and raise an exception: Global filters and multitenancy Aurelius now includes global filter mechanism. Users will be able to define filters globally, including parameters, and choose which entities will have it applied. The Music Library demo was made multitenant with a few lines of code. The entities were marked with a new global filter definition: [Entity, Automapping] [FilterDef(‘Multitenant’, ‘{TenantId} = :TenantId’)] [FilterDefParam(‘Multitenant’, ‘TenantId’, TypeInfo(string))] [Filter(‘Multitenant’)] TGenre = class strict private FId: Integer; [Required] FName: string; FTenantId: Nullable; And, from that, Aurelius allows you to enforce values in filter (to prevent a wrong tenant id to be saved) and also enable filters to retrieve data: Manager.EnableFilter(‘Multitenant’) .SetParam(‘tenantId’, CurrentTenant); That was it! Music Library demo is now multitenant, with a few UI changes to allow the end-user to choose which tenant to use, data is now fully separated between tenants. Attribute-based event handlers Events are an important feature of any framework, and with Aurelius is not different. It provides several events you can use to add custom business logic. You can add specific code just before an entity is being saved, after an entity is deleted, when an SQL is being executed, among others. But now you can add event handlers directly in your classes, using attributes. You can use it for logging for example, or even to add custom, more complex data validation. The Music Library demo also shows how to do it: TGenre = class {…} public [OnValidate] function Validate: IValidationResult; {…} function TGenre.Validate: IValidationResult; begin if SameText(Name, ‘Experimental’) then Result := TValidationResult.Failed(‘Experimental music is not allowed’) else Result := TValidationResult.Success; end; Such validation will be applied, and Experimental genres will not be allowed in our Music Library app! Come See it Live! There are more new features, actually: TObjectManager.AddOwnership method, Aurelius Dataset can now refresh fields directly from objects and automatically destroy the source list, etc. But, what about if you come and see the new features live, in action, with a more deep explanation? The free webinar […]

Read More

Webinar: TMS WEB Core with HTML/Bootstrap templates (Portuguese)

Register for the free webinar “TMS WEB Core with HTML/Bootstrap templates”. The webinar is scheduled on March 25, 2021 16h00 UTC  17h00 UTC (17h CET – 18h CET) at the TMS Web Academy! “TMS WEB Core with HTML/Bootstrap templates” Ivan de Souza, former senior consultant at Embarcadero Brazil will demonstrate how to create web applications with Delphi and TMS WEB Core and use HTML with Bootstrap to create modern, responsive and good looking web user interfaces.  You will learn techniques to bind Object Pascal user interface control logic to existing HTML & CSS. NOTE: The webinar will be presented in Portuguese! “TMS Web Core com templates HTML/Bootstrap” 25 de Março de 2021 / 13h (Horário de Brasília) Ivan de Souza, ex-consultor sênior da Embarcadero Brasil, irá demonstrar como criar aplicações web usando Delphi e TMS Web Core, com HTML e Bootstrap, para criar aplicações web com visual moderno e responsivo. Você irá aprender técnicas para ligar a lógica de interface escrita em Object Pascal em templates HTML e CSS existentes. O webinar será realizado em sua maior parte em português, tendo algumas interações em inglês com o CEO da TMS, Bruno Fierens. 

Read More