From the blog

Ext JS 7.5 Has Arrived!

The Sencha team is excited to announce the latest release of Ext JS version 7.5. On the heels of the 7.4 release which introduced highly requested features and upgrades including 4 new rich Grid features and quality improvements in both the toolkits, 7.5 includes many quality enhancements, usability improvements and fixes for customers reported issues. This article summarizes improvements and quality fixes in the 7.5 version of Ext JS.   Usability Improvements and Enhancements As part of the 7.5 release, we upgraded the Froala Editor and Font Awesome packages to the latest 5.14.4 version and provided out-of-the-box localization support for new grid features introduced for both the toolkits in 7.4 version, such as Multi-level Grouping, Summaries for groups and total, and Filterbar.  Froala Editor now includes track changes and markdown support. Shown: The list of Font Awesome icons, including the new icons introduced in the latest Font Awesome version (5.14.4). Showcasing the localization support of Hebrew language for new grid features introduced in the 7.4 version like filter bar, and multi level grouping and summaries.   Quality Improvements The 7.5 release includes more than 40 quality improvements for customer reported tickets. Some of the most notable improvements are for the following customer reported issues: The number column in the modern grid doesn’t have a renderer function/method.  Chart tooltips are triggered from the wrong location when innerPadding is used. pullrefresh plugin doesn’t fire load event on the bound store. Remote filters with gridfilter plugin ignores autoLoad: false. So, from 7.5 onwards, autoLoad config for store should be considered when remoteFilter/remoteSort is/are configured. If autoload:false/autoLoad is not configured and filters/sorters are set then the store won’t load until .load() is called initially. If the user wants the store to load automatically, the user has to set autoload:true config. Modern date picker not selecting the correct date. Modern combobox has multiple query issue when forceSelection:false, multiSelect: true and queryMode: ‘remote’.   Please refer to the Ext JS 7.5 release notes, for further details. Modern Toolkit – Grid Filter styling applied to the filtered column.   Version Support Support for Ext JS 7.5 in Sencha Upgrade Advisor, and Sencha Bridges (ExtReact, ExtAngular, and ExtWebComponents) has been provided. Please go to the Support Portal and download the latest versions.   What’s Next? Sencha Tools are following this release and will soon hit the market with the latest 7.5 support*. The work on Ext JS 7.6 is in full swing*! The Sencha team is pacing well on regular quarterly releases, and we are committed to delivering new features, quality, performance, usability enhancements, and improvements all along. Our goal is to provide you with continual support through quality and performance enhancements. If you have any feedback or questions, please drop in a note to us here or get in touch. *Features are not committed until completed and GA released.   Try Ext JS 7.5 We are working hard to serve our community better in all areas. Please do try out our new Ext JS 7.5:  Be sure to follow us on Twitter and our Youtube Channel for updates. Until next time, let’s build great apps and happy coding.    Looking to Upgrade to 7.5? The free-to-use Ext JS Upgrade Adviser tool helps identify code changes required to migrate to the latest Ext JS version. Give it a […]

Read More

Osaka event about using TMS WEB Core and using REST APIs on Dec 18

On 18 December in Osaka, Japan, there is an event for Japanese Delphi developers interested in using TMS WEB Core and creating REST APIs for use from a TMS WEB Core web client application. The event is offered as a hands-on event, where Delphi developers can bring their laptop and work on projects with TMS WEB Core shown during the event and create REST APIs to be used by the web client app. Some more background information about the organizer of the event and the experience with TMS WEB Core and REST API backends can be found here.  It is of course a great opportunity to meet fellow Delphi & TMS WEB Core developers and exchange tips & tricks among each other. We kindly invite everyone to this upcoming event! Event information and registration is available here: https://ishuprog.connpass.com/event/233617/  TMS customers in Japan will receive an email with information for free entry for this event!

Read More

FNC Math Components in TMS Analytics & Physics 3.2

