Quantcast
Channel: TMS Software
Viewing all 1016 articles
Browse latest View live

Celebrating 20 days the 20 year company anniversary!

$
0
0



It’s a special year for our team as we celebrate the company’s 20th birthday this month. We’ve come a long way over the years, so we wanted to celebrate this together with YOU!

Officially on October 17, 2000 the company tmssoftware.com bvba was registered in Belgium. tmssoftware.com bvba ws founded by Bruno Fierens to prepare his operations for the next steps and next level. Since the very beginning of Delphi in 1995, Bruno Fierens was operating as self-employed consultant developing and offering VCL components on the market.

On October 17, we plan to look back a bit more in detail on the history of the company but from today we start the 20 days action to celebrate our 20 year anniversary!


20% longer updates and support with licenses in the next 20 days

Yes, you hear that correct. For every license purchased (new license, upgrade, renewal) you receive 20% EXTRA time of free updates and free support coming with the product. So, products that come with free 1 year of updates and support, you now receive 20% more, or 438 days instead of 365 days (1 year).

This action runs for 20 days, from October 8 to October 28. It is offered to anyone, also loyal existing customers can purchase a renewal and will get an extra 20% renewal time. Also if you have licenses that are not yet expired, you can now already purchase a renewal and these 438 days will be added to your remaining free update & support period.


Your opportunity to get one of a limited edition run of 20 pieces of the book "Delphi Hands-on with TMS FNC Maps"

For our 20th anniversary we are producing a hyper limited run of 20 pieces only of a full color version of the "Delphi Hands-on with TMS FNC Maps" book. This book will have a special preface with a retrospective of the company written by Bruno Fierens and will be hand signed by the Belgian team.


To get a chance to win one of these limited edition books, share an anecdote about the TMS team, the TMS products, TMS events or share a screenshot of your product, your favorite blog article... in the comments section under this blog or on our social media and win the brand new and limited edition TMS FNC Maps hands-on book in color!

Twitter:
Tag @TMSsoftwareNews & use following hashtags:
#tmssoftware , #delphi and #embarcadero

Facebook:
Tag @tmssoftware & use following hashtags:
#tmssoftware , #delphi and #embarcadero

YouTube:
Tag @tmssoftwareTV & use following hashtags:
#tmssoftware , #delphi and #embarcadero

Our team will choose from the most extraordinary or special anecdotes/comments found on this blog comment section or on our social media channels and give send the limited edition of the book to your home.

Celebrate TMS components with us this October.
We are proud of our big TMS family all around the world.
Thank you for the many years of trust. Looking forward to the next 20 years!




Embarcadero Conference Brazil 2020

$
0
0

O maior evento Delphi do mundo irá acontecer novamente este ano. Mesmo com toda a situação da pandemia do COVID-19, a Embarcadero Conference 2020 irá se realizar no dia 20 de Outubro, em um novo formato, 100% online.

Apesar dos participantes perderem algumas coisas que só acontecem em eventos presenciais, com conversas valiosas e trocas de experiências com outros participantes nos intervalos das sessões, haverá benefícios interessantes nesse novo formato:

  • Taxa de inscrição mais acessível;
  • Você pode participar de onde estiver - sem precisar pegar um avião e reservar um hotel;
  • As palestras serão gravadas, assim os participantes não perderão nenhuma delas!

Note que todas as palestras devem ser ao vivo. Assim, mesmo que elas sejam gravadas para serem vistas depois, escolhendo a palestra a participar trará os benefícios de poder interagir com o palestrante, fazer perguntas, conversar com os outros participantes, e assim por diante.

Assim, aqui estão nossas sugestões para as palestras pra você participar:

9 am - SERVIÇOS NA NUVEM: NÃO COMETA ESTES ERROS! (Wagner Landgraf)

Após anos lidando com desenvolvimento de serviços na nuvem, seja criando aplicações ou frameworks dedicados nessa área, o palestrante mostrará os principais conceitos, segredos, dicas e experiências para a construção de serviços na nuvem em Delphi. É um compartilhamento das experiências reais, problemas reais e sucessos reais, focando nas armadilhas e problemas que podem ocorrer ao longo do desenvolvimento e mostrando as soluções e prevenções para tais.

1 pm - SEU PRIMEIRO CRUD COM TMS WEB CORE (Marcos Moreira)

Será mostrado como configurar o ambiente, criar sua primeira aplicação, e os aspectos para sua distribuição.

3:40 pm - TMS ACADEMIC - THE TMS SOFTWARE ACADEMIC PROGRAM (Wagner Landgraf)

O programa TMS Academic será apresentado - suas motivações, seu futuro e como embarcar neste programa para obter licenças 100% gratuitas e funcionais dos produtos TMS se você for um aluno ou professor!

Visite a página oficial da Embarcadero Conference 2020, registre-se e participe!

---

The biggest Delphi event in the world is coming again this year. Even with all the COVID-19 pandemic situation, Embarcadero Conference 2020 in Brazil will happen on October, 20th, in a new format, 100% online.

Even though attendants will lose some things, like the great and valuable in-person conversations, there will be some great benefits with this format:

  • More affordable fee;
  • You can participate from where you are - no need to take a plane and book a hotel;
  • Sessions will be recorded so attendants won't miss any of them!

Note that all sessions are supposed to be live. So even though they will be record, choosing a session to attend will bring you the benefit of interacting live with the speaker, asking questions, chatting with other attendants, and so on.

Thus, here is our suggestions for sessions you could attend:

9 am - CLOUD SERVICES: DON'T MAKE THESE MISTAKES! (Wagner Landgraf)

After years of dealing with cloud service development, whether creating applications or dedicated frameworks in this area, the speaker will show the main concepts, secrets, tips and experiences for building cloud services with Delphi. He will share real experiences, real problems and real successes, focusing on the pitfalls and problems that can occur throughout development and showing the solutions and preventions for them.

1 pm - YOUR FIRST CRUD WITH TMS WEBCORE (Marcos Moreira)

You will be shown how to configure the environment, create your first application, and the aspects for its distribution.

3:40 pm - TMS ACADEMIC - THE TMS SOFTWARE ACADEMIC PROGRAM (Wagner Landgraf)

The TMS Academic program will be presented - the motivations, the future, and how to embark in this program to get 100% free and functional licenses of TMS products if you are a student or a teacher!

Visit the Embarcadero Conference 2020 official page, register and participate.



Celebrating our 20th anniversary!

$
0
0

As you may already know, this October we are celebrating our company’s 20th birthday! And of course we want you to celebrate with us.
In addition to the current ongoing action of winning a limited edition "TMS FNC Maps hands-on" book, we have another special promotion for you!

Get 30% discount on online courses at landgraf.dev
This promotion runs until November 15, 2020.

Available courses

TMS Business Masterclass: Delphi developers looking to learn more about ORM, REST/JSON development, multi-tier applications and also some background about TMS Business tools, with code examples.
Introduction to TMS WEB Core: Developers looking to build WEB applications using Delphi, following modern Single-Page-Application architecture.

What is the language spoken in the course?

In all videos of this training course you have the options to turn on subtitles, and they were not auto-translated. All subtitles were written manually to make sense and with technical terms spelled correctly.

Full source code for examples

Each lecture of this course that uses a sample project has an associated downloadable file which includes the full source code of the example.

Your Instructor

Wagner is founder of landgraf.dev, a place for Delphi developers to find information and courses about Delphi. Even though being a Master of Science in Engineering, he's a developer at heart. Having worked with Delphi since its very first version in 1995, and being partner of TMS Software (a renowned company that provides solutions for Delphi), Wagner is the main developer behind popular Delphi frameworks like TMS Aurelius, TMS XData and TMS Scripter, among others.

Take advantage of this special discount and be one of the first to secure your place in these online course with Wagner Landgraf at landgraf.dev.



Today Oct 17, tmssoftware.com BV celebrates its 20 year anniversary

$
0
0


Company foundation

On October 17 in the year 2000, the company "tmssoftware.com bvba" was officially founded in Belgium. So, this year 2020, we celebrate on October 17 the 20-year anniversary of the company. After I started developing VCL components in 1995 with the release of Borland Delphi 1, I did this for the first 5 years as first part-time self-employed consultant and later full-time self-employed under the umbrella of "TMS software". By the year 2000, it became clear that the next step in this process of growth was to found a company, have a separate office, and prepare to hire the first employee.


Official declaration of the creation of the company in the Belgian register

First steps

As Delphi was born and brought Pascal developers RAD component-based development, I quickly realized there was a huge potential in creating components myself to enable me to reuse interesting code among various consulting projects I was doing for companies. I realized that when these components would be of interest to myself, these could probably also have value for other Delphi developers. Fortunately, at that time, there were two websites (Delphi Super Pages and Torry.net) that allowed Delphi developers to share created components with other developers. I was curious to try this out and the very first component released on Torry and Delphi Super Pages was TANIIcon.



