title: How to make a form float in a workarea as it is the screen (move, size, maximize, minimize)?
body: <p>I try code published by Freddie Bell at <a href="https://stackoverflow.com/q/14451/1096473">What is the best way to make a Delphi Application completely full screen?</a> question, as is what i needed.</p>
  
  <p>I also set minimun size to be the original size.</p>
  
  <pre><code>  with msg.MinMaxInfo^.ptMinTrackSize do
      begin
         // maximum size when maximised
        x := original_width;
        y := original_height;
      end;
  </code></pre>
  
  <p>And in Form OnShow event:</p>
  
  <pre><code>  original_width  := Width;
    original_height := Height;
  </code></pre>
  
  <p>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</p>
  
  <pre><code>SystemParametersInfo(SPI_GETWORKAREA, 0, @working_desktop, 0);
  </code></pre>
  
  <ul>
  <li>When i move the form, it keeps inside the working_area between the panels.</li>
  <li>When i size the form, it keeps inside that working_area.</li>
  <li>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!).</li>
  </ul>
  
  <p>I try with some code (catching WMSIZE or WMSIZING), but i can prevent that behavior?
  Thanks you all in advance!</p>
  
  <p><strong>EDIT (David Heffernan)</strong>: The key code appears to be in this unit.</p>
  
  <pre><code>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 &lt; 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 &lt; MaximaAltura then
          TForm(F).Height := ESPACIO_DE_TRABAJO.Bottom
        else
          TForm(F).Height := MaximaAltura;
      end;
    if ((MaximoAncho &lt;&gt; 0) or (MaximaAltura &lt;&gt; 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 &lt;= VENTANA_DE_TRABAJO.Left then
        x := VENTANA_DE_TRABAJO.Left;
      if x + cx &gt;= VENTANA_DE_TRABAJO.Right then
        x := (VENTANA_DE_TRABAJO.Right) - cx;
      if y &lt;= VENTANA_DE_TRABAJO.Top then
        y := VENTANA_DE_TRABAJO.Top;
      if y + cy &gt;= 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.
  </code></pre>