TMS Analytics & Physics library is a set of classes that provide functionality for building powerful math applications with Delphi. In the new version 3.2 of the library, we introduced special FNC math components. The components bring new possibilities to develop and tune your math application in design-time with standard IDE tools. In this article, we’ll consider the base concepts of the FNC math components and provide information on how to work with functions, derivatives, and integrals. All FNC math components are nonvisual. Each component implements some math concept and provides properties to manipulate and tune it in design- and run-time. Let’s consider the following components: TFNCProvider – creates math environment; allows introducing variables and parameters for function evaluations, symbolic derivatives, and integrals. TFNCFunction1D – introduces a symbolic function of one variable; allows evaluating the function for the specified variable value. TFNCDerivative1D – introduces a symbolic derivative of a math expression; allows evaluating the derivative for the specified variable value. TFNCIntegral1D – introduces a symbolic integral of a math expression; allows evaluating the integral for the specified variable value. To begin any FNC math application we first need to put a TFNCProvider component on the form. The component has two published properties: Variables (TVariableCollection) – a collection of variables that can be used as arguments of functions. Parameters (TParameterCollection) – a collection of parameters that can be used in the math environment to build functions, derivatives, integrals, and other math expressions. When you put a TFNCProvider on the form in design-time, it automatically creates a default variable ‘x’ for your math application. You can change the name of the variable or add/delete variables at design- and run-time. For the simplest math application, the default environment with one variable ‘x’ is enough. So, let’s go forward and consider the next FNC component TFNCFunction1D and its properties: Provider (TFNCProvider) – a math environment for the function. Variable (TVariableProperty) – a variable specifying the argument of the function. Formula (TFormulaProperty) – a formula specifying the math expression of the function. Placing a TFNCFunction1D on the form, it assigns the default value ‘x’ to the Variable property. We need to set up the Provider property and the expression for the Formula property, say ‘5*sin(6*x)’ in the Object Inspector. The resulting properties are shown in the picture below:  The function is ready to use. What can we do with it? The first idea is to draw the function and see what it looks like. We have the TFNCFunction1DPlotter component especially developed for this purpose: TFNCFunction1DPlotter – a binding for an FNC function component and an FNC Chart; allows drawing any FNC function on the chart. The component has several published properties that we can use to tune it and show a function on the FNC Chart: Provider (TFNCProvider) – a math environment for the component. Min (TValueProperty) – the minimal value of the variable range to plot the function. Max (TValueProperty) – the maximal value of the variable range to plot the function. PointCount (Integer) – number of points to plot the function. AFunction (TFNCBaseFunction1D) – a FNC function to plot. AssignLegend (Boolean) – if true, assigns the function’s expression to the serie’s legend. Chart (TTMSFNCChart) – an FNC chart to draw the function. First, we need to assign the appropriate Provider property. The Min […]

Read More

Promoția de Iarnă RAD Studio și Delphi

Sărbătorile de Iarnă bat la ușă! Oferim discounturi  de  până la 35% pentru soluțiile Dvs preferate! Anul acesta, bucură-te și mai mult de venirea Sărbătorilor de Iarnă! Am pregătit reduceri la mai multe produse Embarcadero pentru ca afacerea ta să primească un impuls suplimentar pentru următorul an! Contactează echipa Dimensional Data în perioada 13 – 30 Decembrie 2021 și profită de reducerile de până la 35% la toate produsele Embarcadero!  20% REDUCERE la RAD Studio 11 și Delphi 11 – ediția Professional 30% REDUCERE la edițiile Enterprise și Architect ale Delphi 11 și RAD Studio 11! 35% REDUCERE pentru C++ Builder 11 edițiile Professional, Enterprise și Architect! Contactați echipa noastră pentru informații suplimentare și prețuri promoționale la IDE RAD Studio, Delphi și C++ Builder! Tel: +40 771 098 621 sau vanzari@d-data Solicitare Ofertă Completați formularul de mai jos pentru o ofertă personalizată. Terms & Conditions: Oferta valabilă în perioada 13 Decembrie 2021 – 30 Decembrie 2021. Oferta disponibilă doar la achiziția soluțiilor RAD Studio, Delphi și C++Builder 11 Alexandria (All Editions). Tipuri de licențe incluse în promoție – ESD, Network Named, Concurrent. Academic licenses și maintenance renewals,nu fac parte din aceasta ofertă. Embarcadero își rezervă dreptul de a modifica, anula sau amâna oricând prezenta ofertă Prezenta ofertă nu este aplicabilă daca contravine legislației locale. Se pot aplica restricții adiționale. Cum beneficiați de ofertă: Solicitați o ofertă partenerului local Embarcadero și plasați comanda înainte de data de încheiere a promoției