This was a functionality I had not seen before from other Delphi developers and the component showed on screen animated cursors. I decided to create this component especially because I had not seen it done before and also because it introduced the challenge to create a component with custom property streaming as well as the creation of a custom property editor to pick and preview the animated cursor at design-time. It was a great experience to learn about the internals of the VCL framework. Meanwhile, for my own internal use in consulting projects, I had been working on a component descending from TStringGrid to add loads and loads of features I was needing over and over again in projects. This became TAdvStringGrid and was the first big component I released in a Shareware version. It was released on Delphi Super Pages and Torry and by 1996, I realized we needed a website. In Belgium, these were the early days of the Internet and it was through the ISP that we could get a limited free space for basic HTML pages. It could be found at http://users.skynet.be/tmssoftware. But of course, it no longer exists now. It was only from 1998 that the domain tmssoftware.com was purchased and all pages were moved to a shared hosted server for this domain. Between 1996 and 1998, it was still non-trivial to handle online payment transactions. It was common for developers to send a payment by cheque to purchase shareware. Fortunately, in 1998, Element5 AG in Germany offered its ShareIt service providing a platform for software developers to handle online payments and I almost immediately jumped on it.

Fast-forward to the year 2000, the amount of work involved with developing, marketing, selling, supporting VCL components had grown into a more than full-time job. So, it was time to structure this into the company "tmssoftware.com bvba" and move to newer and bigger office spaces. And it is this 20-year anniversary we celebrate today.

A technical adventure with software progress and new frameworks

These 20 years feel like a fast, adventurous, exciting rollercoaster ride. It was extremely exciting because in the software development industry, we are blessed with an ever-changing landscape and a non-stop flow of new capabilities and opportunities that come. The first component developments were based on the VCL framework and evolved along with Delphi and the Windows operating system. Around 2002, the IntraWeb framework was introduced and a whole new world of new component development opportunities opened-up. I was excited to be able to develop web applications from Delphi, so I obviously jumped on it and started to develop components for it. But not all new technologies I found worthwhile to work on turned out to be successful for TMS software. Borland launched Kylix, the Delphi version for Linux with the CLX framework and we decided to port several VCL components to it. Sadly, it never took off and we had to abandon this.

In 2011, Embarcadero made a major step with releasing the new FireMonkey framework that brought cross-platform development to Delphi developers. It goes without saying that I was also enthusiast and intrigued by these capabilities, and TMS software shortly after released the first FMX components. Since then, we developed a wide portfolio of FMX products.

And it did not stop there. The latest new developments include the TMS FNC framework and the TMS WEB Core framework. The TMS FNC framework originates from the insight that VCL, FMX, and LCL frameworks were close enough to be able to provide an abstraction layer and write components against this abstraction layer and in the process have the ability to write a single source code base for components that can be used in VCL, FMX, and LCL applications and later also in TMS WEB Core framework based web applications. The TMS WEB Core framework was written from the ground up to provide Object-Pascal RAD component-based web client application development using the pas2js compiler that transpiles the code to JavaScript to make it run in the browser.

These latest framework developments make us particularly proud as these are unique and offer a never seen before advantage to Object Pascal developers to develop feature-rich software faster for virtually any platform that exists.

Our ultra limited anniversary gift for you!

To celebrate our 20th anniversary, we did produce a limited edition of 20 copies only of the TMS FNC Maps book written by our chief evangelist Holger Flick. TMS FNC Maps is the synthesis of all our latest developments. It is a cross-framework component set as it offers mapping service integration that can be used in VCL, FMX, LCL, and TMS WEB Core applications. It is cross-platform as it can be used on Windows, iOS, Android, macOS, Linux, and the Web. And it adds another dimension: It is cross-service! TMS FNC Maps offers access to a myriad of mapping services going from Google Maps, Open Street Maps, Bing Maps to Tom-Tom, Here, Azure, MapBox, and more coming. The use of a service is only a property setting away. This book is as such the ideal candidate to make this special anniversary color edition from as the maps look so much better in color. Wanting to win one copy of this ultra limited and hand-signed book by our team, leave a comment on thi blog sharing an experiece, a memory, a result accomplished with our components and we will pick winners from there.


A big thank you to family, friends, colleagues and community

This 20-year anniversary could not have been possible by the support, passion, and hard-work from so many people involved:

My grandfather: Thank you for letting me experience the feeling of being in charge of a company and being a great example of work ethic and enjoying life at the same time. You have been a great inspiration in many ways.
My father: Thank you for giving me the first PC you got from work and didn’t not want to use. That started it all.
My parents: Thank you for giving me the education and space to let me be creative and explore my dreams.
My wife: Thank you for believing me and pushing me to become fully self-employed and found a company. Thank you for your patience and for putting up with the many hours I spend with work.
My three wonderful daughters: Thank you for understanding and respecting the silence and concentration needed during the many hours of working and for not always being there.
Wagner Landgraf: Thank you for reaching out to make a partnership and build together on this amazing adventure. Thank you for the endless brainstorms, ideas and helping pushing things forward.
Adrian Gallero: Thank you for being a partner for so long, for the many insights and ideas and for bringing the amazing piece of work FlexCel as flagship product in the TMS family.
Bart Holvoet: Thank you for believing in TMS since its inception and becoming the first employee. Thank you for the not oversee-able amount of work you put into many parts of TMS, its website and many products.
Pieter Scheldeman: Thank you for becoming the second employee and having accomplished amazing, unique, and ground-breaking products. Thank you for always pushing me and the team to the next level.
Masiha Zemaria: Thank you for being the heart and face of the company assisting our customers day-in, day-out with all their needs and questions and for taking care of the public image of the company.
Tünde Keller: Thank you for your curiosity in new technologies and courage to overcome even the most difficult technical challenges. Thank you for creating rock-solid components this way.
Gjalt Vanhauwaert: Thank you for your openness to handle a wide variety of development tasks in the TMS family. From testing, creating demos, adapt components, offering support and now also creating videos for social media.
Roman Kassebaum: Thank you for breaking down any barrier that might exist in the Delphi IDE to let TMS WEB Core shine in it. Thank you for helping me improve my German language and for the many chats about cars and politics.
José Leon Serna: Thank you for the amazing job on bringing the TMS WEB Core framework to Visual Studio Code. Thank you for the opportunity to be able to work together with such a highly skilled, extremely intelligent and - at the same time - pragmatic software developer.
Holger Flick: Thank you for being a TMS fan of the first hour and believing in the potential of the company. Thank you for the top-notch evangelization work you do and for being the critical and blunt voice that pushes us to higher levels.
Bernard Roussely: Thank you for believing in TMS as a partner for offering cryptography components for Delphi developers
Marion Candau: Thanks for all the hard work that goes into the cryptography products.
Roman Yankovsky: Thank you for our cooperation with the respected FixInsight product and for new exciting upcoming developments in the area of GraphQL.
Sergey Gladkiy: Thank you for your exceptional skills combining deep mathematical understanding and programming at the same time resulting in a powerful math & stats library for Delphi users.
Al Gonzalez: Thank you for your trust in our company and for being open to a brand new position for you. I'm looking forward to exciting developments coming
Chad Hower: Thank you for inspiring me to help Delphi reach out to the web with the IntraWeb framework and for the friendship and beautiful times at beautiful beaches.
Detlef Overbeek: Thank you for your relentless efforts to support the Object Pascal community and for the countless hours of brainstorming, inspiration, and thinking out of the box. Thanks for keeping the community alive via the Blaise Pascal Magazine
Mattias Gaertner: Thank you for the amazing job done with the pas2js compiler and for putting up with me asking technical questions over and over again related to the pas2js compiler.
Michael Van Canneyt: Thank you for your brilliant vision and deep technical knowledge and for assisting me so many times.


Many thanks also go to numerous people in the Delphi community. In the first place, many of the former Borland employees like Danny Thorpe, David Intersimone, and Anders Heijlsberg, who shared so much technical insights with me and inspired me to become a better software developer. Thanks for many of the Embarcadero employees still pushing Delphi and that are always helping when I have questions like Marco Cantu, Jim McKeeth, David Millington, Sarina Dupont, Calvin Tang...
Thanks to Thierry Laborde, former Embarcadero France director with who we worked together to create the TMS MultiTouch SDK and who laid the foundations of the original TMS VCL WebGMaps products. Thanks to Lino Tadros for believing in us when we created the first IntraWeb user interface component set and with whom we created UI components for ASP.NET and Silverlight. Thanks for the many software book authors that were a source of knowledge and inspiration, in particular Ray Lischner. Thanks for so many nice people in the Delphi community. Thanks to Jens Fudge, Jeroen Pluimers, Glenn Crouch, Cary Jensen, Loy Anderson, Ray Konopka, Sabine Rothe, Matthias Eissing, Andrea Magni, Daniel Wolf, Bob Swart, Pawel Glowacki, Hadi Hariri, Margreet Van Muyden, the EKON conference team ... and so many more Delphi community members and luminaries for always ensuring that wherever people gather around Delphi, it feels so good.

A big thank you to you, loyal customer

Thanks to our loyal customers as well. We thank our customers for the trust in our company, our products, and our support services. On an almost daily basis, our short-line communication between the customers and the TMS team leads to product improvements, new product ideas and documentation enhancements. That several of our products are these days rock-solid and feature-rich is a direct result of a symbiotic long-term relationship with customers, some of which have been customers as long as the company exists.

Thanks for everyone not listed here but who played nevertheless a role - big or small - in the 20 year history of the company.

Let passion drive the future

For the next 20 years, I am confident the passion for software development and the warmth of the community will lead to many more exciting products, fruitful collaborations, interesting exchanges with customers, and visions turned into a reality. I am looking forward to many more adventurous loops and wild rides on the software development rollercoaster.

Watch also this related video on Gjalt's 101:



TMS FNC Maps Team Effort (v1.2)

$
0
0

Team Effort

