Category: Firemonkey

Next generation cross-platform components

Our team is very hard at work to continue to extend and improve our products, extend the documentation and make new demos.
We do this on a daily basis to make sure we offer you the best solution for your projects!

In 2019 we focused primarily on our FNC framework. Not only improving our existing components, but also adding new products, such as the TMS FNC Cloud Pack, TMS FNC Dashboard Pack, …

And that because we truly believe that FNC is the next generation cross-platform framework!

Our FNC development originated from our vast experience and deep technical expertise developing FMX components since it first appeared in Delphi in 2011 and as it became available in TMS FMX UI Pack, TMS FMX Chart and TMS FMX Cloud Pack.
We developed it because with our experience, we thought there was a better way to create cross-platform UI controls.

The most important differences between FMX and FNC are:

  • Architecture based on orginal FireMonkey classes
     
  • Not easy to extend/customize
     
  • Performance is hard to achieve when complex UI controls involve many objects
  • Basic design-time integration
  • Supports the FMX framework only
  • New independent architecture built-up from scratch
  • Easily extendible with many customization options/events
  • Faster performance, high quality graphics
  • Enhanced design-time integration
  • Supports multiple frameworks (FMX, VCL, LCL and WEB)
  • High level of compatibility with older FMX code

TMS FNC components can be simultaneously used on these 4 frameworks:

TMS FNC components can be simultaneously used on different operating systems and browsers:

Unique advantages of FNC

  • an easy maintainable single-source cross-framework/cross-platform code base
  • seamless integration in new and existing applications, can be mixed with other regular FMX or VCL controls
  • high performance and high quality graphics
  • intuitive & consistent property layout to smoothen the learning curve
  • only 1 license & only 1 learning curve to create applications for VCL, FMX, LCL and WEB

Large range of FNC controls available

  • TMS FNC Blox: Add diagram and flowchart capabilities to your application.
  • TMS FNC Chart: Fully cross-platform chart for business, statistical, financial & scientific data
  • TMS FNC UI Pack: Powerful, feature-rich UI controls for 4 frameworks and 5+ operating systems
  • TMS FNC Dashboard Pack: Create dashboard applications for Windows, cross-platform and the web
  • TMS FNC Cloud Pack: Seamless access to cloud services from Windows, cross-platform and the web
  • TMS FNC Component Studio: Our time & cost saving bundle of all FNC components

Looking for components to enhance your cross-platform project? We invite you to visit the TMS FNC landing page where more information is provided, including key features, demos and more…

Upgrade your license to TMS FNC components and take advantage of the different possibilities to develop extraordinary projects.

Eager to try out our FNC components?

Contact sales@tmssoftware.com for the best discount upgrade offer depending on your currently purchased products.

Read More

Read More

FireMonkey Application with Multiple Monitors

I need to get the Screen Scale for the monitor my application is being displayed on. The multi-platform run-time TPlatFormServices has a service called IFMXScreenService that returns the Screen Scale (GetScreenScale). The problem is it only returns it for the primary monitor. I need to get it for whichever monitor my application is being run on. Below is my C++ code for getting the IFMXScreenService. How do I modify it to get the screen service for my active monitor? if (TPlatformServices::Current->SupportsPlatformService(__uuidof(IFMXScreenService)) == true) { pScreenService_ = TPlatformServices::Current->GetPlatformService(__uuidof(IFMXScreenService)); }
Read More

Invoking/Executing a function AFTER caller function finished or returned in FMX or System Library