Read More

Unit testing comes to TMS WEB Core

Let’s come straight to the point. Writing unit tests is a chore and having unit tests is a blessing. We all want to have the blessing, so with integrated unit testing in TMS WEB Core, we tried to minimize the chore. For unit testing to cover real usage scenarios, it is necessary to run the unit tests on the ‘operating system’ where the web application will run, that is the web browser. After all, all TMS WEB Core apps, and thus your code, will run in the browser, will involve dealing with the browser DOM and browser APIs, it is only logical that a TMS WEB Core unit test runs as a web app in the browser. It also means having the ability to deal with a typical web app world phenomenon and that is asynchronous behavior.  Introducing unit testing now integrated from TMS WEB Core v1.9.5.0. To start a new unit test project, create this from the Delphi IDE wizard and it creates a test project with one unit containing one test class with one test method. It allows you to fully focus on writing the test classes with their test methods. In the project manager, it looks like: and the code generated is: Notice in the code the attribute [TestFixture] on the test classes and the attribute [Test] on the test methods. A class can obviously contain as much test methods as you want and you can register as much test classes as you want with a call to TTMSWEBUnitTestingRunner.RegisterClass(). For the feedback when running the test application, use the Assert class.  When running this application, the test application in the browser behaves in the following way: Asynchronous behavior in the browser Now, how can we deal with typical asynchronous behavior in the browser and still test it properly? Well, for any asynchronous behavior in the browser, decorate the test method using it with the [Async] attribute. Then you can use the await() function to wait for the asynchronous response of the call.  This sample code demonstrates this: TMyTestClassUnit1 = class(TObject) published   //This is an async test method   [Test] [async]   procedure TestAsync; end; procedure TMyTestClassUnit1.TestAsync; var   wr: TWebHttpRequest;   res: TJSXMLHttpRequest;   js: TJSONObject; begin   wr := TWebHttpRequest.Create(nil);   wr.URL := ‘https://download.tmssoftware.com/tmsweb/1.json’;   res := await(TJSXMLHttpRequest, wr.Perform);   js := TJSONObject(TJSONObject.ParseJSONValue(res.responseText));   // response value for userId should be ‘1’   Assert.AreEqual(js.GetJSONValue(‘userId’),’1′); end; Testing JavaScript directly When you use external JavaScript libraries that you also want to involve in a test, there are several ways you can do this. You might have an Object Pascal wrapper class for JavaScript objects that you use in your test method but it could be as simple as calling the JavaScript directly from an ASM code block (a block with embedded JavaScript code within your Object Pascal code).  This is a very simple example of directly calling the JavaScript window prompt function to get a user input: procedure TMyTestClassUnit2.TestIntToStr; var   s: string; begin   asm     s = window.prompt(‘Please give your name’);   end;   Assert.AreEqual(‘Bruno’, s); end; The result in the browser when running this test becomes: A video introduction Follow unit testing step by step as our colleague Holger Flick explains in this YouTube video: Get started Go to the next level of […]

Read More

It’s that time of the year again!

