Noutați

Modernize Your Multi-Device Fire Monkey App Easy To Use Card View Wizard Layout Template

User experience is the key thing to be considered while building a modern Multi-Device application. Lots of layout templates were available in GetIt Package Manager to design responsive, ultra-modern, cross-platform FireMonkey applications. This post helps to understand one of the FireMonkey Layout templates the Card View Wizard. Card View Layout Template is a Fire Monkey template that incorporates a number of card view pages that can be navigated forward and backward though one would use this as an in-app tutorial. How to install: You can easily install this IDE Plugin from GetIt Package Manager. The steps are as follows. Navigate In RAD Studio IDE->Tools->GetIt Package Manager->select Sample Projects in Categories-> Card View Wizard 1.0 by Embercadero Technologies and click Install Button. Read the license and Click Agree All. An Information dialog saying ‘Requires a restart of RAD studio at the end of the process. Do you want to proceed? Click yes and continue. It will download the plugin and installs it. Once installed Click Restart now. GetIt – Card View Wizard 1.0 Card View Wizard Sample App Implementation Details: Car View Wizard Sample app contains, a TTabControl with a list of TabItems in it. Each TabItem is placed with an instance of TFrameCard defined in uCardFrame.pas. TFrameCard can set CardTitle, CardText, and Configure card with CardLayout Text image. procedure TMainForm.FormCreate(Sender: TObject); begin {$IFDEF FIRSTSET} // first set FrameCard1.SetCardTitle(WIZARD_TITLE_1); FrameCard1.SetCardText(WIZARD_TEXT_1); FrameCard1.ConfigureCard(TCardButton.Inner, TCardBGImage.Inner, TCardLayout.TextImage); FrameCard2.SetCardTitle(WIZARD_TITLE_2); FrameCard2.SetCardText(WIZARD_TEXT_2); FrameCard2.ConfigureCard(TCardButton.Inner, TCardBGImage.Inner, TCardLayout.TextImage); FrameCard3.SetCardTitle(WIZARD_TITLE_3); FrameCard3.SetCardText(WIZARD_TEXT_3); FrameCard3.ConfigureCard(TCardButton.Inner, TCardBGImage.Inner, TCardLayout.TextImage); FrameCard4.SetCardTitle(WIZARD_TITLE_4); FrameCard4.SetCardText(WIZARD_TEXT_4); FrameCard4.SetNextButtonText(WIZARD_NEXT_BUTTON_4); FrameCard4.ConfigureCard(TCardButton.Inner, TCardBGImage.Inner, TCardLayout.TextImage); {$ENDIF} WizardTabControlChange(Sender); 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 procedure TMainForm.FormCreate(Sender: TObject); begin   {$IFDEF FIRSTSET}   // first set   FrameCard1.SetCardTitle(WIZARD_TITLE_1);   FrameCard1.SetCardText(WIZARD_TEXT_1);   FrameCard1.ConfigureCard(TCardButton.Inner, TCardBGImage.Inner, TCardLayout.TextImage);     FrameCard2.SetCardTitle(WIZARD_TITLE_2);   FrameCard2.SetCardText(WIZARD_TEXT_2);   FrameCard2.ConfigureCard(TCardButton.Inner, TCardBGImage.Inner, TCardLayout.TextImage);     FrameCard3.SetCardTitle(WIZARD_TITLE_3);   FrameCard3.SetCardText(WIZARD_TEXT_3);   FrameCard3.ConfigureCard(TCardButton.Inner, TCardBGImage.Inner, TCardLayout.TextImage);     FrameCard4.SetCardTitle(WIZARD_TITLE_4);   FrameCard4.SetCardText(WIZARD_TEXT_4);   FrameCard4.SetNextButtonText(WIZARD_NEXT_BUTTON_4);   FrameCard4.ConfigureCard(TCardButton.Inner, TCardBGImage.Inner, TCardLayout.TextImage); {$ENDIF}     WizardTabControlChange(Sender); end; When the WizardTabControlChange event occurs the respective card is displayed with title text and background image. procedure TMainForm.WizardTabControlChange(Sender: TObject); var I: Integer; begin for I := 0 to WizardTabControl.TabCount-1 do begin if TTabItem(WizardTabControl.Tabs[I]).TagObject is TRectangle then begin TButton(TTabItem(WizardTabControl.Tabs[I]).TagObject).Visible := False; end; end; if WizardTabControl.TabIndex>-1 then if WizardTabControl.ActiveTab.TagObject is TRectangle then begin TButton(WizardTabControl.ActiveTab.TagObject).Visible := True; end; end; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 procedure TMainForm.WizardTabControlChange(Sender: TObject); var I: Integer; begin   for I := 0 to WizardTabControl.TabCount–1 do     begin       if TTabItem(WizardTabControl.Tabs[I]).TagObject is TRectangle then         begin           TButton(TTabItem(WizardTabControl.Tabs[I]).TagObject).Visible := False;         end;     end;   if WizardTabControl.TabIndex>–1 then     if WizardTabControl.ActiveTab.TagObject is TRectangle then       begin         TButton(WizardTabControl.ActiveTab.TagObject).Visible := True;       end; end; Card View Wizard 1.0 Demo Be sure to check out all the available sample applications here!

