Recent

Author Topic: different monitor resolution  (Read 676 times)

k1attila1

  • Jr. Member
  • **
  • Posts: 85
different monitor resolution
« on: September 06, 2019, 05:43:48 pm »
Hello

I have a program, but we'd like to use in different computers.
And the monitor resolution is different.
Could somebody give me an advice how to change the size of  forms and letters and every visual componentto get similar view.

Maybe i have to change the DPI somehow ?

Thank you Attila

lucamar

  • Hero Member
  • *****
  • Posts: 1991
Re: different monitor resolution
« Reply #1 on: September 06, 2019, 07:23:26 pm »
Most of the LCL is already ready for differences in DPI, so you have to do little more than make sure that auto-scaling and related properties are set. See this wiki page: High DPI

You'll probably find some quirks and gotchas, depending on how your application's UI is written; just come back and search/ask for help on specific ones when you encounter them.
« Last Edit: September 06, 2019, 07:24:57 pm by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus 2.0.2/2.0.4  - FPC 3.0.4 on:
(K|L)Ubuntu 12..16, Windows XP SP3, various DOSes.

wp

  • Hero Member
  • *****
  • Posts: 6156
Re: different monitor resolution
« Reply #2 on: September 06, 2019, 08:00:12 pm »
I have a program, but we'd like to use in different computers.
And the monitor resolution is different.
Do you have Windows? Per-monitor dpi-scaling works for Win8.1 or Win10. In the project options select the corresponding option at "Dpi awarness". Make sure that "LCL scaling" is checked - this should be default for Laz 2.0+, for Laz 1.8.x you must check it manually (older versions do not support High-DPI).
Lazarus trunk / fpc 3.0.4 / all 32-bit on Win-10

k1attila1

  • Jr. Member
  • **
  • Posts: 85
Re: different monitor resolution
« Reply #3 on: September 08, 2019, 08:02:10 am »
Thank both of you.
But i need to modify the size of controls and fonts to fit with every resolution.
Do you have any "easy" solution for this ?
« Last Edit: September 08, 2019, 08:09:42 am by k1attila1 »

wp

  • Hero Member
  • *****
  • Posts: 6156
Re: different monitor resolution
« Reply #4 on: September 08, 2019, 11:25:47 am »
Why? Doesn't LCLScaling do this for you automatically? Did you ever try?
Lazarus trunk / fpc 3.0.4 / all 32-bit on Win-10

winni

  • Full Member
  • ***
  • Posts: 192
Re: different monitor resolution
« Reply #5 on: September 08, 2019, 07:47:50 pm »
Hi!

Resize your complete Form1 with all the children:

Code: Pascal  [Select]
  1. implementation
  2. var OldWi, OldHi : Integer;
  3.  
  4. procedure TForm1.FormCreate(Sender: TObject);
  5. begin
  6. oldWi := Form1.Width;
  7. OldHi := Form1.Height;
  8. end;
  9.  
  10.  
  11. procedure TForm1.FormResize(Sender: TObject);
  12. var fx, fy : single;
  13.     i : integer;
  14. begin
  15. Fx := Form1.width /oldwi;
  16. Fy := Form1.Height / oldhi;
  17. oldwi := Form1.width;
  18. oldhi := Form1.Height;
  19. DisableAlign;
  20.  
  21.  for i := 0 to ComponentCount - 1 do
  22.   begin
  23.   if Components[i] is TWinControl then
  24.         begin
  25.         TwinControl(Components[i]).SetBounds(round (TwinControl(Components[i]).left*Fx),
  26.                                              round (TwinControl(Components[i]).Top*Fy),
  27.                                              round (TwinControl(Components[i]).Width*Fx),
  28.                                              round (TwinControl(Components[i]).Height*Fy)  );
  29.         TwinControl(Components[i]).Font.Height:=
  30.                                           round(TwinControl(Components[i]).Font.Height*Fy);
  31.         end;
  32.         if Components[i] is TGraphicControl then
  33.     begin
  34.  TGraphicControl(Components[i]).SetBounds(round(TGraphicControl(Components[i]).left*Fx),
  35.                                                       round(TGraphicControl(Components[i]).Top*Fy),
  36.                                                       round(TGraphicControl(Components[i]).Width*Fx),
  37.                                                       round(TGraphicControl(Components[i]).Height*Fy)  );
  38.     TGraphicControl(Components[i]).Font.Height :=        
  39.                                                            round(TGraphicControl(Components[i]).Font.Height*Fy);
  40.            end;
  41.         end; // i
  42.  OldWi := Form1.Width;
  43.  OldHi := Form1.Height;
  44.  EnableAlign;
  45. end;
  46.  
  47.  

Now you can resize or maximize your Form as you like.

Winni

trev

  • Full Member
  • ***
  • Posts: 185
Re: different monitor resolution
« Reply #6 on: September 09, 2019, 04:09:39 am »
Why? Doesn't LCLScaling do this for you automatically? Did you ever try?