Since the first release we have been working hard and only 4 months after the release, we pushed out an update (v1.1) for TMS FNC Maps with loads of exciting stuff. Now, we are here with another update (v1.2), that brings even more exciting features and a new service.

  • Introducing Apple MapKit JS service



  • TTMSFNCOpenLayers with the ability to configure a custom tile server
  • TTMSFNCMapBox & TTMSFNCTomTom with a property to control the map style
  • Anchoring & Z-Index support in TTMSFNCGoogleMaps
  • TTMSFNCElevation: A new non-visual component to retrieve elevation data based on coordinate
  • Greatly Improved performance loading & parsing GPX files
  • Faster loading of markers & poly elements
  • Getting elevation data from GPX files

Bringing all of the above together in a significant update requires a lot of hard work and team effort. TMS FNC Maps v1.2 is a result of a collaboration between various people within the TMS family:

  • Bart Holvoet: Extensive API knowledge and master in REST services, implementation
  • Gjalt Vanhouwaert: Intensive feedback & testing, creating cross-platform demos
  • Holger Flick: Providing feedback & testing, creator of the TMS FNC Maps book
  • Pieter Scheldeman: Architecture & design choices, research on APIs & services, implementation
  • Masiha Zemarai: Marketing campaign, social media & support

REST API & mapping services

Bringing together multiple mapping services and REST APIs with radically different architecture in one unified cross-platform, cross-framework product was quite a challenge. Thanks to our TMS team effort we succeeded in making this a seamless experience for our customers who can switch services by changing a single property value.

- Bart

Creating cross-platform demos

I joined the TMS FNC Maps task force to create some demos for the customers. My first thought was that it would take days before I could get started with anything useful. But the implementation feels so natural that you can already have a simple application with only 2 lines of code. All of the handling that you want, is implemented in such a way that even for some really cumbersome things, you just need one line of code.
You can find a simple example in one of my videos.
You can find an online demo here.

In just one day I created three different demos for four different platforms.
This is the perfect example of the simplicity of working with TMS FNC Maps. And the power of FNC components in general.

- Gjalt

Edge Chromium



TTMSFNCWebBrowser has been updated to offer the support for the latest Edge Chromium stable version. This update will automatically be available when installing TMS FNC Core. More details on how to install Edge Chromium can be found here.

TMS FNC Maps Book



TMS FNC Maps offers a set of demos and documentation to get you started, but if you really want to energize your developments the TMS FNC Maps Book is a must have!



Microsoft Edge WebView2 general availability!

$
0
0



Intro

Microsoft has recently announced general availability of the WebView2 embedded browser control, part of Microsoft Edge Chromium. https://blogs.windows.com/msedgedev/2020/10/19/edge-webview2-general-availability/. In this blog post, I want to summarize the steps you can take, to configure your or your customer's environment, and making sure browser components that target the Microsoft Edge Chromium embedded WebView2 interfaces are properly initialized.

Microsoft Edge Chromium support is included in TMS FNC Core (TTMSFNCWebBrowser) & TMS VCL UI Pack (TAdvWebBrowser). Using one of those components requires you to follow 2 steps to get the browser up & running on your system.

1) Make sure Microsoft Edge Chromium is available on your system
When using one of the above components you need to make sure that Microsoft Edge Chromium is available on your system. There are 3 ways to make either TAdvWebBrowser or TTMSFNCWebBrowser pick up edge.


2) Copy the necessary DLLs to communicate with WebView2 embedded browser control
The second step is copying both WebView2Loader_x86.dll & WebView2Loader_x64.dll in to the system32 & sysWow64 folders. Both DLLs can be found in the installation folder, in a sub folder "Edge Support". After copying both DLLs, to target 32 & 64 bit Windows applications, start the IDE (RAD Studio, or Lazarus), and drop an instance of TAdvWebBrowser or TTMSFNCWebBrowser. The message you will see that indicates the browser is properly initialized is displayed in the screenshot below. Depending on the chosen technique to install Microsoft Edge Chromium, or making sure Microsoft Edge Chromium is available on your system can slightly differ.



Deploying your application to your customer

When developing your application that uses a TAdvWebBrowser or TTMSFNCWebBrowser, you want to make sure it runs on the customer's machine. When the customer has Windows updates turned on, Microsoft Edge Chromium should be available on his system. The implementation of TAdvWebBrowser or TTMSFNCWebBrowser checks if this is true, and automatically makes a copy to work with. So no additional steps are required there. Note that this process might take some time when the browser is dropped on the form for the first time, or your application is running for the first time. Each time an update is pushed from Windows updates, a new copy is made to a temporary folder. If you do not want this and you want your application initialization faster you can separately download and install the WebView2 Evergreen runtime (https://developer.microsoft.com/en-us/microsoft-edge/webview2/) on the customer's machine. This will ensure a proper installation of Microsoft Edge Chromium ready to be used for an embedded browser control. Installing DEV, BETA or CANARY is not recommended when deploying your application. These insider builds are only for development purposes. More info about the application distribution is explained here: https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution

TMS WEB Core tips & tricks : Small sample with lots to learn about its versatility

$
0
0

In this article, we start from a TWebResponsiveGrid and use it to demonstrate various tricks that apply throughout the TMS WEB Core framework but are here in combination with the TWebResponsiveGrid perfect to show. The purpose of the article is to show how well the web HTML/CSS world blends with the Delphi developers components world and this in different & flexible ways. We will show you a couple of techniques to customize TWebResponsiveGrid items and make these interactive.

TWebResponsiveGrid intro

TWebResponsiveGrid is a responsive grid control. This means that it contains a number of items displayed in a 2D grid layout and this layout, i.e. number of columns will be controlled by the device screen size. This number of columns is determined by the setting TWebResponsiveGrid.Options.ItemMinWidth. This sets the minimum width of items in pixels. So, the grid will automatically show as much columns as allowed to still have this minimum width of items respected. And this also takes the TWebResponsiveGrid.Options.ItemGap in account that specifies the gap between items also in number of pixels. Other than this, there is not much to do. When the TWebResponsiveGrid is resized or displayed on a big or small screen, it will use these settings to automatically render the right number of columns for items. To see this directly live, you can also visit this online demo

An item can be displayed in normal state, hover state and selected state. Therefore
TWebResponsiveGrid.Options has settings for normal state, selected state and hover state colors. In addition or as alternative to setting colors (and other settings) for items, CSS can be used. TWebResponsiveGrid.Options.ItemClassName is the name of the CSS class that can be assigned to the item (outer HTML element of the item is a DIV).

Beyond simple HTML in items

The items one can add in a TWebResponsiveGrid are of the type TWebResponsiveGridItem and have a property HTML: string to set the HTML the item should contain and the generic Tag property. When the TWebResponsiveGrid.Options.ItemTemplate is set, this is preset for the item HTML when a new item is added. Note that when loading data from JSON or a dataset, the template can hold specifiers (%SPECIFIER%) and this is merged at runtime with hthe JSON attribute or dataset record field.

The purpose of this article though is on programmatically filling the items collection. The initial code to fill the TWebResponsiveGrid as such is:

  for i := 0 to 20 do
  begin
    WebResponsiveGrid1.Items.Add.HTML := 'Grid item '+i.ToString+'

This shows how we have added some text and a button to a responsive grid item. The result is very simple. It does not look nice but the responsive behavior is there. The TWebResponsiveGrid is set to top aligned and when resizing the browser, the items automatically flow in the container.



Before diving into making the HTML button react, let's visually enhance the responsive grid items. We do this with some CSS for the TWebResponsiveGrid as well as the TWebResponsiveGridItem. While we could add the CSS style in the HTML file associated with the form or application (which is probably the best place), we wanted to take the opportunity here to introduce the TWebForm.AddCSS() method that allows to dynamically insert CSS at runtime (or remove it later and replace it). Doing so is simple as demonstrated with this code snippet:

  AddCSS('respgriditem','.mygriditem { background-color: aliceblue; border-radius: 4px; border: 1px solid darkgray; padding:10px; font-name: Arial; font-size: 12pt;}');
  AddCSS('respgrid','.mygrid {padding:10px;}');

  WebResponsiveGrid1.ElementClassName := 'mygrid';
  WebResponsiveGrid1.Options.ItemClassName := 'mygriditem';

Here you can see a CSS class for the item with some border rounding, padding, font, ...is set and also a CSS based padding added to the TWebResponsiveGrid control itself. The result becomes already a lot nicer:



Blending the Object Pascal world with HTML elements

Now comes the more interesting part of this article. It explains two techniques that might not be well-known to bring the RAD component based development world we Delphi developers love so much and the HTML/CSS web world together. First we are going to use a technique to bind a TWebButton control to the HTML in the responsive grid item. By doing this binding, we can do everything we want, including handling events, with the HTML button via the TWebButton class without bothering with the HTML and JavaScript. And doing so is surprisingly simple:
  TForm3 = class(TWebForm)
  public
    { Public declarations }
    procedure ButtonClick(Sender: TObject);
  end;

procedure TForm3.WebFormCreate(Sender: TObject);
var
  i: integer;
  btn: TWebButton;
begin
  for i := 0 to 20 do
  begin
    WebResponsiveGrid1.Items.Add.HTML := 'Grid item '+i.ToString+'