Read More

Learn About Using Alignment Support In C++Builder For Robust Windows Development

The alignment requirement of a type is a divisor of its size. For example, a class with size 16 bytes could have an alignment of 1, 2, 4, 8, or 16, but not 32. (If a class’s members only total 14 bytes in size, but the class needs to have an alignment requirement of 8, the compiler will insert 2 padding bytes to make the class’s size equal to 16.). C++11 standard intends to extend the standard language and library with alignment-related features. Querying the alignment of a type The alignment requirement of a type can be queried using the alignof keyword as a unary operator. The result is a constant expression of type std::size_t, i.e., it can be evaluated at compile time. #include int main() { std::cout #include int main() {     std::cout << “The alignment requirement of int is: “ << alignof(int) << ‘n’; } Possible output : The alignment requirement of int is: 4 Controlling alignment The alignas keyword can be used to force a variable, class data member, declaration or definition of a class, or declaration or definition of an enum, to have a particular alignment, if supported. It comes in two forms: alignas(x), where x is a constant expression, gives the entity the alignment x, if supported.alignas(T), where T is a type, gives the entity an alignment equal to the alignment requirement of T, that is, alignof(T), if supported. If multiple alignas specifiers are applied to the same entity, the strictest one applies. In this example, the buffer buf is guaranteed to be appropriately aligned to hold an int object, even though its element type is unsigned char, which may have a weaker alignment requirement. alignas(int) unsigned char buf[sizeof(int)]; new (buf) int(42); alignas(int) unsigned char buf[sizeof(int)]; new (buf) int(42); alignas cannot be used to give a type a smaller alignment than the type would have without this declaration: alignas(1) int i; //Il-formed, unless `int` on this platform is aligned to 1 byte. alignas(char) int j; //Il-formed, unless `int` has the same or smaller alignment than `char`. alignas(1) int i; //Il-formed, unless `int` on this platform is aligned to 1 byte. alignas(char) int j; //Il-formed, unless `int` has the same or smaller alignment than `char`. Head over and check out more information about C++ alignment support in C++Builder.

Read More

Which App Security & Quality Analytics Should You Be Tracking?

Published December 2, 2020 WRITTEN BY THE KIUWAN TEAMExperienced developers, cyber-security experts, ALM consultants, DevOps gurus and some other dangerous species. As business management expert Peter Drucker once put it: “If you can’t measure it, you can’t improve it.” This quote feels right in place in the world of application security. Many CISOs are finally starting to give SAST tools and other approaches the attention they deserve. However, the only way to know if your approach works is by using app security and quality analytics.  While there are many security metrics you can track and assess, choosing the ideal ones for your company is of paramount importance. It’s the best way for CISOs, developers, and other stakeholders to gauge the application’s effectiveness and improve its efficiency. Why Application Security Analytics Matter Arguably the most important part of any application security plan is determining the key data analytics to track. For instance, many CISOs want to see a drop in the number of new malware attacks targeting an application (making this an important analytic to track). A drop in this figure over time shows an improvement in secure coding practices within the team. Allowing your security professionals to have access to real-time analytics is also important. It goes a long way to improving their efficiency.  Some of the analytics they should access with ease includes: Data regarding the type of threats being identified How they are discovered And the time it takes to remedy them.  Another thing to remember is that there is both direct and indirect analytics you can track. Direct analytics gauge the security of the program itself, such as the exact number of known threats. Indirect analytics go above and beyond the program and, instead, target practices, tools, and people. A blend of direct analytics and indirect analytics paints the most accurate picture of how your application security (AppSec) tools work. Without these analytics, CISOs will attempt to secure their programs blindly, with limited capacity to deliver quality business outcomes. Six AppSec Analytics To Improve Application Security & Quality 1. Total number of application threats and their severity This is arguably the most vital application security and quality metric for your organization.  It’s prudent to know the exact number of weaknesses present in an app, and more importantly — just how severe each threat is. Severity depends on the effect the weakness can have on the app (and the company at large) and how often it is likely to happen. The best way to pinpoint the biggest weaknesses is to leverage the outcomes from Dynamic Application Security Testing (DAST) tools and Static Application Security Testing Tool (SAST) tools like Kiuwan. Click here to read more about these testing tools. SAST tools single out potential threats in the source code, while DAST tools show you which of these weaknesses can actually lure attackers. Leveraging results from both SAST and DAST tools will enable you to draft a list of the weaknesses that pose the most significant threat to the program. Better yet, your team can use these analytics to identify issues that require immediate remediation. 2. Number of new threats detected In agile software development, new releases and updates are quite common. It’s vital to know the exact number of new threats discovered when a program is deployed. This analytic helps CISOs keep better track […]