Let’s celebrate this holiday season and end the year on a positive note. During December 2021 only, TMS is doing an extra effort and offers everyone special upgrade prices. Upgrade your licenses to TMS ALL-ACCESS bundle today, before 2022 price adaptions! Get full access with:  Easy plan: All current and new products for 1 price! Easy renewal: Yearly renewal only for 495 EUR! Easy install: all products accessible via TMS Subscription Manager tool Easy support: Full online support center access to all areas Easy up-to-date: Early access to product betas Easy learning: Access to TMS WEB Academy Act now! If you would like to continue to benefit from our priority support services and development on new and existing components, we have special upgrade offers for you! Contact sales@tmssoftware.com for the best discount upgrade offer for TMS ALL-ACCESS, depending on your currently purchased products. Take advantage of upgrade discounts now and be safe against future price adaptions!Please note this offer is valid until December 31, 2021!

Read More

Extjs Tutorial For Beginners: 10 Things I Wish I’d Known Earlier

  ExtJS or Extended JavaScript is a comprehensive JavaScript framework developed by Sencha for building comprehensive web and mobile applications. Today, you can use more than 140+ UI components like calendars, grids, trees, lists, forms, menus, toolbars, panels, windows, and hundreds of different extensions. So are you someone who is looking to build stunning web and mobile UIs using ExtJS? Then stop for a while and read through my introspection about what I wish I had known before starting this awesome journey. Why do I need to know JavaScript and OOP? To get started with ExtJS, you need basic HTML, CSS, and JavaScript programming. But, it is really helpful if you have a general idea of object-oriented programming (OOP) concepts and how to reuse code with them.  Especially if you come from a different programming background like C, C++, or Java, learning Javascript will make things much clearer when working with Ext Js. Finding an ExtJs tutorial for beginners is really helpful. Ext Js takes a Javascript first approach to reuse code with classes, similar to HTML elements and containers. So if you do not understand OOP concepts in Javascript, make sure to brush up your skills with some ebooks, tutorials, or online courses. Why is Sencha Cmd important? Sencha Cmd is the tool that automates your Sencha Ext JS applications from creating your initial project structure to generating deployable apps. Therefore, it is imperative to know about Sencha cmd, what it does and how to use it. Make sure to read through the Sencha Cmd to get familiar with it before starting development. How can I speed up the development? If you want to spend less time on manual coding and accelerate your development, consider using Sencha Architect so that you can build UIs using drag and drop features. The code that automatically generates is optimized for high performance, and you can avoid errors you do when coding manually.  How can I use the MVC design pattern? With a basic understanding of Javascript and OOP concepts, understanding Javascript design patterns is also important. Ext Js uses Model View Controller (MVC) design pattern from which its project structure has been formulated. Although it is not a must to use, I recommend better organizing your project structure. To work with MVC, know where to place your code for your UI, data, and the controller logic in your application. Therefore, it is good to know how  MVC works together to create a working web application in Ext Js.  Where to use the MVVM design pattern? Another design pattern you must be aware of is MVVM which stands for Model–View–ViewModel. Unlike MVC, the execution entry point of MVVC is the view, and it separates the development of UI using a mark-up language. The ViewModel uses the data binding technique to coordinate changes between the data model and the view. So know where to use MVC and MVVM based on what you will develop. Is implementing routing at the beginning a good idea? If you are using forward and back buttons for your website users, you will need to support routing in your application. You can use routing to track the state of your application, but it is not for storing session data. You can also create deep links to directly access a specific […]

Read More

How To Make A Fully Working Slack Bot In Under 10 Minutes