'; btn := TWebButton.Create('btn'+i.ToString); btn.Tag := i; btn.OnClick := ButtonClick; end; end;
As you can see, a TWebButton instance is created passing the HTML element unique ID value as argument for the constructor. Doing so will wrap the TWebButton class on the existing HTML button element. When wrapped, we can simple access this HTML element via the Pascal class properties and handle events via the Pascal class events. Here we bind the form's ButtonClick method to the button OnClick. The event handler that can be used is:
procedure TForm3.ButtonClick(Sender: TObject);
begin
  if (Sender is TWebButton) then
    WebListbox1.Items.Add('Clicked button ' +(Sender as TWebButton).Tag.ToString);
end;
Via the button Tag property we could easily identify what item's button was clicked.

We could use this technique to bind any other type of HTML element to a corresponding TMS WEB Core Pascal class. But, the goal of this article was to introduce lesser known techniques, hence, we will add a checkbox to the item as well with another technique (that could have been used for the button as well).

Clearly, the HTML of the item does not have a HTML INPUT element of the checkbox type, so we are going to add it as a TWebCheckBox. The code to do so is:

  for i := 0 to 20 do
  begin
    chk := TWebCheckBox.Create(Self);
    chk.ShowFocus := false;
    chk.ParentElement := WebResponsiveGrid1.Items[i].ElementHandle;
    chk.Tag := i;
    chk.OnClick := ButtonClick;
    WebResponsiveGrid1.Items[i].ItemObject := chk;
  end;
This code snippet contains a number of noteworthy items. First of all, the TWebCheckBox instance is created with specifying the form as its owner which is what we are typically used to as Delphi developers. In a VCL application, the control would be effectively created as Windows window handle based control and become visible when setting Control.Parent. The same applies to a TMS WEB Core control. If we would set chk.Parent := Self, the checkbox would become visible but would be a child control of the form and this is not what we want. We want the checkbox to be a child of the item in the TWebResponsiveGrid, thus the HTML DIV representing this TWebResponsiveGridItem. And this is exactly what is achieved via:

    chk.ParentElement := WebResponsiveGrid1.Items[i].ElementHandle;
Note that WebResponsiveGrid1.Items[i].ElementHandle is a reference to the HTML DIV element for the responsive grid item! The TMS WEB Core control property ParentElement allows to specify the parent HTML as another HTML element. What happens in the control logic is that TWebCheckBox.Create(Owner) creates a HTML INPUT element of the type CHECKBOX and setting the ParentElement property will perform (in pseudo code) at DOM level ParentHTMLElement.appendChild(CheckBoxElement).

By using a simple trick here associating the created checkbox instance in WebResponsiveGrid1.Items[i].ItemObject, we can later in code manipulate the HTML INPUT CHECKBOX element via the TWebCheckBox class and actually not bother about all the HTML behind. To preset all checkboxes for example, the code is simply:
  for i := 0 to 20 do
  begin
    (WebResponsiveGrid1.Items[i].ItemObject as TWebCheckBox).Checked := true;
  end;
The result is:



As you can see we have associated the same ButtonClick event handler also to the checkbox OnClick, so we can extend this handler to:
procedure TForm3.ButtonClick(Sender: TObject);
begin
  if (Sender is TWebButton) then
    WebListbox1.Items.Add('Clicked button ' +(Sender as TWebButton).Tag.ToString);

  if (Sender is TWebCheckBox) then
  begin
    if (Sender as TWebCheckBox).Checked then
      WebListbox1.Items.Add('Checked checkBox ' +(Sender as TWebCheckBox).Tag.ToString)
    else
      WebListbox1.Items.Add('Unchecked checkBox ' +(Sender as TWebCheckBox).Tag.ToString);
  end;
end;
It will add the checkbox checked state in a listbox on the form.

Summary

We hope this small demo you can download here will learn you not only a few handy techniques for working in a flexible way with the TWebResponsiveGrid but as these techniques are generally applicable to all TMS WEB Core controls, will help you to get more out of TMS WEB Core than you already do. Note that everything explained here is also applicable in TMS WEB Core for Visual Studio Code, in fact, the exact same demo project created for Delphi can be directly opened in TMS WEB Core for Visual Studio Code! We look forward to learn how you apply these techniques and what wonderful applications you are creating with TMS WEB Core! If you have suggestions for more in depth looks at TMS WEB Core techniques like this article, let us know and our team will be happy to explore and uncover these in follow-up articles.

Only few days left...

$
0
0



And the last week of this promotion starts today...
Get extra time of free updates and/or win a limited edition book!


20% longer updates and support

Purchase your license before October 28th and receive 20% EXTRA time of free updates and free support! So, products that come with free 1 year of updates and support, you now receive 20% more, or 438 days instead of 365 days (1 year).
It is offered to anyone, also loyal existing customers can purchase a renewal and will get an extra 20% renewal time.


WIN a limited edition "Delphi Hands-on with TMS FNC Maps"




For our 20th anniversary we are producing a hyper limited run of 20 pieces only of a full color version of the "Delphi Hands-on with TMS FNC Maps" book. This book will have a special preface with a retrospective of the company written by Bruno Fierens and will be hand signed by the Belgian team.

To get a chance to win one of these limited edition books, share an anecdote about the TMS team, the TMS products, TMS events or share a screenshot of your product, your favorite blog article... in the comments section under this blog or on our social media and win the brand new and limited edition TMS FNC Maps hands-on book in color!

Twitter:
Tag @TMSsoftwareNews & use following hashtags:
#tmssoftware , #delphi and #embarcadero

Facebook:
Tag @tmssoftware & use following hashtags:
#tmssoftware , #delphi and #embarcadero

YouTube:
Tag @tmssoftwareTV & use following hashtags:
#tmssoftware , #delphi and #embarcadero

Our team will choose from the most extraordinary or special anecdotes/comments found on this blog comment section or on our social media channels and give send the limited edition of the book to your home.

There are only a few days left, take advantage of it now!




TMS WEB Core for VSC 1.1 beta

$
0
0



We are getting closer to the next milestone of our TMS WEB Core for Visual Studio Code project. So, this is an ideal moment for letting TMS ALL-ACCESS users have access to the TMS WEB Core for Visual Studio Code v1.1 beta that we released today.

New features v1.1 beta

  • Support for creating PWA's (Progressive Web Applications, i.e. installable and offline usable apps for iOS and Android mobile devices).
  • Support for Electron cross platform desktop apps (Windows, macOS, Linux)
  • In sync with the TMS WEB Core framework latest release v1.5.5.2
  • Lots of further polishing on IDE integration in Visual Studio Code.

Roadmap Q4 2020/Q1 2021

The next big milestone after the v1.1 release will be v1.2 where the highlight will be installable extra components. At this moment, components not installed in the IDE can be used at runtime of course, but the focus of v1.2 will be to offer the capability to install the components on the tool palette and make the components usable on the form designer in the IDE. This huge work is already well underway. The entire TMS FNC components portfolio (TMS FNC UI Pack, TMS FNC Maps, TMS FNC Dashboard, TMS FNC Cloud, TMS FNC Blox) is in on development versions in our R&D team already working from the Visual Studio Code IDE as well. After the IDE infrastructure in the IDE is finished & polished, this will be the v1.2 release. Also for v1.2 we have project templates coming.

Summary

Now is the time to discover what TMS WEB Core for Visual Studio Code can do for you, Object Pascal and RAD component based software developer reaching out to create rich web client applications or create applications with a modern front-end based on web technology.
  • Large number of included visual and non-visual components: With these components, a RAD approach allows you to build solutions fast.
  • Visual data-binding: A data-binding mechanism similar to Delphi VCL data-binding enables to hook-up your client application via client datasets to data sent from a REST API based backend quickly.
  • Use existing or custom HTML web templates: The Visual Studio Code IDE has built-in strong support for editing HTML/CSS and a vast array of extensions. This adds even more power to it. The visual designer shows the pages ”as is” using the templates.
  • Integrate any existing JavaScript library: The underlying pas2js compiler for transpiling Object Pascal code to JavaScript code running in the browser facilitates programmatic access to any existing JavaScript library. This opens up the huge availability of all kinds of easily available web functionality to integrate.
  • Debug using Object Pascal code: All modern debugging capabilities like breakpoints, watches, stepping in code, ... can be done in the Object Pascal code base from the Visual Studio Code IDE.
  • Project compatibility with Delphi. Create projects in Delphi and open & work further on these in Visual Studio Code and vice versa.

Get in the front seat today


This new beta is available for registered TMS ALL-ACCESS users. So our VIP users can already test the new features!

Take a head start now and get TMS WEB Core for Visual Studio Code at our launch price starting from 295EUR for a single developer license or download and explore this new ground-breaking product using the trial version!

Use 100% of TAdvWebBrowser

$
0
0

TAdvWebBrowser/TTMSFNCWebBrowser

TAdvWebBrowser or TTMSFNCWebBrowser are both the same components.
The first one is a component that is available in TMS VCL UI Pack and the TTMSFNCWebBrowser is included in TMS FNC Core.
This component can display web pages, HTML and load files such as PDF files.
Both browsers also allow executing scripts and catch the result in a callback.

Get started

You will need to take some additional steps to get started with the TAdvWebBrowser. The component is based on the Microsoft Edge Chromium web browser, so first of all this should be installed. Luckily Edge Chromium is now the default browser that Windows is distributing with the Windows 10 updates.
Another important remark is that you can use the normal version of Microsoft Edge and you don't need to intall one of their specific channels.
Another thing that you will need is the WebView2Loader DLL file. There is a 32-bit and 64-bit DLL, the use of one of these depends on the version of the application that you want to build. You can find these files in the 'Edge Support' folder which comes with the installation package.
These need to be placed in the systems folder of your system. In case you are working on a 32-bit system, you will need to put the file in the System32 folder. If you are working on a 64-bit system the file needs to be in the SysWOW64 folder as Delphi is a 32-bit program.