Read More

Learn How To Build An Iterator Python Type For Delphi In This Windows GUI App

We are aware of how to use TStringList in Delphi. we learned how to create a Python type using Delphi classes. Thinking How to create an iterator in Delphi Which holds python objects? This post guide you to create a Python Type that contains a list of strings(python string objects) similar to TStringList. And a String List Iterator Python Type In Delphi to iterate the StringList Python Type easily in Delphi with Python4Delphi Sample App. Python4Delphi Demo28 Sample App shows how to create a StringList Python type, StringList Iterator Python Type in a Python Module, Import the module, and Iterator Python Types in a python script, create a Stringlist object and access some of the service routines like Iter, IterNext, etc. You can find the Demo28 source on GitHub. Prerequisites: Download and install the latest Python for your platform. Follow the Python4Delphi installation instructions mentioned here. Alternatively, you can check out this video Getting started with Python4Delphi. Components used in Python4Delphi Demo28 Sample App: TPythonEngine: A collection of relatively low-level routines for communicating with Python, creating Python types in Delphi, etc. It’s a singleton class. TPythonGUIInputOutput: Inherited from TPythonInputOutput (which works as a console for python outputs) Using this component Output property you can associate the Memo component to show the Output. TPythonModule: It’s inherited from TMethodsContainer class allows creating modules by providing a name. You can use routines AddMethod, AddMethodWithKW, AddDelphiMethod, AddDelphiMethodWithKeywords to add a method which should be type compatible with this routine parameter. You can create events using the Events property. TPythonType: This component helps to create a new python type in Delphi which is inherited from the hierarchy of classes (set of APIs to create, manage methods, and members). TMemo: A multiline text editing control, providing text scrolling. The text in the memo control can be edited as a whole or line by line. You can find the Python4Delphi Demo28 sample project from the extracted repository ..Python4DelphiDemosDemo28.dproj. Open this project in RAD Studio 10.4.1 and run the application. Implementation Details: PythonEngine1 provides the connection to Python or rather the Python API. This project uses Python3.9 which can be seen in the TPythonEngine DllName property. PythonGUIInputOutput1 provides a conduit for routing input and output between the Graphical User Interface (GUI) and the currentlyexecuting Python script. pmP4D with a Module name p4d is created. Python Type (ptStringList) with Type Name TStringList and Python type (ptStringListIterator) with Type Name TStringListIterator is created. Both Python Types Module Property is assigned with pmP4D. Each Python Type PyObjectClass is initialized with Delphi Python Type Class as shown below. procedure TForm1.ptStringListCreate(Sender: TObject); begin with Sender as TPythonType do PyObjectClass := TPyStringList; end; procedure TForm1.ptStringListIteratorCreate(Sender: TObject); begin with Sender as TPythonType do PyObjectClass := TPyStringListIterator; end; procedure TForm1.ptStringListCreate(Sender: TObject); begin   with Sender as TPythonType do     PyObjectClass := TPyStringList; end;   procedure TForm1.ptStringListIteratorCreate(Sender: TObject); begin   with Sender as TPythonType do     PyObjectClass := TPyStringListIterator; end; In this sample, TPyStringList overrides the Iter, Basic service of TPyObject, and Sequence Services such as SqLength, SqItem, SqAsItem. Using RegisterMethods exposed an Add method(Using this a string can be added to the string list). Used PyArg_ParseTuple to retrieve the arguments passed in python scripts. This class also has the property to return TStringList. function TPyStringList.add(args: PPyObject): PPyObject; var _obj : PPyObject; begin with GetPythonEngine do begin // We adjust the transmitted self argument Adjust(@Self); if PyArg_ParseTuple( args, ‘O:add’,@_obj ) 0 then begin Result := PyLong_FromLong(Strings.Add(PyObjectAsString(_obj))); end else […]