Slack is one of the leading communication platforms for millions of users. You can send instant messages, share documents, share images, and perform many different actions which improve the collaboration between team members. You can also automate and control many outside processes and even smart hardware with Bots in Slack. The best thing of all is you can create Slack bots VERY EASILY using RAD Studio Delphi. What is SDriver? SDriver is a Delphi wrapper for Slack API by Andrea Magni who is one of our fabulous Embarcadero MVP team. SDriver is a free and open-source wrapper for Delphi developers. The best thing is that the wrapper utilizes the native HTTP client libraries for each supported platform – System.Net.HttpClient. SDriver is also implemented with the System. Threading library to work asynchronously. What are the features of SDriver? Compatible with FireMonkey, Visual Component Library, and also Non-visual components Support for Message Attachments Support for Incoming Webhooks Implemented using Native HTTP Client Libraries Async implementation using Parallel Programming Library What are Incoming Webhooks? Incoming Webhooks are a simple way to post messages from apps into Slack. By creating Incoming Webhooks you get a unique URL which you can send a JSON payload with the message text and some options. Andrea’s source code repository contains links to explain this in more depth as does the official Slack website. POST https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX Content-type: application/json { “text”: “Hello, world.” } POST https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX Content–type: application/json {     “text”: “Hello, world.” } implementation {$R *.dfm} uses System.Diagnostics , SDriver.Message, SDriver.Interfaces, SDriver.IncomingWebHook; procedure TForm1.SendActionExecute(Sender: TObject); var LWebHook: IMessageBuffer; LMessage: IMessage; LStopWatch: TStopWatch; begin LStopWatch := TStopWatch.StartNew; LMessage := TMessage.Create(EditMessage.Text + ‘ [‘ + TimeToStr(Now) + ‘]’); LMessage.UserName := EditUserName.Text; LMessage.Icon_URL := EditIcon_URL.Text; LMessage.Icon_Emoji := EditIcon_Emoji.Text; LMessage.Channel := EditChannel.Text; LWebHook := TIncomingWebHook.Create(EditWebHookURL.Text, False); LWebHook.Push(LMessage); LWebHook.Flush; end; procedure TForm1.SendActionUpdate(Sender: TObject); begin SendAction.Enabled := (EditWebHookURL.Text ”) and (EditMessage.Text ”); end; 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 31 32 implementation   {$R *.dfm}   uses   System.Diagnostics , SDriver.Message, SDriver.Interfaces, SDriver.IncomingWebHook;   procedure TForm1.SendActionExecute(Sender: TObject); var   LWebHook: IMessageBuffer;   LMessage: IMessage;     LStopWatch: TStopWatch; begin   LStopWatch := TStopWatch.StartNew;     LMessage := TMessage.Create(EditMessage.Text + ‘ [‘ + TimeToStr(Now) + ‘]’);   LMessage.UserName := EditUserName.Text;   LMessage.Icon_URL := EditIcon_URL.Text;   LMessage.Icon_Emoji := EditIcon_Emoji.Text;   LMessage.Channel := EditChannel.Text;     LWebHook := TIncomingWebHook.Create(EditWebHookURL.Text, False);   LWebHook.Push(LMessage);   LWebHook.Flush; end;   procedure TForm1.SendActionUpdate(Sender: TObject); begin   SendAction.Enabled := (EditWebHookURL.Text > ”) and (EditMessage.Text > ”); end; Check out the SDriver now! Do you want to see how fast development with RAD Studio and Delphi can be – why not download a free trial now?

Read More

This Is How To Outsmart Your Peers On Automation