TMessageManager's 'SendMessage' method does NOT invoke the 'Subscribed' (or associated callback) function AFTER the function that calls the 'SendMessage' is finished. For a usable solution for this problem, I was thinking about using TTimer with least possible time interval (which is 1 millisecond) so that when you Enable the timer in the caller function, the OnTimer event of TTimer will have to be triggered AFTER the function that Enabled it. I think this is a kind of "slow" and ugly workaround to this problem. Is there any Application-wide messaging facility in FMX or System Library that can invoke a callback function AFTER the caller function is finished or returned ? (Other application messages processed/invoked between them is also okey) This is for FMX or Multi-Device Cross Platform development by the way. Not specific to VCL or Windows Environment. (What I really want, is to be able to send a message to the own application similar to the how Windows API function PostMessage behaves. The messages sended by PostMessage appear from windows procedure callback function after PostMessage function is returned.)
Read More

FMX: Vertical Scrollbox scroll programmatically not working

Hello Stack Community, Right now I'm developing an application for Android and iOS. I have a FMX Form with a TabControl. At Runtime I create Tabitems with a TVerticalScrollBox with several custom Panelclasses as Children. I created swipe gestures (left & right) to change between the TabItems, which is working perfectly. But when I want to scroll up and down my Custom Panels are catching the swipe gesture and not the Scrollbox. So I'm catching the swipe gestures (up & down) with my custom panels and try to scroll the VerticalScrollBox by Code, which is not working. I'm able to get the Owner (VerticalScrollbox) of the CustomPanel and parse it to a TVerticalScrollBox Component. But when I'm calling the ScrollBy Procedure of the VerticalScrollbox nothing happens. Any Suggestions or Workarounds? Best Regards some sample code The ScrollBox I create at Runtime: lScrollBox := TVertScrollBox.Create(lItem); lScrollBox.Parent := LItem; lScrollBox.Name := lScrollBox.ClassName + '_' + inttoStr(i); lScrollBox.Align := TAlignLayout.Client; lScrollBox.ShowScrollBars := False; lScrollBox.Visible := True; lScrollBox.Touch.GestureManager := lGesture; lScrollBox.Touch.StandardGestures := [TStandardGesture.sgLeft, TStandardGesture.sgRight,TStandardGesture.sgUp,TStandardGesture.sgDown]; lScrollBox.Touch.InteractiveGestures := [TInteractiveGesture.Pan]; lScrollBox.OnGesture := onGesture; my Custom Panels I Create at Runtime... Test := TjilsDatePanel.Create(lScrollBox); Test.Parent := lScrollBox; Test.TabNumber := i; Test.ObjectNumber := strtoint(jDate.GetValue<string>('key')); Test.Name := 'Test'+ jDate.GetValue<string>('key'); Test.Therapy := jDate.GetValue<string>('Therapie'); Test.Start := jDate.GetValue<string>('Start'); Test.Ende := jDate.GetValue<string>('Ende'); Test.Info := jDate.GetValue<string>('Termin'); Test.Touch.GestureManager := lGesture; Test.Touch.StandardGestures := [TStandardGesture.sgLeft, TStandardGesture.sgRight, TStandardGesture.sgUp, TStandardGesture.sgDown]; Test.Touch.InteractiveGestures := [TInteractiveGesture.pan,TInteractiveGesture.LongTap]; Test.OnGesture := onGesture; Test.setlGesture(lGesture); Test.setTabControl(lTabControl); Test.createObjects(Test.TabNumber); also my onGesture Procedure... procedure TReTinAMainLogicLayer.onGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); begin if Sender.ClassName = 'TVertScrollBox' then begin if EventInfo.GestureID = sgiLeft then ChangeTabActionPrevUpdate; if EventInfo.GestureID = sgiRight then ChangeTabActionNextUpdate; if EventInfo.GestureID = sgiUp then showMessage('TVertScrollBox UP'); if EventInfo.GestureID = sgiDown then showMessage('TVertScrollBox DOWN'); Handled := true; end; if Sender.ClassName = 'TjilsDatePanel' then begin if EventInfo.GestureID = sgiLeft then ChangeTabActionPrevUpdate; if EventInfo.GestureID = sgiRight then ChangeTabActionNextUpdate; if EventInfo.GestureID = igiLongTap then setUpComView(Sender as TjilsDatePanel); if EventInfo.GestureID = sgiUp then showMessage('TjilsDatePanel UP'); if EventInfo.GestureID = sgiDown then scrollUp(Sender as TjilsDatePanel); Handled := true; end; end; and finally my scrollUp Procedure... procedure TReTinAMainLogicLayer.scrollUp(Sender: TjilsDatePanel); var VertBox : TVertScrollBox; begin if Sender.Owner.ClassNameIs('TVertScrollBox') then begin VertBox := Sender.Owner as TVertScrollBox; VertBox.BeginUpdate; VertBox.ViewportPosition := TPointF.Zero; VertBox.ScrollBy(400,400); VertBox.ScrollTo(500,500); VertBox.RealignContent; VertBox.EndUpdate; end; end;
Read More

Is there a csOwnerdrawfixed Style or equivalent available for FMX TCombobox

I am converting a VCL project to FMX to take advantage of multi-platform functionality and add a more modern style to the project. I am using a TCombobox to display a location and an IP Address. In the VCL project I am able to use the csOwnerDrawFixed style that allows me to handle tsv formatted text and display neatly what displays as two columns in the combobox dropdown. I have searched high and low to find a similar method to do the same with the FMX combobox but to no avail. Is this functionality hidden away some place that I have yet to find or is it simply not available in the FMX combobox component? If the latter is the case, is there a way to show tsv formatted text in an FMX combobox. Any help much appreciated.
Read More

Delphi Datasnap: How to know the name of the methods called by client in delphi datasnap server?

A great tip from [WayBack] Hi, need help regarding Datasnap. How to know the name of the methods called by client in delphi datasnap server? – sujansiddhi – Google+ that I needed a few months ago: Walter Prins: Inside TDSAuthenticationManager.OnUserAuthorize, inspect the EventObject.MethodAlias property. (Obviously once the method is actually called you implicitly know the methodname.) This was introduced in Delphi XE: [Archive.is] DSAuth.TDSAuthenticationManager.OnUserAuthorize – XE API Documentation [Archive.is] Authentication and Authorization – RAD Studio XE –jeroen
Read More

Delphi FMX form from a library (dll) into a panel in the main application

I've tried to follow the example of: http://docwiki.embarcadero.com/CodeExamples/Rio/en/FMXEmbeddedForm_(Delphi) but the form elements just don't appear. I'm using Delphi 10.3 and compiling for Windows. If both the form and the panel are in the library project or in the program project, then it works well. It's needed to work both in Windows and MacOS.
Read More

Curious about our new technologies, new challenges & new products for 2020?

It’s fascinating how everything evolves so incredibly fast in the software world!

So our team is also trying really hard to keep up with the latest developments.
And to give our customers access to all our latest developments we have created our no-nonsense subscription TMS ALL-ACCESS!
Because we want our customers to be able to use all our products with no restrictions or limitations.

And when we say ALL we really mean ALL our products we offer now and also all new products we’ll release in the year of the subscription. Moreover, our all-access users are the first to receive the previews and betas of our non-released products!