Read More

Learn How To Use Range Types On A PostgreSQL Database In Windows Using FireDAC With Delphi

 FireDAC represents a range type column as a ftADT field with 3 subfields: lbound – lower range bound. hbound – upper range bound. flags – range flags. Note: Columns of range type are read-only. This sample updates them using SQL commands. To get range column attributes, this sample uses the following code: var l: Xxxx; // … l := FDQuery1.FieldByName(‘.‘).AsXxxx; var l: Xxxx; // … l := FDQuery1.FieldByName(‘.‘).AsXxxx; Location You can find the Ranges project at: Start | Programs | Embarcadero RAD Studio Sydney | Samples and then navigate to: Object PascalDatabaseFireDACSamplesDBMS SpecificPostgreSQLRanges Subversion Repository: You can find Delphi code samples in GitHub Repositories. Search by name into the samples repositories according to your RAD Studio version. How to Use the Sample Navigate to the location given above and open PGRanges.dproj. Press F9 or choose Run > Run. Files File in Delphi Contains PGRanges.dprojPGRanges.dpr The project itself. fMain.pasfMain.fmx The main form. Implementation Before running the sample, the main components are configured at design time using the Object Inspector as follows: A TFDConnection object named FDConnection1. This is the FireDAC connection object that the sample uses to connect to a DBMS. The sample sets the ConnectionDefName property to PG_Demo. Note: You can change the ConnectionDefName property to connect to a different PostgreSQL server using a valid user name and password. A TFDQuery object named FDQuery1. This component implements a dataset capable of executing SQL queries. The sample sets: The Connection property to FDConnection1 in order to specify the FireDAC connection object. The SQL property with the following SQL SELECT statements that define different integer ranges: SELECT int4range(null,2000, ‘(]’) rng UNION ALL SELECT int4range(3000,4000, ‘[)’) rng UNION ALL SELECT int4range(5000,6000, ‘[]’) rng UNION ALL SELECT int4range(7000,null, ‘()’) rng UNION ALL SELECT int4range(20,20, ‘()’) rng SELECT int4range(null,2000, ‘(]’) rng UNION ALL SELECT int4range(3000,4000, ‘[)’) rng UNION ALL SELECT int4range(5000,6000, ‘[]’) rng UNION ALL SELECT int4range(7000,null, ‘()’) rng UNION ALL SELECT int4range(20,20, ‘()’) rng Notes: The parentheses or brackets of the third argument indicate whether the lower and upper bounds are exclusive or inclusive. “[” represents an inclusive lower bound while “(” represents an exclusive lower bound. The same way, “]” represents an inclusive upper bound while “)” represents an exclusive upper bound. If you omit the lower bound of a range, it means that all points less than the upper bound are included in the range. Likewise, if you omit the upper bound of the range, then all points greater than the lower bound are included in the range. If both lower and upper bounds are omitted, all values of the element type are considered to be in the range. A TDataSource object named DataSource1. This component provides an interface between a dataset component and data-aware controls on a form. In this sample, it is used to provide communication between the dataset and the grid where the dataset is displayed. To this end, the sample sets the following properties: The DataSet property of DataSource is set to FDQuery1. The DataSource property of DBGrid1 is set to DataSource1. When you run the application, you see: A TDBGrid that is used to display the different data ranges defined on the SQL command. Three TDBEdit components that are used to display the lbound,lbound and flags fields of the range type. Two TLabel components that are used to display the type of the range bounds. You can check the link below for more details about this sample: http://docwiki.embarcadero.com/CodeExamples/Sydney/en/FireDAC.PostgreSQL_Ranges_Sample Head over and check out the full source code for the PostgreSQL Ranges sample for Windows apps on GitHub or in your RAD Studio IDE samples section.

Read More

Quickly Build Enterprise-Grade Multi-Tier Solutions Using DataSnap In Delphi And C++

