Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7090445
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 28, 20262026-05-28T08:03:19+00:00 2026-05-28T08:03:19+00:00

I try code published by Freddie Bell at What is the best way to

  • 0

I try code published by Freddie Bell at What is the best way to make a Delphi Application completely full screen? question, as is what i needed.

I also set minimun size to be the original size.

  with msg.MinMaxInfo^.ptMinTrackSize do
    begin
       // maximum size when maximised
      x := original_width;
      y := original_height;
    end;

And in Form OnShow event:

  original_width  := Width;
  original_height := Height;

But i have this issue:
– Mainform has two panels, one of it is aligned as alRight, the other as alLeft; so the working_area is the space between the panels. Mainform has no borders and it is fully maximizad to the work area with

SystemParametersInfo(SPI_GETWORKAREA, 0, @working_desktop, 0);
  • When i move the form, it keeps inside the working_area between the panels.
  • When i size the form, it keeps inside that working_area.
  • But, when i size the form in either way (left or right) passing the edge of the working_area, the form increased its size to the other side. i.e., if the form is on left edge, and you select it to resize it and you move to the left (towards the edge), the form increase its width to the right (but it stop at right edge!).

I try with some code (catching WMSIZE or WMSIZING), but i can prevent that behavior?
Thanks you all in advance!

EDIT (David Heffernan): The key code appears to be in this unit.

unit uFormularios;

interface

uses Windows, Messages, Forms, DBGrids, StdCtrls, Menus, Graphics, ComCtrls;