Here is a small overview of the new products we added in 2019:

  • April 2019:
    TMS FNC Cloud Pack: Seamless access to cloud services from Windows, cross-platform and the web. Included in the TMS FNC Cloud Pack is the ability to create/implement your own REST service client(s).
  • June 2019:
    TMS WEB Core Padua: New additions on many levels:
    Object Pascal to JavaScript compiler improvements, new web frameworks & controls support, new UI components, improved IDE integration.

  • July 2019:
    TMS VCL UI PACK: TMS Component Pack became TMS VCL UI Pack!
    All components were revised for high DPI & VCL Styles support and internally the TMS Component Pack completely moved to a new build platform that was already in use for our cross-platform FMX & FNC products.

  • November 2019:
    Introduction of a new groundbreaking product: “TMS WEB Core for Visual Studio Code”

    At the TMS Training Days in Düsseldorf, Germany as well as at the Be-Delphi conference in Belgium, José León Serna (creator of Delphi for PHP & former Embarcadero IDE lead architect) presentated the preview of TMS WEB Core for Visual Studio Code. After more than a year of hard work & intensive collaboration with the TMS team, this technology preview, with an almost complete feature set for the first release, was presented to the audiences.

  • December 2019:
    TMS WEB Core Ferrara:
    20 new features were added to TMS WEB Core v1.3.

  • December 2019:
    TMS FNC Blox:
    With FNC we aim for reusable code and when bringing TMS FNC Blox to the WEB we wanted to maintain compatibility with FMX, LCL and VCL as much as possible. By rewriting the persistence part of TMS FNC Blox and integrating it into TMS FNC Core it is possible to load blox files that have been saved in a VCL, LCL or FMX application into a TMS WEB Core client application. The code for creating and registering custom blocks in VCL, LCL or FMX is also compatible with TMS WEB Core.
  • January 2020:
    Coming up in January 2020: TMS WEB Core for Visual Studio Code BETA will be available for TMS ALL-ACCESS users!

And we have a long list of new component and new product ideas for 2020!

One of our many commitments for 2020: make user experience more pleasant!

Use the TMS Subscription Manager with a single login to get instant access to all products in your TMS ALL-ACCESS subscription.

  • TMS Subscription Manager categorizes the products per technology : VCL, WEB, FMX, BIZ, FNC, DEV, .NET, IntraWeb and LCL.
  • Per product, you get a description, link to the product webpage, info on latest available version and release date, info on your last download version and download date and info on your last product install version and date.
  • You can mark specific TMS products as your favourite products.
  • It allows you to start multiple downloads.
  • Behind the scenes, TMS Subscription Manager keeps a backup of any product versions you have downloaded. Right-click on the downloaded version number cell per product and from the context menu you can see all available versions (if there are any) and activate another version for install.
  • The TMS Subscription Manager keeps you always informed about the validity of your subscription and will guide you to the renewal order upon expiry.
  • From the TMS Subscription Manager there is a comprehensive list of links to interact with us, via email, social media, forums, RSS, Youtube videos …

So cover 2020 now with your TMS ALL-ACCESS license and you don’t have to do anything else for the rest of the year!
BTW did you know that the renewal price after 1 year is just 495 EUR ?!

Find out more about our products included in TMS ALL-ACCESS.

Read More

Read More

Change the selection opacity of a ListBox

I have trouble changing the selection opacity of the FireMonkey ListBox. In my case I wanted to change the color of the selection, and make it fully opaque. At first I tried to do this by changing the style of de ListBox through a custom style based on the default. The selection part is a TStyleObject with an opacity of 1. I replaced it with a TRectangle filled with the color Red. After I applied my style I noticed that the selection was not the same bright red color that I chose for the selection. So I just dove into the FMX.ListBox code to see what is happening there. To my surprise I found that the opacity of the selection is set to 0.7 hard-coded in the TCustomListBox ApplyStyle procedure. I expected that the style was responsible for how things looked. I don't know if it's the wrong way to think about it, but this is not what I expected. After this I tried changing the selection opacity run-time by implementing the OnApplyStyleLookup event with the following code. procedure TForm1.ListBox1ApplyStyleLookup(Sender: TObject); var SelectionControl: TControl; begin if ListBox1.FindStyleResource<TControl>('selection', SelectionControl) then SelectionControl.Opacity := 1; end; This however has no effect. I tried to do the same thing in a new custom ListBox control by deriving from TCustomListBox and overriding the ApplyStyle method where after the ApplyStyle of TCustomListBox through the inherited keyword I placed the code to set the selection opacity to 1. This too did not have any effect. Am I just going about this the wrong way, am I missing something, or is it just Delphi being weird.
Read More