What is Industrial Automation? Industrial automation is the technology by which a process or procedure is performed with minimal human assistance. For instance: Machinery, processes in factories, boilers, and heat-treating ovens Steering and stabilization of ships Aircraft and other applications and vehicles with reduced human intervention All sorts of machinery are examples of automation. The common control types are On/Off which is discrete it’s either doing it or it’s not doing it. There’s PID (proportional integral derivative) which is interesting, and logical sequence or state system control – “moving from step A to step B” types of activities. What does lab monitoring and instrumentation mean? Lab monitoring and instrumentation is just the process of reading sensors to collect information from devices that define physical qualities. For example, in a lab, if you’re experimenting and you need to know what the state is of the experiment at all times as you’re collecting data. In industry, an example would be if you need to be monitoring machinery and make sure they are working properly. There are some examples of the type of settings information you may be gathering through monitoring or instrumentation. What single board devices are available for starting automation? Thousands of different single-board computers can be utilized in automation. Typically, these devices have an interface called ‘GPIO’ pins on them. These pins can, for example, be attached to and thus read and write various sensors. Here are some examples of single-board devices: UDOO x86 II – Intel Celeron N3160 2.24Ghz UP Board – Intel Atom x5-78350 LattePanda Delta 432 – Intel 8th Gen Celeron N4100 Atomic Pi – Intel Atom x5-78350 quad-core with 2M Cache What is a PID Controller? Essentially a PID Controller creates a control/loop mechanism to use feedback for continuous correction. This means is it measures the performance of the control system.  PID – AKA “Three-term controller” A control loop mechanism employing feedback for continuous correction For example, cruise control on a car. What is a Programmable Logic Controller (PLC)? A PLC is a programmable logic controller – this is similar to Arduino.  Ruggedized industrial digital computer Replaces hardwired relays Makes use of multiple digital and analog I/O Function as a real-time system collecting information and constantly correcting operations Similar o Remote Terminal Units except RTUs do not have control loops or algorithms Often networked together with other PLC and SCADA systems One of three common Industrial Control Systems with SCADA and Distributed Control System (DCS)  What communication libraries are available for Delphi & C++ Builder? AsyncPro – https://github.com/TurboPack/AsyncPro ComPort Library – https://sourceforge.net/projects/comport/ WinSoft ComPort – https://winsoft.sk/comport.htm TciaComPort – https://www.mestdagh.biz/ ZylSerialPort – https://www.zylsoft.com/serialport.htm Moreover, when you install Delphi and C++ Builder these components will be installed: Indy Components THTTPClient TBluetoothDevice TBluetoothLEDevice What is Visuino? Visuino or Visuino Pro is visual programming for Arduino and PLC. It is built by Boian Mitov who is the founder of Mitov Software. Besides Visuino, Mitov Software offers a set of components and libraries like: ControlLab for industrial automation components SignalLab for digital signal processing (DSP) LogicLab, Plotlab, and more Visuino Pro is designed around the additional use case as additional functionality that comes with programmable logic controllers. It also has the ability that you can see the code that it’s going to generate back and forth.  Graphical development environment for Arduino Automatically […]

Read More

Google Places and Polyline Symbols in TMS FNC Maps

