Difference between revisions of "Application disable resize over Dock"

From Lazarus wiki
Jump to navigationJump to search
m (Fixed syntax highlighting; rationalised macOS categories)
m (Really fix syntax highlighting :-)
Line 27: Line 27:
 
2) Write code in handler to change MaxHeight, value must be workarea height minus current form's Top.
 
2) Write code in handler to change MaxHeight, value must be workarea height minus current form's Top.
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
procedure TfmMain.FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight,
 
procedure TfmMain.FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight,
 
   MaxWidth, MaxHeight: TConstraintSize);
 
   MaxWidth, MaxHeight: TConstraintSize);

Revision as of 09:25, 15 December 2019

On macOS it's often needed to disable app window's resize below OS Dock. But Lazarus forms always resize below it. How to disable this resize?

1) Create TForm.OnConstrainedResize handler for your form. Note, it was not "published" in LCL until LCL 1.7. Create it by hands:

  TfmMain = class(TForm)
    ... 
  private
    ...
    procedure FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight,
      MaxWidth, MaxHeight: TConstraintSize);
    ...
  end;

procedure TfmMain.FormCreate(Sender: TObject);
begin
  ..
  Self.OnConstrainedResize:= @FormConstrainedResize; 
  ..
end;

2) Write code in handler to change MaxHeight, value must be workarea height minus current form's Top.

procedure TfmMain.FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight,
  MaxWidth, MaxHeight: TConstraintSize);
const
  cMinHeight = 200;
var
  RWork: TRect;
begin
  {$ifndef darwin} exit; {$endif}
  RWork:= Screen.PrimaryMonitor.WorkareaRect;
  MaxHeight:= Max(cMinHeight, RWork.Bottom - RWork.Top - Top);
end;

3) Note: handler has side effect. On dragging window by its caption, handler is called too, so window will be resized on moving it too low, near the Dock.