Works for me across Windows, macOS, Linux and FreeBSD except the form height needs increasing in form.onshow() by ~5% for macOS and by ~10% for FreeBSD possibly due to window manager decoration. Not a big deal in the overall scheme of things.
o Lazarus v2.1.0 r61775, FPC v3.3.1 r42640, macOS 10.14.6 (with sup update), Xcode 10.3
o Lazarus v2.1.0 r61574, FPC v3.3.1 r42318, FreeBSD 12.0 (Parallels VM)
o Lazarus v2.1.0 r61574, FPC v3.0.4, Ubuntu 18.04 (Parallels VM)

wp

  • Hero Member
  • *****
  • Posts: 6156
Re: different monitor resolution
« Reply #7 on: September 09, 2019, 10:12:44 am »
Resize your complete Form1 with all the children:
[...]
Now you can resize or maximize your Form as you like.
The question was about rescaling when the program runs on a monitor with different resolution, not about rescaling when the form size changes (which is an awful behavior for a standard desktop application, BTW).
Lazarus trunk / fpc 3.0.4 / all 32-bit on Win-10

k1attila1

  • Jr. Member
  • **
  • Posts: 85
Re: different monitor resolution
« Reply #8 on: September 09, 2019, 12:25:53 pm »
"Why? Doesn't LCLScaling do this for you automatically? Did you ever try?"

I have tried my program in my laptop, DPI= 96.

I have an another laptop with higher resolution.

So everything is very small in this second laptop.

So, i need to resize all forms and all components with fonts and etc.

Only LCLScaling doesn't work form me.

What's wrong with me ?

Thanks for you.





wp

  • Hero Member
  • *****
  • Posts: 6156
Re: different monitor resolution
« Reply #9 on: September 09, 2019, 02:24:09 pm »
What's wrong with me ?
How should I know?

To convince you that LCL scaling is working I am attaching a simple program with some controls, among them a toolbar and a pagecontrol with images. I designed the form in the normal way - by clicking controls onto the form and moving them to their position (normally, however, I'd use the anchor editor supported with AutoSizing because it yields in a more stable layout when the font changes in another widgetset, or when the application is translated). In the ImageList I set Scaled=true, defined "new resolutions" 20, 24 and 32 and added some images of the Lazarus folder at sizes 16x16, 24x24 and 32x32 (the 20x20 images will be scaled down from the next larger size if needed). In the project options I made sure that "LCLScaling" is checked, and for "DPI awareness" I selected "Vista 8: on, 8.1/10+: per monitor/V2 (True/PM_v2)" (normally I keep the default "on" - but the new settings allows per-monitor scaling on Windows).

Screenshot "lcl_scaling_win10_96ppi" is from my standard Win10 development machine running at 96 ppi.
Screenshot "lcl_scaling_win7_144ppi" is from a VM with Win7 set up to 144 ppi (150%). Except for the different frame style it is a 150%-magnification of the 96ppi screenshot. Note that also the images in the toolbar and pagecontrol tabs are scaled.

So, scaling of forms to different monitor resolutions is really nothing to care about any more.
Lazarus trunk / fpc 3.0.4 / all 32-bit on Win-10

ps

  • Jr. Member
  • **
  • Posts: 79
Re: different monitor resolution
« Reply #10 on: September 09, 2019, 04:16:01 pm »
There is few limitations (bugs) where DPI scalling don't work on Windows.
IDE:  Lazarus 1.8 RC3/Trunk, Delphi XE OS:Windows 10, Ubuntu

wp

  • Hero Member
  • *****
  • Posts: 6156
Re: different monitor resolution
« Reply #11 on: September 09, 2019, 04:58:20 pm »
In Lazarus 2.0.2 (maybe 2.0.4), options for HighDPI is not saved in project. https://bugs.freepascal.org/view.php?id=35794
Cannot confirm. The LCLScaling option is not stored in the lpi file, but in the lpr (Application.Scaled := true) The manifest option V2 also is stored in 2.0.4 (the others also in 2.0.2).

Runtime creating controls is "not supported" https://bugs.freepascal.org/view.php?id=34931
It is supported, too, but you must do a few steps yourself (https://wiki.lazarus.freepascal.org/High_DPI#High_DPI_in_Lazarus_1.8_and_above): "prepare your container (e.g. panel with controls) as it was with 96 PPI and then call TControl.AutoAdjustLayout(lapAutoAdjustForDPI, 96, ParentFormOfTheContainer.PixelsPerInch, 0, 0)" Since scaling depends on the parent form, set the Parent immediately after creation.
Lazarus trunk / fpc 3.0.4 / all 32-bit on Win-10

HenrikErlandsson

  • New Member
  • *
  • Posts: 19
  • ^ Happy coder :)
Re: different monitor resolution
« Reply #12 on: September 11, 2019, 11:01:34 am »
Could somebody give me an advice how to change the size of  forms and letters and every visual componentto get similar view.

I have an another laptop with higher resolution.

So everything is very small in this second laptop.
But is the window and its controls resized to fill the screen on the second laptop? Then all is correct, and you can do no more (except redesign the forms into several forms with less text and buttons, as is done on other small screen devices like mobile phones and surf pads).
Turbo Pascal was the tool of my trade as a young professional.