Introducing Google Places and polyline symbols support in TMS FNC Maps v2.4. Google Places AutoComplete The AutoComplete function provides suggestions based on a partial keyword search, usually provided by the end user. The results can be updated and displayed on the fly while the user is typing.The following example uses the TTMSFNCEdit component, available separately in TMS FNC UI Pack, to display the AutoComplete results in a dropdown panel. Thanks to the powerful combination of the TTMSFNCEdit and the synchronous GetAutoCompletSync call from TTMSFNCPlaces this can be achieved with a single line of code: procedure TForm1.TMSFNCEdit1LookupNeedData(Sender: TObject; Value: string; List: TStrings; var ItemIndex: Integer); begin List.Assign(TMSFNCPlaces1.GetAutoCompleteSync(Value)); end; Note: The AutoComplete functionality from Azure, Bing, Here and GeoApify is supported as well. Places Search The TTMSFNCGooglePlaces nearby search allows to search for specific places near a given location.This example displays a subset of the pharmacies found in the center of New York city. This is how the code looks: procedure TForm1.Button1Click(Sender: TObject); var c: TTMSFNCMapsCoordinateRec; begin c.Latitude := 40.7127753; c.Longitude := -74.0059728; TMSFNCGooglePlaces1.SearchNearby(c, ‘pharmacy’); end; procedure TForm1.TMSFNCGooglePlaces1SearchNearby(Sender: TObject; const ARequest: TTMSFNCPlacesRequest; const ARequestResult: TTMSFNCCloudBaseRequestResult); var I: Integer; begin for I := 0 to ARequest.Items.Count – 1 do begin m := TMSFNCGoogleMaps1.AddMarker(ARequest.Items[I].Coordinate.ToRec); m.AddOverlayView(ARequest.Items[I].Description); m.IconURL := ARequest.Items[I].Icon; m.DefaultIconSize := False; m.IconWidth := 32; m.IconHeight := 32; end; end; Polyline Symbols Another often requested feature was to have an option to add a direction indicator to a polyline. Polyline symbols provide a fully customizable way to achieve this. Here are a few examples that demonstrate how polyline symbols can be used in combination with Google Maps. This example shows a red closed arrow repeated every 50 pixels on a blue polyline. var ar: TTMSFNCMapsCoordinateRecArray; p: TTMSFNCGoogleMapsPolyline; ps: TTMSFNCGoogleMapsPolylineSymbol; begin TMSFNCGoogleMaps1.BeginUpdate; SetLength(ar, 3); ar[0].Latitude := TMSFNCGoogleMaps1.Options.DefaultLatitude – 0.1; ar[0].Longitude := TMSFNCGoogleMaps1.Options.DefaultLongitude – 0.1; ar[1].Latitude := TMSFNCGoogleMaps1.Options.DefaultLatitude + 0.1; ar[1].Longitude := TMSFNCGoogleMaps1.Options.DefaultLongitude + 0.1; ar[2].Latitude := TMSFNCGoogleMaps1.Options.DefaultLatitude – 0.1; ar[2].Longitude := TMSFNCGoogleMaps1.Options.DefaultLongitude + 0.1; p := TMSFNCGoogleMaps1.AddPolyline(ar); p.StrokeColor := gcBlue; ps := p.Symbols.Add; ps.Path := spForwardClosedArrow; ps.StrokeColor := gcRed; ps.RepeatSymbol := 50; TMSFNCGoogleMaps1.EndUpdate; end; This example shows how to use multiple symbols simultaneously including a symbol defined with a custom SVG path. var ar: TTMSFNCMapsCoordinateRecArray; p: TTMSFNCGoogleMapsPolyline; ps: TTMSFNCGoogleMapsPolylineSymbol; begin TMSFNCGoogleMaps1.BeginUpdate; SetLength(ar, 3); ar[0].Latitude := TMSFNCGoogleMaps1.Options.DefaultLatitude – 0.1; ar[0].Longitude := TMSFNCGoogleMaps1.Options.DefaultLongitude – 0.1; ar[1].Latitude := TMSFNCGoogleMaps1.Options.DefaultLatitude + 0.1; ar[1].Longitude := TMSFNCGoogleMaps1.Options.DefaultLongitude + 0.1; ar[2].Latitude := TMSFNCGoogleMaps1.Options.DefaultLatitude – 0.1; ar[2].Longitude := TMSFNCGoogleMaps1.Options.DefaultLongitude + 0.1; p := TMSFNCGoogleMaps1.AddPolyline(ar); p.StrokeColor := gcBlue; ps := p.Symbols.Add; ps.Path := spCustom; ps.CustomPath := ‘M -2,-2 2,2 M 2,-2 -2,2’; ps.Scale := 3; ps.Offset := 50; ps.RepeatSymbol := 50; ps.StrokeOpacity := 0.5; ps := p.Symbols.Add; ps.Path := spCircle; ps.Offset := 0; ps.RepeatSymbol := 100; ps.RepeatSymbolUnits := unPercentage; ps.Scale := 10; ps.StrokeWidth := 2; ps.StrokeColor := gcRed; ps.FillColor := gcRed; ps.FillOpacity := 1; TMSFNCGoogleMaps1.EndUpdate; end; Note: Polyline symbols are currently only available for the Google Maps mapping service. 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 away!

Read More