More information on the setup can be found here.

Now you are ready to start working with the TAdvWebBrowser.

TAdvWebBrowser built-in features

To start with the TAdvWebBrowser it can be as easy as placing the component on the form and setting the URL property to the link that you want.
If you want to give the user some more control, we've created a demo application, in which you can navigate via a TEdit and have buttons to go forward and backward.



This is easily done with the following code:
AdvWebBrowser.Navigate(AURL);
AdvWebBrowser.goBack;
AdvWebBrowser.goForward;
With the OnNavigationComplete event you can check if the webbrowser changed to the desired page.
In this code sample we will add the URL to a listbox and check if we can go back or forward between the web pages.
procedure TForm.AdvWebBrowserNavigateComplete(Sender: TObject;
  var Params: TAdvCustomWebBrowserNavigateCompleteParams);
begin
  ListBox1.Items.Add(Params.URL);

  Back.Enabled := AdvWebBrowser1.CanGoBack;
  Forward.Enabled := AdvWebBrowser1.CanGoForward;
end;
Some other things that you can do is set your own HTML code.
AdvWebBrowser1.LoadHTML(MyHTML);

Go to the next level

You can get much more out of your TAdvWebBrowser with the use of some simple methods.
With the ExecuteJavascript method, you can run the JavaScript code that you want in your browser. For example you can set the inner HTML of an object, in this case a paragraph.
AdvWebBrowser.ExecuteJavascript('document.getElementById("myParagraph").innerHTML = "' + s + '";');
DOM access is currently not possible in the TAdvWebBrowser itself, but you can retrieve the HTML text of your page via this function as well. And you can make it readable by parsing the retrieved text to JSON. In this case it is done in an anonymous callback method.
AdvWebBrowser.ExecuteJavascript('function GetHTML(){return document.documentElement.innerHTML;} GetHTML();',
   procedure(const AValue: string)
   begin
     memo.Lines.Text:= TJSONObject.ParseJSONValue(AValue).Value;;
   end
   );
With the use of this JavaScript method, you can get almost everything out of this control.

TAdvWebBrowser also supports bridging between the client and the web browser. You can do this by creating a class for your bridge object.
TMyBridgeObject = class(TInterfacedPersistent, IAdvCustomWebBrowserBridge)
  private
    function GetObjectMessage: string;
    procedure SetObjectMessage(const Value: string);
  published
    property ObjectMessage: string read GetObjectMessage write SetObjectMessage;
  end;
  
  procedure TMyBridgeObject.SetObjectMessage(const Value: string);
  begin
    //Use the Value parameter.
  end;
 
As this Value parameter that you retrieve is a string, you can store anything you want in Value. This can be very useful for a JSON object.

Then you will need to add the bridge to the HTML code.
 AHTML := '' + #13 + 
          ' ' + #13 +
          '   ' + #13 + 
          ' ' + #13 + 
		  ' ' + #13 + 
		  '  ' + #13 + 
		  ' ' + #13 + 
		  '';
  o := TMyBridgeObject.Create;
  AdvWebBrowser1.AddBridge(BridgeName, o);
In this example the Value will be equal to "Yes".

This will give you the following HTML:


If you want to see the demo in action, I've already made a video on the TAdvWebBrowser demo where I explain how it works.


TMS FNC Planner Editing

$
0
0

Intro