type
  TForm_en_ventana = class(TForm)
  private
    ancho_original, alto_original: integer;
    procedure WMShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW;
    procedure WMWindowPosChanging(Var Msg: TWMWindowPosChanging); Message WM_WINDOWPOSCHANGING;
    procedure WMGetMinMaxInfo(Var msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  end;

  TForm_en_ventana_centrado = class(TForm_en_ventana)
  private
    ancho_original, alto_original: integer;
    procedure WMShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW;
  end;

procedure MaximizarFormulario(var F; MaximaAltura: integer = 0; MaximoAncho: integer = 0; Centrado: boolean = TRUE);
procedure InicializarVentanaTrabajo(const izq, der, arr, aba: integer);

var ESPACIO_DE_TRABAJO,
    VENTANA_DE_TRABAJO      : TRect;

implementation


procedure MaximizarFormulario(var F; MaximaAltura: integer = 0; MaximoAncho: integer = 0; Centrado: boolean = TRUE);
begin
  LockWindowUpdate(TForm(F).Handle);
  TForm(F).Left   := ESPACIO_DE_TRABAJO.Left;
  if MaximoAncho = 0 then
    TForm(F).Width  := ESPACIO_DE_TRABAJO.Right
  else
    begin
      if ESPACIO_DE_TRABAJO.Right < MaximoAncho then
        TForm(F).Width := ESPACIO_DE_TRABAJO.Right
      else
        TForm(F).Width := MaximoAncho;
    end;
  TForm(F).Top    := ESPACIO_DE_TRABAJO.Top;
  if MaximaAltura = 0 then
    TForm(F).Height := ESPACIO_DE_TRABAJO.Bottom
  else
    begin
      if ESPACIO_DE_TRABAJO.Bottom < MaximaAltura then
        TForm(F).Height := ESPACIO_DE_TRABAJO.Bottom
      else
        TForm(F).Height := MaximaAltura;
    end;
  if ((MaximoAncho <> 0) or (MaximaAltura <> 0)) and (Centrado) then
    begin
      TForm(F).Left := (ESPACIO_DE_TRABAJO.Right  - TForm(F).Width ) div 2;
      TForm(F).Top  := (ESPACIO_DE_TRABAJO.Bottom - TForm(F).Height) div 2;
    end;
  LockWindowUpdate(0);
end;

procedure InicializarVentanaTrabajo(const izq, der, arr, aba: integer);
begin
  VENTANA_DE_TRABAJO.Left   := izq;
  VENTANA_DE_TRABAJO.Right  := der;
  VENTANA_DE_TRABAJO.Top    := arr;
  VENTANA_DE_TRABAJO.Bottom := aba;
end;

procedure TForm_en_ventana.WMWindowPosChanging(var Msg: TWMWINDOWPOSCHANGING);
begin
  with Msg.WindowPos^ do
  {
   x: int;  The position of the left edge of the window.
   y: int;  The position of the top edge of the window.
   cx: int; The window width, in pixels.
   cy: int; The window height, in pixels.
  }
  begin
    if x <= VENTANA_DE_TRABAJO.Left then
      x := VENTANA_DE_TRABAJO.Left;
    if x + cx >= VENTANA_DE_TRABAJO.Right then
      x := (VENTANA_DE_TRABAJO.Right) - cx;
    if y <= VENTANA_DE_TRABAJO.Top then
      y := VENTANA_DE_TRABAJO.Top;
    if y + cy >= VENTANA_DE_TRABAJO.Bottom then
      y := (VENTANA_DE_TRABAJO.Bottom) - cy;
  end;
end;

Procedure TForm_en_ventana.WMGetMinMaxInfo(Var msg: TWMGetMinMaxInfo);
begin
  inherited;
  with msg.MinMaxInfo^.ptMaxPosition do
    begin
      // position of top when maximised
      x := VENTANA_DE_TRABAJO.Left;
      y := VENTANA_DE_TRABAJO.Top;
    end;
  with msg.MinMaxInfo^.ptMaxSize do
    begin
       // width and height when maximized
      x := VENTANA_DE_TRABAJO.Right - VENTANA_DE_TRABAJO.Left;
      y := VENTANA_DE_TRABAJO.Bottom - VENTANA_DE_TRABAJO.Top;
    end;
  with msg.MinMaxInfo^.ptMaxTrackSize do
    begin
       // maximum size when maximised
      x := VENTANA_DE_TRABAJO.Right - VENTANA_DE_TRABAJO.Left;
      y := VENTANA_DE_TRABAJO.Bottom - VENTANA_DE_TRABAJO.Top;
    end;
  with msg.MinMaxInfo^.ptMinTrackSize do
    begin
       // maximum size when maximised
      x := ancho_original;
      y := alto_original;
    end;
end;

procedure TForm_en_ventana.WMSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType and $FFF0 = SC_MINIMIZE then
    Application.Minimize
  else
    inherited;
end;

procedure TForm_en_ventana.WMShowWindow(var Message: TWMShowWindow);
begin
  ancho_original := Width;
  alto_original  := Height;
end;

procedure TForm_en_ventana_centrado.WMShowWindow(var Message: TWMShowWindow);
begin
  ancho_original := Width;
  alto_original  := Height;
  Left := (((VENTANA_DE_TRABAJO.Right - VENTANA_DE_TRABAJO.Left) - Width) div 2) + VENTANA_DE_TRABAJO.Left;
  Top  := (((VENTANA_DE_TRABAJO.Bottom - VENTANA_DE_TRABAJO.Top) - Height) div 2) + VENTANA_DE_TRABAJO.Top;
end;

initialization
  SystemParametersInfo(SPI_GETWORKAREA, 0, @ESPACIO_DE_TRABAJO, 0);
  VENTANA_DE_TRABAJO := ESPACIO_DE_TRABAJO;

end.
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-28T08:03:20+00:00Added an answer on May 28, 2026 at 8:03 am

    Your handler for WM_WINDOWPOSCHANGING is fine for moving operations but needs to be different for sizing operations. You can’t detect those from within that message handler so you need an alternative. Instead use WM_SIZING and WM_MOVING like this:

    procedure WMSizing(Var msg: TMessage); message WM_SIZING;
    procedure WMMoving(Var msg: TMessage); message WM_MOVING;
    
    ....
    
    procedure TForm_en_ventana.WMSizing(var msg: TMessage);
    var
      R: PRect;
    begin
      R := PRect(msg.LParam);
      R.Left := Max(R.Left, VENTANA_DE_TRABAJO.Left);
      R.Right := Min(R.Right, VENTANA_DE_TRABAJO.Right);
      R.Top := Max(R.Top, VENTANA_DE_TRABAJO.Top);
      R.Bottom := Min(R.Bottom, VENTANA_DE_TRABAJO.Bottom);
    end;
    
    procedure TForm_en_ventana.WMMoving(var msg: TMessage);
    var
      R: PRect;
      dx, dy: Integer;
    begin
      R := PRect(msg.LParam);
      dx := 0;
      dy := 0;
      if R.Left<VENTANA_DE_TRABAJO.Left then
        dx := VENTANA_DE_TRABAJO.Left-R.Left;
      if R.Right>VENTANA_DE_TRABAJO.Right then
        dx := VENTANA_DE_TRABAJO.Right-R.Right;
      if R.Top<VENTANA_DE_TRABAJO.Top then
        dy := VENTANA_DE_TRABAJO.Top-R.Top;
      if R.Bottom>VENTANA_DE_TRABAJO.Bottom then
        dy := VENTANA_DE_TRABAJO.Bottom-R.Bottom;
      OffsetRect(R^, dx, dy);
    end;
    

    You will need to remove the WM_WINDOWPOSCHANGING altogether.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

In Delphi, is normal do this: ob = TObject.create; try //code finally ob.free; end;
Q: I have a web application which published on a server .When i try
try { // Code } catch (Exception ex) { Logger.Log(Message, ex); throw; } In
public void EatDinner(string appetizer, string mainCourse, string dessert) { try { // Code }
When I try this code: a, b, c = (1, 2, 3) def test():
When I try this code: class MyStuff: def average(a, b, c): # Get the
We have following code: try { // some code throwing MyException } catch (MyException
I have this code try { //AN EXCEPTION IS GENERATED HERE!!! } catch {
When I try this code: dict_a = dict_b = dict_c = {} dict_c['hello'] =
When I try this code: if Verbose: print("Building internam Index for %d tile(s) ..."

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.