Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to make a form float in a workarea as it is the screen (move, size, maximize, minimize)?
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload