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

Get started with TMS WEB Core for Visual Studio Code

$
0
0



The first version of TMS WEB Core for Visual Studio Code v1.0 has been released! Visual Studio Code is the 3rd IDE that can host the TMS WEB Core framework for web client application development after the earlier released versions for Delphi and Lazarus. TMS WEB Core offers Object Pascal software developers visual RAD component-based web client development with the strongly typed and object-oriented Pascal language.

For developers who are not yet used to Visual Studio Code, this is a completely new world. That’s why here is a starting guide, with all the information you need to get started!

Get started with TMS WEB Core for Visual Studio Code

TMS videos Videos: José Leon Serna (chief architect)
YouTube channel Blog articles Books Online courses
With version 1.0 the first step has been taken and further developments are being made to expand this into a very productive and rich platform.

TMS WEB Core for Visual Studio Code is now available at our special launch price starting from 295EUR for a single developer license! And you can also download and explore this new ground-breaking product using the trial version!

Follow us on social media and don't miss our blogs!




TMS WEB Core Academic is here for Delphi developers!

$
0
0



This year in February, we launched TMS VCL UI Pack Academic. In April, we launched TMS FNC UI Pack Academic. And now in September, we launch TMS WEB Core Academic!

TMS Academic program


With TMS VCL UI Pack Academic, we want to inspire and motivate students and teachers to learn about the power of the Delphi VCL framework and help users to build even more powerful, visually pleasing, and feature rich Windows desktop applications.

With TMS FNC UI Pack Academic, we want to do the same for FMX cross platform applications. Empower students and teachers to discover the fascinating world of cross platform development with Delphi and the FireMonkey framework. TMS FNC UI Pack delivers over 70 extra sophisticated cross platform/cross framework visual controls to enrich native applications created with Delphi for Windows, iOS, macOS and Android. And now, with the third step, we want to motivate students and teachers to discover that Delphi can also be an extremely productive tool for web client application development.

TMS WEB Core Academic


TMS WEB Core , offers RAD component based visual development of web applications driven by the strongly typed and object-oriented Object Pascal language from the familiar and beloved Delphi IDE. It is clear that with the first three academic editions of our popular products, we hope students will enjoy picking up Delphi and experience how powerful it is and how it makes software development fun at the same time. With that, we want to offer our contribution to nurture the next generation of enthusiast and passionate Delphi developers.

As all our other academic releases, it is designed for use with the latest and greatest Delphi version, now v10.4.x Sydney. In order to obtain the academic licensed version of TMS WEB Core, students and teachers need to provide an academic email address and their school or university information. In addition to the fully functional academic version of TMS WEB Core, there is plenty of information to learn about TMS WEB Core and to get started.

Getting started


Manual:

TMS WEB Core Developers Guide


Demos:

TMS WEB Core demos


Videos:

TMS WEB Core videos


Books:



TMS WEB Core: Web Application Development with Delphi


Training class:


courses.landgraf.dev

Next level:
And for those students who want to rise to the next level, there is the TMS WEB Core partner program! Develop your own components or Object Pascal interfaces to existing JavaScript libraries and publish these via the TMS WEB Core partner program. Contributing partners will get the regular TMS WEB Core version with a license that permits to use it with Delphi IDEs XE7 to 10.4 including Lazarus on Windows, macOS, and Linux but also with our brand new TMS WEB Core for Visual Studio Code that can be used also from all three major desktop operating systems.

It speaks for itself that we are enthusiastic to see students and teachers "go web" and we are more than curious to see what exciting, new, and innovative solutions will surface. With all that, you will move your career forward, move Delphi forward, and move TMS WEB Core forward!

Request the academic license now!

Don’t wait for the perfect moment. Take the moment and make it perfect. Request your academic license here: https://www.tmssoftware.com/academic





Hands-on: Building web design for a RAD Studio TMS WEB Core project

$
0
0

I have been a Delphi developer since 1996. During this journey, I have learned new skills and acquired new tools to keep up with the demands of the the software market. In the early 2000s, I learned about AJAX, web services, and basic web design. However, my studies did not require extensive software development for the World Wide Web, and I was happy to go back to developing user interfaces with Delphi in the VCL.

Times have changed significantly since then, and I have to be honest that right now I am still learning about web design for modern web development each day. It has become a major part of my daily routine to learn one new aspect of web development each day. I consider web development a mandatory tool in every software developer's tool belt. Basic web design skills go just along with it.

If you struggle with HTML and CSS just as much as I, look no further. I might just have the video tutorial you need. The best thing about it: It's free. It will start right at the beginning.

From the perspective of a Delphi developer, you will learn step-by-step how to build my application that I built to make ordering my books easier.

As you can see, you can select the store and book title you want to order and the application will navigate to the page for you where you can order the book.

Very simple. Or really? Three months ago, the design of the page would have been an impossible thing to do.

You will learn about:

  • Separating application development with TMS WEB Core and web design
  • Bootstrap
  • FontAwesome
  • Using (free) plugins in Visual Studio Code for web design
  • Emmets and code completion for web design with Visual Studio Code
  • WYSIWYG of your web design in the web browser
  • Link you web design to your application controls
If you have a TMS WEB Core license and use RAD Studio, this tutorial will get you started how to develop web applications with external web design. For the external web design, we will use Visual Studio Code.

If you like this tutorial and the hands-on approach, you will find more examples of this type in the book series. You can use the form above to learn more about each book title on Amazon.



Holger Flick




Documenting your Delphi REST API the easy way

$
0
0

Create documentation is boring. At least that's my opinion, and most developers I know also don't like to write it. But that's something we need to do, of course. Thus, the easiest it gets to document things, the better.

Photo by Aaron Burden on Unsplash

With TMS XData, you create your REST API server using Delphi very easily, but you also get it documented almost automatically using the automatic Swagger generation feature. Since all endpoints are strong typed in server, all it takes is just to enable a single property and have your endpoints listed and testable. This feature has been available for years already.

But now XData takes it to another level. A good (if not the best) way to document your source code is to use XML Documentation Comments. In the interfaces and methods that build your service contract, you can simply add specific XML tags and content, like this:

    /// <summary>
    ///   Retrieves the sine (sin) of an angle
    /// </summary>
    /// <remarks>
    ///  Returns the Sine (Sin) value of an angle radians value.
    ///  The value returned will be between -1 and 1.
    ///  If the angle is zero, the returned value will be zero.
    /// </remarks>
    /// <param name="Angle">
    ///   The angle in radians.
    /// </param>
    function Sin(Angle: Double): Double;

And Delphi IDE will automatically use it for Help Insight , showing you information about the method on-the-fly. For example, if some developer is trying to use the Sin method of your API, information will be conveniently displayed:

xdata-xml-help-insight


The good news is that, with XData, you can use such XML comments in the Swagger document and Swagger-UI that are generated automatically by XData, improving even more your REST API documentation. Since the API endpoints are generated directly from the interfaced and methods, XData knows exactly the meaning of each documentation and can map it accordingly to Swagger.

By asking Delphi to generate the XML documentation files, and using a single line of code like this:

uses {...}, XData.Aurelius.ModelBuilder;
 ...
   TXDataModelBuilder.LoadXmlDoc(XDataServer.Model);

XData will reuse the documentation and include it in Swagger:

xdata-xml-help-insight


Using different documentation for Help Insight and Swagger

Reusing the same XML comments is nice as you don't repeat yourself. Document your code just once, and the same documentation is used for documenting your Delphi interfaces (Delphi developments) and your REST API (API consumer development).

But, if for some reason you want to use different documentation content for Delphi developers and for REST API users, that's also possible. For example, suppose the following documentation:


Note that tags summary and param are the regular XML documentation tags. They will be used for Help Insight:

xdata-xml-help-insight-2


And swagger tags with no name attribute (A), or name param-A (B), param-B (C) and remarks (D) will be used exclusively for Swagger documentation:

xdata-xml-swagger-example-2


Customizing tags

You can also customize the tags in Swagger. Endpoints are grouped together inside a tag, which can have a name and description.

By default, the name of the tag will be path segment of the interface service. But you can change it using either swagger tag using tag-name attribute.

The description of the tag by default is empty, but you can define it using the regular summary tag, or optionally using the swagger tag with tag-description attribute.

Consider the following documentation for both IArithmenticService and ITrigonometryService :

xdata-xml-tag-source


The above tags will generate the following output in Swagger UI:

xdata-xml-swagger-tags



Customizing document header and description

XData also takes the model name, version and description into account to build the final document. You can configure such settings directly by changing some properties of the XData model:

  XDataServer.Model.Title := 'Mathematics API';
  XDataServer.Model.Version := '1.0';
  XDataServer.Model.Description :=
    '### Overview'#13#10 +
    'This is an API for **mathematical** operations. '#13#10 +
    'Feel free to browse and execute several operations like *arithmetic* and *trigonometric* functions'#13#10#13#10 +
    '### More info'#13#10 +
    'Build with [TMS XData](https://www.tmssoftware.com/site/xdata.asp), from [TMS Software](https://www.tmssoftware.com).' +
    'A Delphi framework for building REST servers'#13#10 +
    '[![TMS Software](https://download.tmssoftware.com/business/tms-logo-small.png)](https://www.tmssoftware.com)';

Note that you can use Markdown syntax to format the final text. Here is what it will look like:

xdata-swagger-doc-description


You can read more about using XML documentation in Swagger with TMS XData by referring to the official documentation page.


Finally, this video shows in details how REST/JSON documentation works with XData, explaining how Swagger and Help Insight documentation is built from single source, how XML comments can be used, and even more. Lots of useful information there!




TMS FNC UI Pack v3.2 Revealing some highly anticipated components

$
0
0

We already have an extensive set of powerful and feature-rich UI controls in our TMS FNC UI Pack. But there is always room for some additional tools to help you with your cross framework and cross platform work. In this new release of our TMS FNC UI Pack we’ve added 5 new components which were requested by you, our community of great developers who see the enormous advantages of components that can be used on VCL, TMS Web Core, FMX and Lazarus with just one code base.

TMS FNC Controls can be simultaneously used on these frameworks:


TMS FNC Controls can be simultaneously used on these operating systems/browsers:


TMS FNC Controls can be simultaneously used on these IDE's:


New to the TMS FNC UI family

TTMSFNCRichEditorHorizontalRuler




TTMSFNCRichEditor has a ruler control that can be connected to it. This control has the intuitive handling that you are familiar with from the advanced text editors. With this ruler you can easily control the margins of your page and the indentation of your text. And you have the ability to add tabs, which sets the position of your text when the next tab is pressed. This component is a great advantage to get your text document to a higher level as it helps you with the layout of your text.

TTMSFNCSplitter




Our TTMSFNCSplitter has the same behavior as other splitters, but as this is a FNC control, you can use the same component on all the different platforms. No more need to set framework specific properties. Next to this timesaving feature, we have made the appearance customizable to your preferences, so the control can blend in with your application.

TTMSFNCProgressBar




One of the most requested components is the TTMSFNCProgressBar, this provides users with visual feedback about the progress of a procedure within an application. With more than 25 properties to set the appearance and layout of the component, you have a huge range of possibilities to customize your TTMSFNCProgressBar. And by changing the minimum and maximum value, you can easily invert the direction of the progress.

TTMSFNCRating




While we were creating the TTMSFNCProgressBar, we noticed that it might be nice to have a similar control with interaction. Therefor we created TTMSFNCRating. With the use of images (SVGs as well) you can set a scale to give a rating. If you clear the images, the control will look like a TTMSFNCProgressBar but with the ability to interact with it. This can be done by clicking on the value that you want, sliding from the end of the progress to where you want or via your keyboard with the arrow keys.

TTMSFNCWaitingIndicator




An indicator for illustrating an indefinite waiting time for a task that is in progress. You can choose if you want show a progress or if you want circles, squares or images moving around a center bitmap or if you want them to change size. In case you want to show that a form or a panel is currently not available, you can center the waiting indicator over the parent and use an overlay to emphasize this.

If you want to see some other examples or the behavior of the FNC splitter and rating control, you can have a look at the following video:


From Windows Certificate Store to TMS Cryptography Pack TX509Certificate component.

$
0
0

TX509Certificate is a component of TMS Cryptography Pack to use X509 certificates. With it, we can sign certificate signing request (CSR) or use it in XAdES, CAdES or PAdES to sign or verify documents.

We can generate self-signed certificates, import them from PEM file, from PEM string, from PFX file.

In this post, I will explain how to import certificate from Windows Certificate Store.

To do that, we have to use the crypt32 DLL and CertOpenSystemStore and CertFindCertificateInStore.

CertOpenSystemStore

function CertOpenSystemStore(hProv: HCRYPTPROV; szSubsystemProtocol: LPCTSTR)
 : hCertStore;

This function is used to open the certificate store. The microsoft documentation is here.
The first parameter hProv is not used and should be set to NULL. The second parameter is a string that names a system store. Most common options are:



You can use CertEnumSystemStore function to list the names of existing system stores. The function returns an handle to the store. CertFindCertificateInStore
function CertFindCertificateInStore(hCertStore: hCertStore;
 dwCertEncodingType, dwFindFlags, dwFindType: DWORD; pvFindPara: Pointer;
 pPrevCertContext: PCCERT_CONTEXT): PCCERT_CONTEXT;

The function finds a certificate in a given store. The Microsoft documentation is here. The first parameter is the handle of the store, returned by CertOpenSystemStore. The second parameter is the encoding type of the cert. The options are:
  • X509_ASN_ENCODING
  • PKCS_7_ASN_ENCODING
We will use only X509_ASN_ENCODING because it is the certificate encoding type.

The third parameter is used with some dwFindType values to modify the search criteria. For most dwFindType values, dwFindFlags is not used and should be set to zero.

The fourth parameter specifies the type of search being made. For the complete list of options, you can read the documentation. We will use in this example the CERT_FIND_SUBJECT_NAME option, to search from subject name of the certificate.

The fifth parameter contains the content of the search. In your example, it will contain the subject name of the certificate we want.

The sixth parameter is a pointer to the last CERT_CONTEXT structure returned by this function. This parameter must be NULL on the first call of the function. To find successive certificates meeting the search criteria, set pPrevCertContext to the pointer returned by the previous call to the function. If the function succeeds, the function returns a pointer to a read-only CERT_CONTEXT structure. A CERT_CONTEXT structure is:

_CERT_CONTEXT = record
    dwCertEncodingType: DWORD;
    pbCertEncoded: LPBYTE;
    cbCertEncoded: DWORD;
    pCertInfo: PCERT_INFO;
    hCertStore: hCertStore;
  end;

dwCertEncodingType is the encoding type of the certificate, pbCertEncoded is the content of the certificate, cbCertEncoded is the length of the certificate, pCertInfo is the certificate information and hCertStore is the store.

Code
The code to import a TX509Certificate from the Windows Certificate Store is the following:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  CryptBase, X509Obj, MiscObj;

const
  X509_ASN_ENCODING = $00000001;
  CERT_FIND_SUBJECT_STR = 8 shl 16 or 7;  // values taken from System.Net.HttpClient.Win

type
  HCRYPTPROV = ULONG_PTR;

  _CERT_CONTEXT = record
    dwCertEncodingType: DWORD;
    pbCertEncoded: LPBYTE;
    cbCertEncoded: DWORD;
    pCertInfo: PCERT_INFO;
    hCertStore: hCertStore;
  end;

  PCERT_CONTEXT = ^_CERT_CONTEXT;
  PCCERT_CONTECT = PCERT_CONTEXT;

  function ExtractCertWindowsStore(subjectName: string): TX509Certificate;

  function CertOpenSystemStore(hProv: HCRYPTPROV; szSubsystemProtocol: LPCTSTR)
    : hCertStore; stdcall; external 'crypt32.dll' name 'CertOpenSystemStoreW';

  function CertFindCertificateInStore(hCertStore: hCertStore;
    dwCertEncodingType, dwFindFlags, dwFindType: DWORD; pvFindPara: Pointer;
    pPrevCertContext: PCCERT_CONTEXT): PCCERT_CONTEXT; stdcall;
    external 'crypt32.dll' name 'CertFindCertificateInStore';

implementation

{$R *.dfm}

function ExtractCertWindowsStore(subjectName: string): TX509Certificate;
var
  Store: hCertStore;
  Cert: PCCERT_CONTEXT;
  s: string;
  i: integer;
  Conv: TConvert;
  X509Cert: TX509Certificate;
begin
  Cert := nil;
  Store := CertOpenSystemStore(0, PChar('MY'));
  if (Store <> nil) then
    Cert := CertFindCertificateInStore(Store, X509_ASN_ENCODING, 0,
      CERT_FIND_SUBJECT_STR, PChar(subjectName), nil)
  else
     raise Exception.Create('Unable to open certificate store');

  if (Cert <> nil) then
  begin
    s := '';
    for i := 0 to Cert.cbCertEncoded - 1 do
      s := s + IntToHex(integer(Cert.pbCertEncoded[i]), 2);

    Conv := TConvert.Create(hexa);
    try
      s := Conv.HexaToBase64(s);
    finally
      Conv.Free;
    end;
    X509Cert := TX509Certificate.Create;
    X509Cert.CrtStr := s;
    X509Cert.Decode;
    Result := X509Cert;
  end
  else
    raise Exception.Create('Certificate ' + subjectName + ' not found');
end;

end.



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.

Viewing all 1093 articles
Browse latest View live


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