Wednesday, December 15, 2021

FMX Desktop - Restrict Form Size on Windows and macOS

I'm in the process of porting over an old VCL application to FMX. At this time I'm only concerned with creating a desktop application that will run on Windows and macOS. One of the VCL features I like is the ability to set the forms minimum width and height properties. This prevents the user from making the application ridiculously small and unusable.

With a VCL application this is accomplished by simply entering the desired values in the MinHeight and MinWidth properties of the forms Constraints. The example below sets the VCL forms minimum height to 540 and the minimum width to 720.

Unfortunately, these properties do not exist within FMX Muilti-Device applications. In order to impose size constraints in FMX you have to write some code in the OnResize event handler. 

The simplest way to accomplish this would be to right some code similar to this:

const
  MinW = 720;
  MinH = 540;
begin
  if Width  < MinW then Width  := MinW;
  If Height < MinH then Height := MinH;
end;

This works. However it produces a horrible flickering effect when you continue to drag the mouse inside the boundaries specified within the OnResize event handler.

Windows Form Constraints with Flickering


What about the macOS? Does it flicker? The answer is no. The macOS respects the size constraints with no flickering issue:

macOS Form Constraints no Flickering


So the issue only happen on Windows PC's. 

I may be oversensitive here but I do not like this flickering at all. In my mind it gives the sense of an unprofessional appearance. Some end users may not care one bit about this and that's fine. However, it really bugs me. I want to prevent this from happening.

So I went looking for a solution and found one on stackoverflow. The code simulates a mouseUp event if the cursor moves inside the boundaries.

Windows Form Constraints with No Flickering

This is accomplished by making a Windows API Mouse Event call inside the OnResize event handler. It's not perfect but it does prevent the flickering from happening.

Add this to the Uses clause
Winapi.Windows

Modify the onResize event handler to simulate the mouseUp event.

const
  MinW = 720;
  MinH = 540;
begin
  if Width < MinW then 
  begin
    Width := MinW;
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  end;
  If Height < MinH then 
  begin
    Height := MinH;
    mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
  end;
end;

This code works great! It stops Windows PC's from flickering. However, we are not done yet. We have to wrap special tags around the Windows Only code so it is ignored by the macOS.

Modify the Uses clause as follows:

uses
{$IFDEF MSWINDOWS}
  Winapi.Windows,
{$ENDIF}
  System.SysUtils, System.Types, System.UITypes, System.Classes, 
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, 
  FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls;

Modify the onResize event handler as follows

procedure TForm1.FormResize(Sender: TObject);
const
  MinW = 720;
  MinH = 540;
begin
  if Width < MinW then 
  begin
    Width := MinW;
    {$IFDEF MSWINDOWS}
      //prevent form flickering on resize below constraints
      mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    {$ENDIF}  
  end;
  If Height < MinH then 
  begin
    Height := MinH;
    {$IFDEF MSWINDOWS}
      //prevent form flickering on resize below constraints
      mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    {$ENDIF}  
  end;
end;

Stay tuned for more FMX Desktop discoveries. 

Related Articles:
What Every Delphi Developer Should Know About Writing for Windows and Mac

Enjoy
Semper Fi
Gunny Mike
https://zilchworks.com

end.

Friday, December 3, 2021

The Biggest Mistake I Made in 2021

 I know this year isn't over yet but I'm pretty sure I won't make a bigger mistake between now and January 1st. 

Mike has been selling a software product written in Turbo Pascal & Delphi for 30 years. Mike's software was mentioned on the television show Good Morning America. Mike got very excited. Mike updated his website making the 30-second Good Morning America television segment center stage. Nobody cares Mike's software got mentioned on television (except Mike). Mike turned off potential customers who visited his website. Mike's sales dropped. Mike's a jerk. Don't be like Mike.

This was one of the hardest lessons I learned. 

I was so sure my would-be customers would feel just as excited about my software getting praise on national television as me. So sure in fact, that I posted a video of my software getting mentioned front and center on my website. And not just on the home page... but on every page.

Wrong! 

People don't care about me. People care about themselves.

People don't care about you.
People care about themselves.

It was Saturday morning, August 21, 2021. I was sitting on the couch in my living room watching cartoons with my granddaughter. And my phone dinged. I received an notification of a sale. A few minutes later another ding, another sale. I checked the real-time website stats and to my surprise there were 53 visitors on my site all at the same time.

I started googling trying to figure out what was causing this frenzy of visitors to my website. And by luck I found a video segment that had just aired on the Good Morning America television show. 

The total segment was about 4 minutes long. The last 35-40 seconds is where my software ZilchWorks was mentioned. So I trimmed the video down to the last 40 seconds because that's the part that talked about my software. Proof again that people only care about themselves. Why else would I have trimmed down this video.

I then retooled my entire website and made this "Look what I can do" video front and center. I foolishly thought this would drawn in website visitors.

Lessons Learned:

  • People don't care about you. They care about themselves.
  • Customers want to know what you can do for them.
  • Enjoy the media success. Treat it as validation.
  • This too shall pass applies to both good and bad.

Enjoy!
Semper Fi,
Gunny Mike