Next tuesday, Feb 8 at 5h00 UTC 18h00 CET, we have a new webinar you will not want to miss! Our experts & Embarcadero MVPs Wagner Landgraf and Roman Yankovsky will introduce a brand new product GraphQL for Delphi to you. This webinar gives you the opportunity to learn what GraphQL is, what you can use it for and then show how to use it from Delphi using the full GraphQL-spec complaint library “GraphQL for Delphi” including some live examples. You will learn how you can apply GrapQL to create highly flexible API servers with a minimum effort where the client can choose on how to optimize its communication with the server. During the webinar, the GraphQL for Delphi product will be officially launched and will become available in both a free edition for non-commercial use and a normal licensed version. Attendees will also be entitled to an introductory discount coupon for purchasing the normal licensed version. Register now! Register here to ensure your seat for the webinar on February 8 from 5PM to 6PM UTC (18h00 – 19h00 CET)
We are very excited to announce a new product TMS MemInsight in the TMS family that results out of the collaboration with long-time Delphi expert Stefan Meisner and the TMS team. Stefan has a deep knowledge of Delphi technical internals to monitor memory allocation, getting call-stack information, exception handling, challenges with multi-threaded development and much more. Together with our focus on bringing easy to use component-based and as low-code as possible solutions and tools, we strongly believe that not only for TMS MemInsight but also future product ideas, we can continue to bring more value to you and come to the 1 + 1 = 11 winning formula. TMS MemInsight v1.0 Whereas most memory allocation tracking tools are static, that is producing a report on application close or upon application crash, the difference with TMS MemInsight is that it is a dynamic memory allocation profiling tool that is used at run-time. This means that also while your application is running without issues, you can monitor where there are possibly performance issues due to consuming huge amounts of memory. With TMS MemInsight, you can continuously inspect memory allocation during run-time and get information on classes for which memory is allocated and get the class info, call stack, thread, property inspection, memory dump etc… of everything. With a statistics view, it is easy to see where the majority of allocated application memory is going to. When you run the tool in debug mode with a map file, it is able to directly bring you to the position in the source code in the Delphi IDE of where memory was allocated. TMS MemInsight also allows to provide additional information, most importantly the call stack, when exceptions occur. This allows you to understand better where exceptions come from and remedy these. Getting started To get started with TMS MemInsight is as easy as dropping the TTMSMemInsightProfiler component on the form. With this component on the main form of the application, it is default configured to immediately show the profiler tool when you start your application. Or you can also choose to start the profiler only from code when you need it. You can control at component level or in code, what monitoring tools are active and live. There is not much more to do to get a new deep view on the internals of your application! Discover it also for yourself in this video: What’s next We have plenty of ideas of possible future directions of not only the TMS MemInsight tool but also new complimentary tools. But of course, as always, it is your wishes and requests for specific functionality that steer our development priorities. We look forward to hear from you what enhancements can be done in TMS MemInsight to make your development even easier and what other development tools you further wish. Contact us by email or leave a comment here.
TMS FNC Maps v2.4 adds support for a new geocoding and directions service in addition to the existing supported directions services from Azure, Bing, Google, Here, MapBox and OpenRouteService. GeoApify The GeoApify API service provides geocoding, reverse geocoding and directions. This service can be used in combination with all supported mapping services in TMS FNC Maps. Specifically in combination with the OpenLayers mapping service this is a worthwhile free alternative to comparable services. Geocoding A geocoding request converts a text address to a geographic latitude & longitude coordinate. The coordinate can then be used to display a location on the map. With the following code we are going to look up the location of “Baker Street, London” and display it on the center of the map with a marker and a title that contains the address.Note that this example uses the asynchronous method with a callback. procedure TForm1.Button1Click(Sender: TObject); var Item: TTMSFNCGeocodingItem; begin TMSFNCGeocoding1.APIKey := ‘abc123’; TMSFNCGeocoding1.Service := gsGeoApify; TMSFNCGeocoding1.GetGeocoding(‘Baker Street, London’, procedure(const ARequest: TTMSFNCGeocodingRequest; const ARequestResult: TTMSFNCCloudBaseRequestResult) begin if (ARequestResult.Success) and (ARequest.Items.Count > 0) then begin Item := ARequest.Items[0]; TMSFNCMaps1.BeginUpdate; TMSFNCMaps1.SetCenterCoordinate(Item.Coordinate.ToRec); TMSFNCMaps1.AddMarker(Item.Coordinate.ToRec, Item.Address); TMSFNCMaps1.EndUpdate; end; end ); end; Reverse Geocoding A reverse geocoding request converts a latitude & longitude coordinate to a text address. The text address can then be used to display an address associated with a location on the map. With the following code we are going to track a click on the map, retrieve the address for that location and display it on the map with a marker and a title that contains the address Note that this example uses the synchronous method that provides an immediate result without a callback. procedure TForm1.TMSFNCMaps1MapClick(Sender: TObject; AEventData: TTMSFNCMapsEventData); var Address: string; begin TMSFNCGeocoding1.APIKey := ‘abc123’; TMSFNCGeocoding1.Service := gsOpenRouteService; Address := TMSFNCGeocoding1.GetReverseGeocodingSync(AEventData.Coordinate.ToRec); TMSFNCMaps1.BeginUpdate; TMSFNCMaps1.SetCenterCoordinate(AEventData.Coordinate.ToRec); TMSFNCMaps1.AddMarker(AEventData.Coordinate.ToRec, Address); TMSFNCMaps1.EndUpdate; end; Directions A directions request provides step by step directions between a start and end location. The directions data can then be used to display a route on the map. Additional options can be configured for the directions request, including: waypoints, alternative routes and language. With the following code we are going to retrieve driving directions between New York and Philadelphia. On the map, a marker is displayed at both the start and end location, a polyline displays the route and a label displays the distance and duration of the route.In the TListBox on the step by step directions are displayed for each step in the route directions.Note that this example uses the asynchronous method with a callback. procedure TForm1.Button1Click(Sender: TObject); var cStart, cEnd: TTMSFNCMapsCoordinateRec; begin cStart.Latitude := 40.68295; cStart.Longitude := -73.9708; cEnd.Latitude := 39.990821; cEnd.Longitude := -75.168428; TMSFNCDirections1.APIKey := ‘abc123’; TMSFNCDirections1.Service := dsGeoApify; TMSFNCDirections1.GetDirections(cStart, cEnd, procedure(const ARequest: TTMSFNCDirectionsRequest; const ARequestResult: TTMSFNCCloudBaseRequestResult) var it: TTMSFNCDirectionsItem; I: Integer; p: TTMSFNCOpenLayersPolyline; Hours, Minutes: string; begin TMSFNCOpenLayers1.ClearPolylines; ListBox1.Clear; if ARequestResult.Success then begin if ARequest.Items.Count > 0 then begin TMSFNCOpenLayers1.BeginUpdate; it := ARequest.Items[0]; TMSFNCOpenLayers1.AddMarker(it.Legs[0].StartLocation.ToRec, ‘New York’, DEFAULTWAYPOINTMARKER); TMSFNCOpenLayers1.AddMarker(it.Legs[0].EndLocation.ToRec, ‘Philadelphia’, DEFAULTENDMARKER); Hours := IntToStr(Round(it.Duration / 60) div 60); Minutes := IntToStr(Round(it.Duration / 60) mod 60); p := TTMSFNCOpenLayersPolyline(TMSFNCOpenLayers1.AddPolyline(it.Coordinates.ToArray)); p.StrokeColor := gcBlue; p.StrokeOpacity := 0.5; p.StrokeWidth := 5; p.&Label.Text := FloatToStr(Round(it.Distance / 1000)) + ‘ km, ‘ + Hours + ‘ h ‘ + Minutes + ‘ min’; TMSFNCOpenLayers1.ZoomToBounds(it.Coordinates.Bounds.ToRec); TMSFNCOpenLayers1.EndUpdate; ListBox1.Clear; for I := 0 to it.Steps.Count – 1 do begin ListBox1.Items.Add(it.Steps[I].Instructions) end; end; end; end ); end; Available Now The TMS FNC Maps v2.4 update is available now for Delphi & Visual Studio Code (with TMS WEB Core). You can download the latest version and start using the new features right […]
In need of an intuitive way to generate Docx files with Delphi without having to install Microsoft® Word? TMS has you covered! With the latest release of TMS FNC WX Pack, we’ve added the new TTMSFNCWXDocx component which lets you generate Docx files on all platforms. We’ve added a lot of functionality to offer maximum flexibility and allow you to customize the document requirements. You can add: formatted text tables images table of contents headers footers bookmarks links page numbering Everything you’ll need to build your documents. It’s even possible to export the document structure to a JSON template. A template that can easily be modified and used to perform actions like mail merging. Creating a document The creation of the document is intuitive. you can work with predefined methods and properties to customize your document. You can see how to create a document in this video: Building a template Building a template is as simple as adding the fields you want to edit later and just set the ID of that field. You can later use this ID to search the document for the desired field. Using a template After creating a template you can use following code to generate an invoice. This is a code snippet from the advanced demo. This code loops over a dataset and creates for every customer their invoices. Customers.First; while not Customers.Eof do begin id := Customers.FieldByName(‘CustNo’).AsInteger; AsText(TMSFNCWXDocx1.FindByID(‘CustNo’) as TTMSFNCWXDocxChild).Text := IntToStr(id); AsText(TMSFNCWXDocx1.FindByID(‘Contact’) as TTMSFNCWXDocxChild).Text := Customers.FieldByName(‘Contact’).AsString; AsText(TMSFNCWXDocx1.FindByID(‘Company’) as TTMSFNCWXDocxChild).Text := Customers.FieldByName(‘Company’).AsString; AsText(TMSFNCWXDocx1.FindByID(‘Phone’) as TTMSFNCWXDocxChild).Text :=Customers.FieldByName(‘Phone’).AsString; AsText(TMSFNCWXDocx1.FindByID(‘FAX’) as TTMSFNCWXDocxChild).Text := Customers.FieldByName(‘FAX’).AsString; AsText(TMSFNCWXDocx1.FindByID(‘Addr1’) as TTMSFNCWXDocxChild).Text := Customers.FieldByName(‘Addr1’).AsString; AsText(TMSFNCWXDocx1.FindByID(‘Addr2’) as TTMSFNCWXDocxChild).Text := Customers.FieldByName(‘Addr2’).AsString; AsText(TMSFNCWXDocx1.FindByID(‘Zip’) as TTMSFNCWXDocxChild).Text := Customers.FieldByName(‘Zip’).AsString; AsText(TMSFNCWXDocx1.FindByID(‘City’) as TTMSFNCWXDocxChild).Text := Customers.FieldByName(‘City’).AsString; AsText(TMSFNCWXDocx1.FindByID(‘Country’) as TTMSFNCWXDocxChild).Text := Customers.FieldByName(‘Country’).AsString; t := AsTable(TMSFNCWXDocx1.FindByID(‘Items’) as TTMSFNCWXDocxChild); toPay := 0; orders.Filtered := False; Orders.Filter := ‘CustNo = ‘ + IntToStr(id); Orders.Filtered := true; Orders.First; t.Rows.Clear; while not Orders.Eof do begin tr := t.AddRow; tc := tr.AddCell; p := tc.AddParagraph; p.AddText(Orders.FieldByName(‘ItemNo’).AsString); tc := tr.AddCell; p := tc.AddParagraph; p.AddText(Orders.FieldByName(‘Description’).AsString); tc := tr.AddCell; p := tc.AddParagraph; p.AddText(Orders.FieldByName(‘ItemsTotal’).AsString); tc := tr.AddCell; p := tc.AddParagraph; p.AddText(Orders.FieldByName(‘ItemPrice’).AsString); tc := tr.AddCell; p := tc.AddParagraph; p.AddText(Orders.FieldByName(‘ItemTotalPrice’).AsString); toPay := toPay + Orders.FieldByName(‘ItemTotalPrice’).AsFloat; Orders.Next; end; AsText(TMSFNCWXDocx1.FindByID(‘TotalToPay’) as TTMSFNCWXDocxChild).Text := FloatToStr(toPay); TMSFNCWXDocx1.GetDocxAsFile(TPath.Combine(pth,’Invoice’ + IntToStr(id) + ‘.docx’)); Customers.Next; end; This will generate the following document on the right from the template on the left. Available Today! The TTMSFNCWXDocx component is available in the latest update, available today. So go ahead and download the latest version of the TMS FNC WX Pack. The TMS FNC WX Pack is part of the FNC family, so as a reminder, below is an overview of what FNC has to offer. TMS FNC Components can be used simultaneously on these frameworks TMS FNC Components can be used simultaneously on these operating systems/browsers TMS FNC Controls can be used simultaneously on these IDEs
In this free webinar on January 27 from 4PM to 5PM UTC, hosted at https://www.tmswebacademy.com, meet TAdvStringGrid, a feature packed grid workhorse for Delphi VCL applications.With little to no code, this grid allows to import/export data in various formats sort filter print or generate a PDF file group hide rows and/or columns render mini HTML formatted text in cells add various graphics types in cells edit with various inplace editors visualize data in various ways perform drag & drop with other controls or applications, merge cells perform calculations much more… This is mostly YOUR webinar, as your host Bruno Fierens, CTO at tmssoftware.com will prepare the content based on your the topics you send in as well as questions asked live during the webinar. Make sure to send topic suggestions for the VCL Grid to be covered to info@tmssoftware.com and make sure to attend the webinar live so you can interact live!This webinar is aimed at developers new to the VCL grid or with intermediate knowledge about it. Register now! Sign up for this webinar today and make sure to attend live on January 27 from 4PM to 5PM UTC (17h00 – 18h00 CET)
New version 3.2 of TMS Analytics & Physics library introduced FNC components for creating math applications with minimal code writing. The previous article described how to implement curve fitting. In this article, we’ll continue the theme and explain some advanced features for function approximation. Generally, we use some standard basis functions for curve fitting: Fourier basis (sine and cosine functions), polynomials, exponent functions, and so on. In rare cases, we need specific basis functions to approximate the data. The TMS FNC math components provide a straightforward way to create a basis with any set of functions. Moreover, we can develop and test the basis right in design time. The component for creating a basis with a set of user-defined functions is TFNCLinearBasis1D. The component provides the following published properties: Variable (TVariableProperty) – provides the name of the variable for the basis functions. Coefficient (TVariableProperty) – provides the name of the coefficient for the fitting problem. Order (integer) – number of basis functions for approximation (read-only). Expression (string) – math expression of the constructed function (read-only). Parameters (TParameterCollection) – a set of parameters for parametric basis functions. Functions (TParameterCollection) – a set of functions to construct the basis. The two last properties provide the functionality to construct an arbitrary basis. With the Parameters property, you can add named values into the math environment and then use them to parametrize the set of basis functions. The Functions property allows to add, edit, and delete functions via standard Delphi collection editors. The collection contains items of TFormulaProperty type. When you add an item to the collection you can edit it with the Object Inspector as shown in the picture below. The class TFormulaPropery has several properties and a built-in mechanism to check the function for correctness. If you input a math expression that is not valid in the current context, the Error property will indicate what is wrong in the formula. An example is shown in the following picture. For our example, we created the collection with three basis functions: ‘1’, ‘log{2}(x/A)’ (logarithm to the base 2), and ‘P{3 2}(x/A)’ (associated Legendre polynomial of 3-rd degree and 2-nd order). Then, following the instructions described in the previous article, we added a data source, an approximated function, and a plotter to draw the function on the FNC chart. The final resulting FMX form at design time is shown in the picture below. The main advantage of using the FNC math components is that you can select appropriate basis functions without running the application. At design time you can change parameter values and math expressions of basis functions. The changes will immediately affect the approximated function and you can see as the fitted curve looks on the FNC chart. Also, you can verify that the approximation succeeded by looking at the properties of the approximated function, as shown in the following picture. Another feature of the FNC math components is that they work with symbolic data representation. Although the approximation uses discrete data as input, the result is a symbolic expression of the curve. So, we can use this expression for some advanced analysis. For example, we can evaluate the derivative of the function. The TFNCApproxFunction1D is a descendant of the TFNCBaseFunction1D class. Thus, we can use the same approach, as described in this […]
The daily chore easily makes one forget the milestones reached and the goals ahead. As such, it is good, with the start of the New Year, to look back of what has been achieved in the past year and set the goals for the new year. First of all, let me wish you a great new year 2022! I made a habit of wishing friends & relatives “to maximize the number of happy days in the new year“. Good health, success, good relationships, interesting work, achievements, luck, new experiences all contribute to happiness. So, when you can maximize the number of happy days in 2022, it is very likely you’ll be blessed with a mix of these things! At the same time, only in utopia, every day will be filled with happiness, so it also helps being prepared for some less successful days. 2021 Looking back at our milestones & achievements in 2021 actually positively surprised me. Even when we often get the impression that on a daily basis, we sometimes spend a lot of time fighting all kinds of little or big technical issues and have the impression we only move forward in baby steps, when looking at it in the scope of a full year, it appears a lot has been done. A summary Release of TMS Web Academy In the beginning of 2021, we launched our new platform TMS Web Academy, which is an online platform for bringing webinars to you where you can learn everything about our products. Since its launch, we already organized about 20 webinars that were free to attend. If you missed these, the replays are here. Of course, we continue along this path with new webinars for 2022 we’ll shortly present. TMS Web Academy proved to be a welcomed replacement for live events we could not hold due to covid-19 as well as a way to reach more developers world-wide. Launch of TMS Miletus Miletus is our technology that enables you to create cross-platform desktop applications created with a single code-base and using web technology. Not only did we achieve to bring application generation for Windows, Linux and macOS from just your Delphi IDE running on Windows, we added to that also the Raspberry Pi OS target and we also added support in TMS WEB Core for Visual Studio Code. With Visual Studio Code, you can generate these types of applications directly from your favorite Windows, macOS or Linux machine. Launch of TMS FNC WX Pack A completely new product saw the light in 2022, the TMS FNC WX Pack. TMS FNC WX Pack offers functionality that is hard to find or not existing for Delphi developers based on existing and proven web technology libraries. This includes so far a WYSIWYG HTML editor, an OCR tool, QR & barcode generation & detection, JSON data formatter,… and more is coming for 2022. High DPI to TMS FNC UI Pack With the release of Delphi 11 running in high DPI on Windows, it was critical to also bring full high DPI support in TMS FNC UI Pack. TMS FNC UI Pack is our universal (cross-platform/cross-framework) UI control bundle for VCL/FMX/LCL and TMS WEB Core. Our FNC UI controls were already looking crisp in FireMonkey apps, but now they also do in VCL high DPI […]
We kick of the New Year with the first of “How it works with Holger” for 2022 and this first one this year is about using base64 encoded data.With REST APIs, JSON data, web client apps, string encoded binary data in URLs… ever more prominent in software developments, the use of base64 encoded data is everywhere. So, our colleague Dr. Holger Flick explains how you can use base64 encoded data with newer versions of Delphi out of the box and how the TMS FNC Utility library in TMS FNC Core goes a step beyond to make your life easier. Enjoy this first video of the year and watch for many more to come: Your idea could be on the next “How it works with Holger”! Submit your ideas here as comments or send us an email. Our list of subjects is growing. Your suggestion could be on it soon.
Just before the year closes, we’d like to share a new episode in the “How it works” series with Holger Flick. This series is created to show you how you can do more with Delphi and TMS components. First Holger introduces two new exciting components added to the TMS FNC WX Pack: the barcode and the QR code decoder components: and of course, the “How it works” video explains in detail how you can create a Delphi application that uses the QR code decoder component and use it to extract information from a QR code image file: TMS FNC WX Pack The TMS FNC WX Pack is all about leveraging existing, reliable, proven web technology in any type of Delphi app, be it a Windows VCL app, a cross-platform FireMonkey app or a TMS WEB Core web client application. It already comes with a HTML editor, a PDF viewer, an OCR component, a JSON formatter and a barcode or QR code generator. In our lab, the next series of breathtaking components are already in development that will join the TMS FNC WX Pack family in 2022! Watch the TMS FNC WX Pack introduction video again for more info. Learn more! Like to learn more about Delphi and TMS components? Consider also the books our colleague Holger Flick wrote for you. Get all the in-depth content on how to get more out of Delphi with TMS components while reading at your own pace. We made a convenient list of the books here from where you can add it to your basket in one-click. Be in touch! 2022 is nearby. Our team is extremely motivated to surprise you once more in the New Year with many exciting new developments. Let us know your wishes for 2022. We are eager to learn what you would like to see us doing in the New Year!
Invormațiile pe cale Dvs le introduceți în prezentul formular nu se păstrează online, dar se vor transmite direct la destinație. Mai multe informații găsiți în Politica Noastră de Confidentialitate
We use cookies to ensure that we give you the best experience on our website. If you continue to use this site we will assume that you are happy with it.