Al Mannarino walks you through how to build a DataSnap solutions project using the DataSnap Setup Wizard. Overview Wizards in the DataSnap Server category DataSnap WebBroker Application Wizard Main components and units Implement the DataSnap server functionality DataSnap Clients DataSnap Use Cases Mainly Delphi and C++ Builder developers utilize 3 major backend technologies: WebBroker – Web Server Application DataSnap – REST Backends RAD Server (EMS) – Most powerful services-based applications When to use DataSnap? A small number of concurrent clients Supports authentication and authorization Support for communication filters Compression and Encryption filters included Callback functionality – Servers can notify selected or all connected client applications by sending information to the callback channels that something interesting happened on the server FireDAC JSON reflection framework – This simplifies building client-server database applications.  If you want to learn how to use DataSnap in your projects, be sure to check out the full, Unleash The Power of Delphi with Delphi Labs DataSnap Series! Take a look at the fixes available in the RAD Studio 10.4 release for DataSnap. Looking for a REST based solution? Try RAD Server!

Read More

Learn About How To Redirect Inserting, Deleting And Updating Records In Delphi With FireDAC

This sample shows how to redirect inserting, deleting and updating records using standalone table adapter. Location You can find the Commands sample project at: Start | Programs | Embarcadero RAD Studio Sydney | Samples and then navigate to: Object PascalDatabaseFireDACSamplesDApt LayerCommands Subversion Repository: You can find Delphi code samples in GitHub Repositories. Search by name into the samples repositories according to your RAD Studio version. Files File in Delphi Contains Commands.dprojCommands.dpr The project itself. fCommands.pasfCommands.fmx The main form. Implementation The sample implements the following standalone table adapter features. Create table adapter var oAdapt: IFDDAptTableAdapter; begin // create table adapter FDCreateInterface(IFDDAptTableAdapter, oAdapt);   var     oAdapt: IFDDAptTableAdapter;   begin     // create table adapter     FDCreateInterface(IFDDAptTableAdapter, oAdapt); Selecting data with oAdapt do begin FConnIntf.CreateCommand(oComm); SelectCommand := oComm; SelectCommand.Prepare(‘select * from {id FDQA_map1}’); Define; Fetch; //…   with oAdapt do begin     FConnIntf.CreateCommand(oComm);     SelectCommand := oComm;     SelectCommand.Prepare(‘select * from {id FDQA_map1}’);     Define;     Fetch;   //… Redirect records Redirect all record inserts into FDQA_map2 table instead FDQA_map1: FConnIntf.CreateCommand(oComm); InsertCommand := oComm; InsertCommand.CommandText := ‘insert into {id FDQA_map2}(id2, name2) values(:NEW_id1, :NEW_name1)’;   FConnIntf.CreateCommand(oComm);     InsertCommand := oComm;     InsertCommand.CommandText := ‘insert into {id FDQA_map2}(id2, name2) values(:NEW_id1, :NEW_name1)’; Redirect all record deletes into FDQA_map3 table instead FDQA_map1: FConnIntf.CreateCommand(oComm); DeleteCommand := oComm; DeleteCommand.CommandText := ‘delete from {id FDQA_map3} where id3 = :OLD_id1’;     FConnIntf.CreateCommand(oComm);     DeleteCommand := oComm;     DeleteCommand.CommandText := ‘delete from {id FDQA_map3} where id3 = :OLD_id1’; Redirect all record updates into FDQA_map4 table instead FDQA_map1: FConnIntf.CreateCommand(oComm); UpdateCommand := oComm; UpdateCommand.CommandText := ‘update {id FDQA_map4} set id4 = :NEW_id1, name4 = :NEW_name1 where id4 = :OLD_id1’;   FConnIntf.CreateCommand(oComm);     UpdateCommand := oComm;     UpdateCommand.CommandText := ‘update {id FDQA_map4} set id4 = :NEW_id1, name4 = :NEW_name1 where id4 = :OLD_id1’; Add new rows for i := 0 to 4 do DatSTable.Rows.Add([i, ‘string’ + IntToStr(i)]);   for i := 0 to 4 do       DatSTable.Rows.Add([i, ‘string’ + IntToStr(i)]); Post changes to RDBMS For more details and links to other posts, you can refer to the link below: http://docwiki.embarcadero.com/CodeExamples/Sydney/en/FireDAC.DAptLayerCommands_Sample Check out the full source code for the demo over on GitHub or in your RAD Studio IDE examples section.