Since the first release, TMS FNC UI Pack has been constantly evolving. Version 3.2 added a lot of great new functionality and new components (https://tmssoftware.com/site/blog.asp?post=695). Today, we wanted to focus on a component that has been there since v1.0: TTMSFNCPlanner.

The TTMSFNCPlanner is a scheduling component with various built-in time-axis options, i.e. a day, week, month, period, half-day period, timeline as well as custom time-axis mode where you can fully control the duration of each timeslot. The TTMSFNCPlanner supports single and multi resource views and can have the time-axis in horizontal or vertical orientation. Even when targeting mobile devices, the TTMSFNCPlanner will automatically use a touch-friendly approach. Today's blog post focuses on a feature that is essential for an application that uses the maximum potential TTMSFNCPlanner has to offer: editing.

Editing

Editing is divided into 3 parts:

  • Inplace editing
  • Dialog editing
  • Custom editing

Inplace editing
Inplace editing is enabled by default. Clicking in the planner item notes area will start the inplace editor. The default inplace editor is a TMemo, but can be configured to whatever inplace editor you want to use, with the OnGetInplaceEditor event. See the topic "Custom editing" below for an example. After the editor is started, text can be entered, and committed via the F2 key, or by clicking on another part of the planner. Cancelling is done via the Escape key.



Changing the behavior of inplace editing can be done via one of the various properties under Interaction.

Dialog editing
Dialog editing can be enabled by changing the property Interaction.UpdateMode to pumDialog. When doing the same kind of interaction (selecting the item, clicking on the notes area), the dialog will be shown which can fully edit the item. Whereas inplace editing can only edit the notes, the dialog can edit title, notes, start & end time of the item.



There is also support for a built-in recurrency editor dialog, which offers the same basic features as the default dialog, and extends this with recurrency options. This is typically used in combination with a dataset (see planner database demo included in the distribution). To use this dialog editor, you can drop an instance of TTMSFNCPlannerItemEditorRecurrency on the form, assign it to the ItemEditor property and click on the item to show the editor, as you would normally do after setting Interaction.UpdateMode to pumDialog.


Custom editing
For both of the above editing types, customization is possible. Let's start with inplace editing. We want to create a custom editor that uses a TTMSFNCRichEditor and a TTMSFNCRichEditorFormatToolBar. We start by implementing a custom class wrapper that creates and holds a reference to a set of richeditor related classes for importing and exporting HTML as well as a toolbar and the richeditor itself. The planner item supports HTML and we need a way to convert the HTML coming from the item to the rich editor and vice versa.
type
  TCustomInplaceEditor = class(TTMSFNCCustomControl)
  private
    FHTMLImport: TTMSFNCRichEditorHTMLIO;
    FRichEditor: TTMSFNCRichEditor;
    FRichEditorToolBar: TTMSFNCRichEditorFormatToolBar;
    FScrollBox: TScrollBox;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

{ TCustomInplaceEditor }

constructor TCustomInplaceEditor.Create(AOwner: TComponent);
begin
  inherited;
  FScrollBox := TScrollBox.Create(Self);
  FScrollBox.Parent := Self;
  FScrollBox.Align := TAlignLayout.Client;

  FRichEditor := TTMSFNCRichEditor.Create(FScrollbox);
  FRichEditor.Parent := FScrollbox;

  FRichEditorToolBar := TTMSFNCRichEditorFormatToolBar.Create(FScrollbox);
  FRichEditorToolBar.RichEditor := FRichEditor;
  FRichEditorToolBar.Parent := FScrollbox;

  FRichEditor.Position.Y := FRichEditorToolBar.Height;

  FRichEditor.Width := FRichEditorToolBar.Width;

  FHTMLImport := TTMSFNCRichEditorHTMLIO.Create(Self);
  FHTMLImport.RichEditor := FRichEditor;
end;

To show the new inplace editor, implement the OnGetInplaceEditor event and return the TCustomInplaceEditor class. When clicking on the item, the TCustomInplaceEditor instance will be created and shown.
procedure TForm1.TMSFNCPlanner1GetInplaceEditor(Sender: TObject; AStartTime,
  AEndTime: TDateTime; APosition: Integer; AItem: TTMSFNCPlannerItem;
  var AInplaceEditorClass: TTMSFNCPlannerInplaceEditorClass);
begin
  AInplaceEditorClass := TCustomInplaceEditor;
end;



As you can see, the TTMSFNCRichEditor does not show the text that was originally visible in the item. We need to import the TTMSFNCPlanner item text as HTML. As the TCustomInplaceEditor is actually too big, we also set the size here so there is enough space available to edit the text and get access to the TTMSFNCRichEditorFormatToolbar.
procedure TForm1.TMSFNCPlanner1AfterOpenInplaceEditor(Sender: TObject;
  AStartTime, AEndTime: TDateTime; APosition: Integer;
  AItem: TTMSFNCPlannerItem; AInplaceEditor: TControl;
  AInplaceEditorRect: TRectF);
var
  c: TCustomInplaceEditor;
begin
  c := (AInplaceEditor as TCustomInplaceEditor);
  c.SetBounds(c.Left, c.Top, c.FRichEditorToolBar.Width + 20, 200);
  c.FHTMLImport.InsertHTML(AItem.Text);
end;



To update the item, after editing the text we'll need another event: OnBeforeUpdateItem. This event is called after closing the editor. Here we need to convert the text from the TTMSFNCRichEditor to HTML, to import back into the item.
procedure TForm1.TMSFNCPlanner1BeforeUpdateItem(Sender: TObject; AStartTime,
  AEndTime: TDateTime; APosition: Integer; AItem: TTMSFNCPlannerItem;
  var ATitle, AText: string; var ACanUpdate: Boolean);
var
  c: TCustomInplaceEditor;
  sl: TStringList;
begin
  c := (TMSFNCPlanner1.GetInplaceEditor as TCustomInplaceEditor);
  sl := TStringList.Create;
  try
    sl.Text := c.FRichEditor.ContentAsPlainHTML;
    AText := sl.Text;
  finally
    sl.Free;
  end;
end;



As with inplace editors, dialogs can also be fully customized. If the default supported dialogs are not sufficient, you can use a set of events to show a custom dialog. In this sample, the TTMSFNCPlanner shows an overview of cardiologists and patients that need to have surgery. A cardiologist can click on a planner item, and edit it to confirm the patient is successfully operated. To start, we have created a custom dialog.



This dialog is going to be shown instead of the default dialog when editing an item. We are also going to dynamically edit the item based on dialog and vice versa. In this code snippet we are going to hide the remove button, as we don't want users to remove the scheduled patient we are going to edit.
procedure TForm1.TMSFNCPlanner1AfterOpenUpdateDialog(Sender: TObject;
  AStartTime, AEndTime: TDateTime; APosition: Integer;
  AItem: TTMSFNCPlannerItem);
begin
  TMSFNCPlanner1.GetEditingDialog(AItem.Index).ButtonRemove.Visible := False;
end;

The next step is to link the item to the custom dialog. This makes sure that the properties that are available at item level are displayed in the custom dialog.
function FindChild(AContainer: TControl; AName: String): TControl;
var
  I: Integer;
begin
  Result := nil;
  for I := 0 to AContainer.ControlsCount - 1 do
  begin
    if AContainer.Controls[I].Name = AName then
    begin
      Result := AContainer.Controls[I];
      Break;
    end;
    Result := FindChild(AContainer.Controls[I], AName);
  end;
end;

procedure TForm1.TMSFNCPlanner1ItemToCustomContentPanel(Sender: TObject;
  AItem: TTMSFNCPlannerItem; AContentPanel: TControl);
var
  l: TLabel;
  c: TCheckBox;
  img: TImage;
  b: TColorComboBox;
begin
  l := FindChild(AContentPanel, 'lblPatient') as TLabel;
  l.Text := 'Patiënt: ' + AItem.Title;
  c := FindChild(AContentPanel, 'chkOperation') as TCheckBox;
  c.IsChecked := AItem.DataBoolean;
  img := FindChild(AContentPanel, 'imgPatient') as TImage;
  img.Bitmap.Assign(TMSFMXBitmapContainer1.FindBitmap(AItem.DataString));
  b := FindChild(AContentPanel, 'cboCategory') as TColorComboBox;
  b.Color := AItem.Color;
end;
After editing the item, we also want to save the settings from our custom dialog back into the item.
procedure TForm1.TMSFNCPlanner1CustomContentPanelToItem(Sender: TObject;
  AContentPanel: TControl; AItem: TTMSFNCPlannerItem);
var
  c: TCheckBox;
  b: TColorComboBox;
begin
  c := FindChild(AContentPanel, 'chkOperation') as TCheckBox;
  b := FindChild(AContentPanel, 'cboCategory') as TColorComboBox;
  AItem.BeginUpdate;
  AItem.Color := b.Color;
  AItem.DataBoolean := c.IsChecked;
  AItem.EndUpdate;
end;
Note that we are using custom properties such as Color and DataBoolean, so we can update and edit custom information about our patient.

Last but not least, we need to make sure the planner picks up the dialog when clicking on the item.
procedure TForm1.TMSFNCPlanner1GetCustomContentPanel(Sender: TObject;
  AItem: TTMSFNCPlannerItem; var AContentPanel: TControl);
begin
  if Assigned(AItem) and (AItem.Resource = 1) then
    AContentPanel := Panel1;
end;



We hope this blog post gives you an insight on what is available specifically for editing planner items. There is much more to discover, so check out the demos and documentation.

More TMS WEB Core Tips & tricks

$
0
0

Today we want to bring to your attention two totally different TMS WEB Core features. These little tidbits that can bring your TMS WEB Core web client application from good to great. The first is about handling application termination and the second is about getting something more out of TWebStretchPanel.

Application termination

For long, handling web application termination was simple: it was not really handled. When there was a reason to handle it server side, software developers came up with the concept of sessions. In a nutshell, when a user first requests a HTML page from the server, a session is started and typically a session timer runs. If the users requests a page update or performs another request from the user, the session timer is reset. If the user does nothing or worse, closes the browser, the server timer runs and when it reaches a predefined time, for example 20 minutes, the session is considered closed and thus stopped. We have all experienced the consequences. You decide to go and grab a cup of coffee, meet a colleague in the coffee room, have an interesting talk that of course takes longer than expected and you return to your desk, want to continue using your web application and you are greeted with a session timeout and need to login again.

In the world of modern single-page web client applications with stateless REST backend, this is a lot less likely to occur as it is way less likely to have a reason for server side session management. An easy way to look at it, is that the session state is now kept in the client and the web client application will just perform stateless HTTP(s) requests to a backend when data update or retrieval is needed.

And still, even in this much more server resource friendly scenario, developers might have a reason to know when the user closes the web application to save something client or server side. To handle this, modern browsers expose the browser window "unload" and "onbeforeunload" JavaScript event. This event is triggered when the browser window is about to be closed or the user leaves the page via navigation. Other than just handling leaving the web client application, it can also be signalled to the user and a confirmation dialog shown to ask if the user really wants to leave.

In TMS WEB Core, taking advantage of this is really simple. In your TMS WEB Core web client application, handle the main form's OnBeforeUnload event. If you wish to show a confirmation dialog, return the confirmation message text via the parameter AMessage. Note that in Google Chrome, a confirmation message will be shown when the message is not empty but it will contain the standard Google text. For the reason, see: https://bugs.chromium.org/p/chromium/issues/detail?id=587940

Here is a code extract that shows the concept. A simple string variable will determine whether some action is needed before closing or not. This string s is empty by default but during application execution can be set (here via a button click). When this string is not empty, it is used to show a prompt when the user wants to close the application via the form.OnBeforeUnload event and in the form.Unload event it can be effectively handled to do a last action before unloading.

type
  TForm1 = class(TWebForm)
  public
    { Public declarations }
    s: string;
  end;

procedure TForm1.WebFormCreate(Sender: TObject);
begin
  s := '';
end;

procedure TForm1.WebButton1Click(Sender: TObject);
begin
  s := 'Action needed before leaving';
end;

procedure TForm1.WebFormBeforeUnload(Sender: TObject; var AMessage: string);
begin
  AMessage := s;
end;

procedure TForm1.WebFormUnload(Sender: TObject);
begin
  if (s <> '') then
    DoHandleUnloadHere;
end;

The result is this dialog when we try to leave the web application either by closing the browser or navigating away from it:



Stretching the use of the TWebStretchPanel

TWebStretchPanel was designed to show a fixed UI under a piece of UI with variable height. Think of a grid, list control with unknown number of rows, image with unknown size, ... TWebStretchPanel comes in handy to automatically deal with this. It is actually a HTML DIV element with two child DIV elements, one with a variable size at the top and one with a fixed size at the bottom. Obviously, as the size of the upper DIV dynamically adapts to its content, the fixed size DIV moves downward automatically. In the Delphi form designer, any control with Top coordinate set to 0 is considered part of the upper DIV, the other controls part of the lower DIV.



To demonstrate this, we have at design-time a TWebListControl with WebListControl.Top = 0 on the TWebStretchPanel and two buttons. Note that the TWebListControl.HeightStyle is set to ssAuto as we want its size to automatically adapt to the number of items it contains. We did also set the WebListControl.ElementPosition to epRelative as we expect this control to be automatically layouted by the browser in this upper DIV. Then there are two buttons of the type TWebBitBtn that are placed in the bottom part of the TWebStretchPanel. Here we set WebBitBtn.ElementPosition also to epRelative as we leave it to the browser to control the position and layout of the buttons. In the button OnClick handler we add code to add or remove items from the list:

procedure TForm1.WebButton2Click(Sender: TObject);
begin
  WebListControl1.Items.Add.Text := 'Item ' + WebListControl1.Items.Count.ToString;
end;

procedure TForm1.WebButton3Click(Sender: TObject);
var
  it: TListItem;
begin
  it := WebListControl1.Items[WebListControl1.Items.Count - 1];
  it.Free;
end;


Now, we want to introduce some extras:

Add Material icons

We add little icons from Google Material Icons to the buttons to have a visual for Add/Remove. Via the Delphi IDE project manager, choose "Manage JavaScript libraries" and add check "Material Icons". Once checked, we can select the icon to use for the button via the WebBitBtn.MaterialGlyph property. The object inspector shows all possible material icons.

  

Add Bootstrap

To give the buttons some nicer style, we wish to use Bootstrap. Also via the Delphi IDE project manager, choose "Manage JavaScript libraries" and add check "Bootstrap 3.3.7". We will use this one as it doesn't have a dependency to jQuery like 4.3.1 has. Once we enabled Bootstrap, we can select a Bootstrap button style for the buttons by setting WebBitBtn.ElementClassName to 'btn btn-primary' for example.



Add custom CSS

To give the buttons in the lower part of the TWebStretchPanel a nicer layout, we'll add some margin to the buttons, remove the focus border and make sure the buttons stay besides each other. To do this, we could have added the CSS in the project HTML file, but for clarify and to show the concept of dynamically adding CSS, it is done here in code:
procedure TForm1.WebFormCreate(Sender: TObject);
begin
  AddCSS('btnmargin','.btnmargin { margin:10px; float:left; outline:none; border:none;} .btnmargin:focus {outline: none;}');
  WebBitBtn1.ElementClassName := WebBitBtn1.ElementClassName + ' btnmargin';
  WebBitBtn2.ElementClassName := WebBitBtn2.ElementClassName + ' btnmargin';
end;
Note that we add the new introduced btnmargin CSS class to the ElementClassName as it contains already the Bootstrap class specifier.

Customize the TWebStretchPanel bottom color

Default the TWebStretchPanel are just two DIV containers within a DIV. We can access these DIV elements easily and therefore also customize these. Just to highlight one additional way TMS WEB Core web client applications can directly interact with any HTML element in the DOM, we have chosen here for educational purposes for yet another technique to set the color of the lower DIV. In the form's OnShow event, when we are sure the HTML element is in the browser DOM, we access this DIV as the 2nd child of the TWebStretchPanel main DIV container (ElementHandle) and can directly access its style property in code:
procedure TForm1.WebFormShow(Sender: TObject);
var
  el: TJSHTMLElement;
begin
  el := TJSHTMLElement(WebStretchPanel1.ElementHandle.children.item(1));
  el.style.setProperty('background-color','silver');
end;

The result of these little customizations is:



Explorer the wonderful world of TMS WEB Core

Without a doubt, the modern browser has become extremely powerful in many ways and is almost as rich as an operating system by itself.
The possibilities of HTML/CSS are virtually unlimited for the most demanding UI needs and note that these strengths can also be applied to create installable mobile device applications (PWA) or cross-platform desktop applications via the Electron framework (or other ways we will reveal in the near future).

For Object Pascal developers, we have our beloved strongly typed and object oriented language available thanks to the pas2js compiler (with coming soon more powerful than ever Object Pascal language features) and TMS WEB Core adds RAD component based development. And finally, there is a freedom of choice what IDE to use with TMS WEB Core: Delphi, Lazarus or Visual Studio Code. Wanting to explore TMS WEB Core on your Windows, macOS or Linux machine, get the free Visual Studio Code IDE and install TMS WEB Core for Visual Studio Code for it!

TMS WEB Core for Visual Studio Code v1.1 released

$
0
0



We are excited to announce the immediate availability of TMS WEB Core for Visual Studio Code v1.1 that now enables developing cross-platform Electron desktop apps and PWA's. This is a new milestone in the development of RAD component Object Pascal language based web development. The key differentiators of TMS WEB Core for Visual Studio Code are:

  • RAD component based development from the free Visual Studio Code IDE
  • RAD designer using web technology, enabling live, wysiwyg design-time rendering
  • Development directly from Windows, macOS and Linux desktop machine
  • Rich eco system of web related development extensions for the IDE
  • Modern IDE with multiview editing, direct high-DPI/retina support


With TMS WEB Core for Visual Studio Code v1.1, we complete the three targets that TMS WEB Core offers. In the new v1.1, we introduce next to classic web client applications the Electron application target and PWA target.

Visual Studio Code repository

Electron



The first new target is Electron applications. Electron is a framework that enables to create compiled applications for Windows, macOS and Linux using web technology for rendering and execution of the application. The Electron framework is fully cross platform and at application code level there is nothing to take care off in terms of different platforms. Note that it is thanks to the Electron framework that the hugely popular Visual Studio Code IDE runs on Windows, macOS and Linux directly (and recently also Raspberry Pi target was added recently). As Electron applications run as executables directly on the desktop operating system, this means that extra functionality such as direct local file access, access to all kinds of operating system dialogs (File Open, File Save), toast messages, taskbar notifications, drag & drop support and more ... is available. For a TMS WEB Core developer, this is offered through Electron specific components. For direct local or network database access, there are also two dataset components for direct access to mySQL and PostgreSQL.


PWA




The other new target is Progressive web applications. PWA is perhaps the most promising direction for web client application development. A PWA is a responsive web application that can run offline and can be installed on mobile devices (iOS/Android) and also in desktop browsers like Chrome, Firefox, Edge Chromium. After install, your PWA can be started from an icon on the home screen as if it is a native cross platform application. It can run offline and when online, it will still update itself. So, as a developer there are zero concerns about deployment. With TMS WEB Core for Visual Studio Code v1.1, you simply choose a PWA type from the projects repository and it automatically generates all necessary files for creating a PWA. Everything available for classic web applications and that you learned about it is applicable for the PWA project type.


Summary

With v1.1, the TMS WEB Core target support is completed. As far as core framework is concerned and the target support, TMS WEB Core for Visual Studio Code is now on par with TMS WEB Core on Delphi. Best of all, the projects are 100% compatible, so Visual Studio Code developers can decide to start using Delphi and continue working on a project and vice versa. Or a Delphi developer on Windows can exchange projects with a colleague using Visual Studio Code on macOS, etc...




Availability

TMS WEB Core for Visual Studio Code is available from the Microsoft Visual Studio Code marketplace, so, if you had installed it, it will auto-update. It is also available for manual install as trial version from https://www.tmssoftware.com/site/tmswebcorevsc.asp and for active customers after login on our website under "My Products".


What's next

The next big step is installable third party component support. At this moment, 3rd party components can be created and used at runtime but there is not yet support for installing these into the IDE, have the components on the tool palette and see the components at design-time. Work on this is already underway and in our internal development versions, we can confirm that the entire TMS FNC component range runs happily within the Visual Studio Code IDE. Our team works as hard as we can on reaching also this milestone. Stay tuned for this and even more exciting developments happening in the labs right now as we unwrap these!

A new consulting partner and representative for French speaking TMS/Delphi users : Thierry Laborde

$
0
0


The goal of our consulting partner network was from day one to have local experts speaking the same language and being in the same timezone available for consulting to Delphi developers using TMS components and tools. Since its inception, we work closely together with 5 partners in 5 different areas and speaking at least 5 different languages. We are proud to announce today our new consulting partner and representative for the french speaking TMS/Delphi community: Thierry Laborde!

Thierry is no unknown in the Delphi world. Thierry has been a Delphi developer for more than 20 years, since Delphi 1 (and even previously on Pascal and Turbo Pascal) as well as a project leader in different French companies in many different software domains: Accounting, payroll, gambling casino, retail, access control, advertising, bank, health...

But Thierry was obviously most visible to Delphi developers in France as technical manager of Embarcadero Developer tools in France at ArrowEcs Company (The Embarcadero distributor in France) for 6 years and later as Embarcadero Country Manager for France for less than 3 years. Thierry has been at Delphi roadshows all over France, gave numerous presentations, organised webinars and wrote blog articles.

Thierry Laborde was Delphi Developer certified as well as Delphi Master Developer certified in 2011.

What might be less known to Delphi developers and TMS component users, is that Thierry created the foundation of what became the TMS VCL WebGMaps product and Thierry collaborated on the TMS MultiTouch SDK project. It goes without saying that Thierry has a deep expertise not only in Delphi application development but also in component development.

As such, we are confident that in his role as consulting partner and representative, Thierry will be able to assist French speaking developers with even the most challenging Delphi projects getting the most out of the TMS components or recommend the right components for the job.

Without a doubt, these are exciting times for Delphi developers & TMS component and tools user in France. We are thrilled that the deep Delphi & TMS components expertise and skills from our long-time friend are available again for French speaking customers. Not only can French developers hire Thierry's expertise, but Thierry will also facilitate that customer feedback, needs, request, ... are communicated to the team to improve and extend our products. Reach out to Thierry via france@tmssoftware.com.



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.

TMS WEB Core embraces ever more powerful PWA support from Google Chrome

$
0
0



There is no doubt that Google is and remains the driving force behind the fast evolving web world. And with Microsoft having adopted the Google Chromium engine in its latest and new default Windows 10 operating system browser, it is clear that the browser gets ever more powerful with each release.

While every Chrome update sees a lot of enhancements, the release 86 introduced perhaps another disruptive feature: the file system access API!

Yes, you read this correct, file system access API or in other words, access to the local file system from a PWA (Progressive Web App)! Of course, Google took the necessary measures to look over security. I can imagine you wouldn't want to be directed to some URL and the web application at this URL will suddenly start scanning your local hard drive.
All local file access remains initiated by user interaction and user consent!


User consent prompt to view files in a folder

What the File System Access API actually provides is:

  • open local text or binary files
  • save to a local text or binary files
  • use the operating system file dialog to pick a file
  • use the operating system file dialog to save to a file
  • get access to a folder and its files/subfolders
  • use the operating system to select a folder
  • associate file types with PWA apps


Now, you will understand that as we read the news, we were eager to investigate integration capabilities in a TMS WEB Core PWA and reflect on bringing easy to use Pascal language wrapper classes to take advantage of this new functionality. So, in our labs, we created a support unit for local file handling : WEBLib.LocalFiles. In this unit, three classes are available: TTextFile, TBinaryFile and TFolder.

Working with local text files

TTextFile offers following public interface

  TTextFile = class(TObject)
  public
    procedure OpenFile; overload;
    procedure OpenFile(AOpenFile: TOpenTextFileProc); overload;
    procedure SaveFile; overload;
    procedure SaveFile(ASaveFile: TSaveFileProc); overload;
    procedure SaveAsFile; overload;
    procedure SaveAsFile(ASaveFile: TSaveFileProc); overload;
    property Text: string;
    property FileName: string;

    property OnFileOpen: TNotifyEvent;
    property OnFileSave: TNotifyEvent;
  end;

As you can see there are overloads for the OpenFile, SaveFile and SaveAsFile methods. In one version of the methods, there is an anonymouse method that is called when the action on the file completed and the other versioni will signal completion via an event.

To use the class to open a file, we can write:

begin
  ATextFile := TTextFile.Create;
  ATextFile.OpenFile(procedure(AText: string)
    begin
      WebMemo1.Lines.Text := AText;      
    end);
end;

If the text was modified in the memo control, it can be saved with following code working on the same instance of the TTextFile object:

begin
  ATextFile.Text := WebMemo1.Lines.Text;
  ATextFile.SaveFile(procedure
    begin
      ShowMessage('File succesfully saved');
    end);
end;

As you can see, it becomes extremely easy for Pascal developers to take advantage of the file system access API in the browser!

Working with local binary files

For binary files, a similar class TBinaryFile was created with the important different from the TTextFile that here the data read or to be saved is of the type TJSArrayBuffer. TJSArrayBuffer is the Object Pascal wrapper for the JavaScript ArrayBuffer which basically is an array of bytes.

The interface of TBinaryFile is the same as TTextFile except that it exposes public property TBinaryFile.Data: TJSArrayBuffer.

To demonstrate its use, we can open a local image file with the following code:

var
  base64String: string;
begin
  ABinaryFile.OpenFile(procedure(AValue: TJSArrayBuffer)
   begin
     base64string := ArrayBufferToBase64(AValue);
     base64string := 'data:image/jpeg;base64,'+base64String;
     WebImageControl1.URL := base64string;
   end);
end;

As you can see, the image file binary data is received via the TJSArrayBuffer and we neeed to convert it to a base64 dataURL in order to visualize it in a TWebImageControl.

Saving an image is equally simple:

begin
  ABinaryFile.Data := Base64ToArrayBuffer(WebImageControl1.Base64Image);

  ABinaryFile.SaveAsFile(procedure
    begin
      ShowMessage('File succesfully saved');
    end);
end;

Working with folders

Next is working with folders. The File system access API offers a way to show the operating system folder to select a folder. Once access is given after picking the folder, the API enables to retrieve all files and folders in the selected folder. As such, we can get access to all files in this folder or even open a subfolder and query all files in the subfolder. As there is folder access, we have also the capability to get access to all files in the folder.

The TFolder class has following public interface

  TFolder = aclass(TObject)
  public
    procedure Open; overload;
    procedure Open(AOpenFolder: TOpenFolderProc); overload;
    procedure CreateFolder(AName: string);
    procedure CreateFile(AName: string);
    procedure GetFile(AName: string; GetFile: TGetFileProc);
    procedure GetFolder(AName: string; GetFolder: TGetFolderProc);
    property Files: TFileSystemFileHandleArray;
  published
    property OnFolderOpen: TNotifyEvent read FOnFolderOpen write FOnFolderOpen;
  end;

So, to let the user select a folder and list all files in the folder, we could do:

var
  AFolder: TFolder;
  l: integer;
begin
  AFolder := TFolder.Create;
  AFolder.Open(procedure 
    begin
      for l := 0 to Length(AFolder.Files) - 1 do
         WebListBox1.Items.Add(AFolder.Files[l].Name);
    end);
end;

As a proof of concept, we created three PWA's with TMS WEB Core. One is a local folder browser, the other is a code editor you can use the edit local files (including .PAS files) and the third is a photo editor that allows you to take advantage of web technology to change hue, brightness, contrast, ... of pictures and save the modified version.

You can find the demos here

Folder file browser
https://www.tmssoftware.com/pwa/filebrowser

Code editor
https://www.tmssoftware.com/pwa/codeeditor

Image editor
https://www.tmssoftware.com/pwa/imageeditor


Click image to see the image editor in action

We are further fine-tuning and polishing our easy to use Object Pascal wrappers for the file system API and you can expect this and way bigger things in the next major release of TMS WEB Core. Note that all this functionality will be possible from TMS WEB Core from Delphi, from Visual Studio Code and also from Lazarus. We are eager to learn what great ideas you have for PWAs developed with TMS WEB Core and hear your comments, feedback and wishes for further developments in the comments on this blog.


Double vector graphics, double quality

$
0
0

Intro

TMS VCL UI Pack offers a wide range of visual and non-visual components. Recognizing visual components is easy: drop them on the form and you're ready to go. Non-visual components, which in many cases, carry and support a lot of the visual components are not that recognizable when going on an exploration mission through the contents of the TMS VCL UI Pack. In today's blog post, I want to focus on a non-visual component, and a powerful engine that brings high quality vector graphics to life in your application: TAdvPDFLib & SVG support. When combining both, we get an out of the box, best quality vector graphics experience that will take your application to the next level.

SVG support

A while ago, we added SVG support in TMS VCL UI Pack. Whenever an SVG file is loaded, the internal vector graphics engine takes over and renders the SVG. This all happpens automatically at designtime, but at runtime, when loading an svg, we need to make sure the SVG engine is registered. To do this, add AdvTypes to the uses list. After this unit is added, we can load SVG files by using one of the methods to assign a value to a TPicture property, or any other property included in the TMS VCL UI Pack that support SVG.
uses
  AdvTypes;

procedure TForm1.LoadSVG;
begin
  Image1.Picture.LoadFromFile('nature.svg');
end;


Exporting to PDF

When integrating reporting in your application, you often re-organize your data into a grid / table structure and add a graphic in the form of an image. This could be anything such as a company logo or a chart that accompanies the data. To make sure the image quality is good, the size needs to be large enough. Depending on the way the report is actually displayed or printed, this could result in quality loss as the image is added with a fixed size. By using an SVG, the size does not matter, as it will be rendered by the native PDF graphics engine with the best quality. When we apply this when exporting to PDF, the code looks like this:
uses
  AdvPDFLib, Types;

 procedure TForm1.Button1Click(Sender: TObject);
var
  p: TAdvPDFLib;
begin
  p := TAdvPDFLib.Create;
  try
    p.BeginDocument('SVGToPDF.pdf');
    p.NewPage;
    p.Graphics.DrawImageFromFile('nature.svg', RectF(50, 50, p.PageWidth - 50, 500));
    p.EndDocument(True);
  finally
    p.Free;
  end;
end;


When zooming in, you'll notice that the quality is not affected because of the native vector graphics used inside the PDF document.



Explore!

Go ahead and download TMS VCL UI Pack and explore the vast amount of visual and non-visual features and components.

Black Friday 2020

$
0
0



And we are back with our best deals for Black Friday 2020!
Buy one product and get a second same or lower priced product at 50% discount! (new licenses only)
Enjoy this super deal this Friday, all day long!

Purchase your first product and just contact our team at sales@tmssoftware.com for your coupon code for the second license.

Don't wait and take advantage now!


Share your excitement:



FlexCel .NET, .NET5, Blazor and WebAssembly - Part 1

$
0
0

Introduction: Supporting .NET 5


We've just released FlexCel .NET 7.8, which adds support for .NET 5.

Usually, "adding support" for a new version of a .NET framework is just recompiling the code, but in this case, as .NET 5 is the successor of .NET Core 3, not of .NET framework 4.8, things got a little more complicated. There were subtle errors generated from the switch from NLS in Windows to ICU (see https://docs.microsoft.com/en-us/dotnet/standard/globalization-localization/globalization-icu ), and there were issues with the switching of the graphics engine from GDI+ to SKIA.

For this release we spent a lot of time optimizing the SKIA rendering, so it is now a little faster than GDI+. We added a way to switch back to GDI+ in Windows if you need to deal with WMF/EMF files or right-to-left languages (see https://doc.tmssoftware.com/flexcel/net/guides/net-core-guide.html ). We made a full review of all string comparisons in the code to ensure they work with ICU.

But this is all just business as usual. For this post, we wanted to have a little fun. And so we decided to investigate what cool stuff we can do with .NET 5 and FlexCel.


Generating a client-side app using Blazor and WebAssembly

Even if still a work in progress, one of the hot new things in .NET 5 is the improvements in Blazor, and more specifically, Blazor WebAssembly.

Blazor WebAssembly allows you to run a web app enterely on the browser, offline, in electron, and it even supports Progressive Web Applications

It made sense then to start with a small WebAssembly app using FlexCel .NET. But before getting into that and getting the hopes too high, I'd like to mention two limitations currently in Blazor WebAssembly:

  1. Blazor doesn't yet support AOT. This means that in order to compile to WebAssembly, Blazor currently has a .NET interpreter running in WebAssembly, and the interpreter runs .NET IL, not WebAssembly IL. FlexCel isn't directly converted to WebAssembly, but it rather runs in the browser as .NET IL. And because of there is no "real" FlexCel WebAssembly yet, it is not currently feasible to call FlexCel WebAssembly from TMS WEB Core

  2. The graphics engine we use for cross-platform rendering,(SkiaSharp), doesn't currently support Blazor WebAssembly, even if they are working on it. Not having SKIA means that you can't use the FlexCel rendering engine in WebAssembly, so you currently can't export an Excel file to PDF, SVG, or HTML in Blazor WebAssembly.Note that "Server Blazor", which runs native .NET 5 code in the server, doesn't have this limitation.

Both limitations should go away relatively soon, but we wanted to be completely honest about the current state. So now, with that out of the way, let's start. For this first example, we will create a Blazor WebAssembly "calculator" app that runs in the client and uses the FlexCel engine to calculate expressions






This was the first part of a 2-part series. In this one, we investigated client-side Blazor. In the next part, we will play a little with server-side Blazor.

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

$
0
0

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:





TMS priority support

$
0
0



"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:
  1. documentation / Manuals
  2. Videos
  3. 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:



Viewing all 1016 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>