Read More

Learn How To Use Return Type Deduction In C++ For Windows Apps

In this tutorial, you will learn how to use return type deduction in C++ Builder. For the C++14 scheme of auto with functions, the compiler can deduce return types for any function, no matter how complex it is. The only requirement is that each return statement needs have the same type. The practices are identical as for auto variables. To deduce the type, the compiler requires to detect the function definition right ahead. That means this technique is limited to function templates, inline functions, and helper functions which are applied only inside a particular translation unit. Here is a code example on return type deduction #ifdef _WIN32 #include #else typedef char _TCHAR; #define _tmain main #endif #include #include class employee { // Lots of code here }; struct person_id { std::string first_name; std::string last_name; }; class employees { public: auto find_employee(const std::string& name) { return 1; } }; int return_an_int() { return 1; } auto return_something() { return 1; } // The following will give a compiler error, because int and // float are different types //auto returnConfusion() { // if (std::rand() %2 == 0) { // return -1; // } else { // return 3.14159; // } //} int main() { auto i{ return_an_int() }; auto j{ return_something() }; // Example of a method with multiple return points, each with different types – an error // auto k {returnConfusion()}; auto employee_list{ std::make_unique() }; auto person = employee_list->find_employee(“Jane Smith”); system(“pause”); return 0; } 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #ifdef _WIN32 #include #else typedef char _TCHAR; #define _tmain main #endif   #include #include   class employee {     // Lots of code here };   struct person_id {     std::string first_name;     std::string last_name; };   class employees { public:     auto find_employee(const std::string& name) { return 1; } };   int return_an_int() {     return 1; }   auto return_something() {     return 1; }   // The following will give a compiler error, because int and //     float are different types //auto returnConfusion() { //    if (std::rand() %2 == 0) { //        return -1; //    } else { //        return 3.14159; //    } //} int main() {     auto i{ return_an_int() };       auto j{ return_something() };       // Example of a method with multiple return points, each with different types – an error     // auto k {returnConfusion()};       auto employee_list{ std::make_uniqueemployees>() };       auto person = employee_list->find_employee(“Jane Smith”);       system(“pause”);     return 0; } So, return type deduction bypasses undesirable conversions and the removes type changes you must to apply. If there is a possibility to use return type deduction, just apply this technique. Because this can assist to secure the types you utilize more consistently. Check out more modern C++ features over here on GitHub

Read More

FlexCel .NET, .NET5, Blazor and WebAssembly – Part 2

This is the second part of a two-part series where we explore using FlexCel.NET and Blazor. The first part was about running FlexCel in the browser, and now we will explore running it in the server. Generating a “server-side” Blazor app While blazor WebAssembly is the most exciting thing going on right now, we didn’t want to forget that most use cases for FlexCel are server-side. You access a database in your server, generate an Excel/PDF/HTML report with the data, and send it to the client. So for this second part, we wanted to do something not as exciting as a WebAssembly app, but probably more useful. We won’t go into a boring “create an Excel file from a database in the server and send it to the client”, because server-side this is just FlexCel (the full FlexCel, without WebAssembly limitations), so you can use any existing FlexCel example as-is. Then you can find thousands of tutorials on the web about how to send the file you created in the server to the browser for the user to download. What we will do now is adding an SVG chart to the existing “fetching data” example that is created when you create a new Blazor app. We will write the data into an Excel file, use the data to generate a chart, and render the chart in the client. The video is below:

Read More

TMS priority support

“The quality of the question determines the quality of the answer. Ask the right questions and you will get the right answers.” TMS software is committed to always provide you with the best possible priority support. It is therefore important that you send us the correct information. The more complete your question is, the faster we can help you. Our team tries to make the manuals as complete as possible. And additional information is available via demo projects, videos, blog articles and FAQs on the product pages. Do you want to be helped quickly? Follow our guides and information sources: documentation / Manuals Videos Website / TMS Support Center Priority support For user with an active license, priority support is given to questions and issues at the TMS Support Center! Check out our TMS Support Center, maybe your question has already been answered. You can easily find an answer by using keywords / phrases. Private support If there is a reason your question cannot be asked in our public support center, contact us via email and do include following information always with your questions: Registration email / code Product / component Version IDE Screenshots / sample source project + steps Stay up to date:

Read More