Forum > LCL

Magnify/Fontsize changing, apply to all elements and realign

(1/1)

TCH:
Is there a simple way to magnify elements (size, fontsize) on the form without screwing up the alignments, distances, etc.?

I came up with this, but it does not work properly, only "roughly".
--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---procedure AddToComponentsGeometry(Form: TForm; WinControl: TWinControl);var        c, j, cd: integer;        EWinControl: TWinControl;begin        c := Length(ComponentsGeometry);        SetLength(ComponentsGeometry, c + 1);        ComponentsGeometry[c].WinControl := WinControl;        ComponentsGeometry[c].TopWinControl := nil;        ComponentsGeometry[c].LeftWinControl := nil;        ComponentsGeometry[c].TopDistance := $7fffffff;        ComponentsGeometry[c].LeftDistance := $7fffffff;        ComponentsGeometry[c].Top := WinControl.Top;        ComponentsGeometry[c].Left := WinControl.Left;        ComponentsGeometry[c].Width := WinControl.Width;        ComponentsGeometry[c].Height := WinControl.Height;        for j := 0 to Form.ComponentCount - 1 do        begin                if (Form.Components[j] is TWinControl) then                begin                        EWinControl := Form.Components[j] as TWinControl;                        cd := WinControl.Top - (EWinControl.Top + EWinControl.Height);                        if ((cd >= 0) and (cd < ComponentsGeometry[c].TopDistance)) then                        begin                                ComponentsGeometry[c].TopWinControl := EWinControl;                                ComponentsGeometry[c].TopDistance := cd;                        end;                        cd := WinControl.Left - (EWinControl.Left + EWinControl.Width);                        if ((cd >= 0) and (cd < ComponentsGeometry[c].LeftDistance)) then                        begin                                ComponentsGeometry[c].LeftWinControl := EWinControl;                                ComponentsGeometry[c].LeftDistance := cd;                        end;                end;        end;end; procedure StoreComponentsGeometry;var i, j: integer;begin        SetLength(ComponentsGeometry, 0);        for i := 0 to Screen.FormCount - 1 do        begin                for j := 0 to Screen.Forms[i].ComponentCount - 1 do                begin                        if (Screen.Forms[i].Components[j] is TWinControl) then                        begin                                AddToComponentsGeometry(Screen.Forms[i], Screen.Forms[i].Components[j] as TWinControl);                        end;                end;        end;end; procedure AlignItems;var        i, j, c, d, Right, Bottom: integer;        WinControl: TWinControl;begin        for i := 0 to Screen.FormCount - 1 do        begin                d := Screen.Forms[i].Font.Size - 10;                for j := 0 to Screen.Forms[i].ComponentCount - 1 do                begin                        if (Screen.Forms[i].Components[j] is TWinControl) then                        begin                                WinControl := Screen.Forms[i].Components[j] as TWinControl;                                c := 0; // silences warning                                for c := 0 to length(ComponentsGeometry) - 1 do                                begin                                        if (WinControl = ComponentsGeometry[c].WinControl) then                                        begin                                                break;                                        end;                                end;                                if (c < length(ComponentsGeometry)) then                                begin                                        if (not WinControl.AutoSize) then                                        begin                                                WinControl.Width := ComponentsGeometry[c].Width + d;                                                WinControl.Height := ComponentsGeometry[c].Height + d;                                        end;                                        if (ComponentsGeometry[c].TopWinControl <> nil) then                                        begin                                                WinControl.Top := ComponentsGeometry[c].TopWinControl.Top + ComponentsGeometry[c].TopWinControl.Height + ComponentsGeometry[c].TopDistance;                                        end;                                        if (ComponentsGeometry[c].LeftWinControl <> nil) then                                        begin                                                WinControl.Left := ComponentsGeometry[c].LeftWinControl.Left + ComponentsGeometry[c].LeftWinControl.Width + ComponentsGeometry[c].LeftDistance;                                        end;                                end;                        end;                end;        end;        for i := 0 to Screen.FormCount - 1 do        begin                Right := 0;                Bottom := 0;                for j := 0 to Screen.Forms[i].ComponentCount - 1 do                begin                        if (Screen.Forms[i].Components[j] is TWinControl) then                        begin                                WinControl := Screen.Forms[i].Components[j] as TWinControl;                                c :=WinControl.Top + WinControl.Height;                                if (c > Bottom) then                                begin                                        Bottom := c;                                end;                                c :=WinControl.Left + WinControl.Width;                                if (c > Right) then                                begin                                        Right := c;                                end;                        end;                end;                Screen.Forms[i].Width := Right;                Screen.Forms[i].Height := Bottom;        end;end; procedure ApplyFontSize;var i: integer;begin        if (FontSize < 1) then        begin                FontSize := 1;        end        else        begin                if (FontSize > 24) then                begin                        FontSize := 24;                end;        end;        for i := 0 to Screen.FormCount - 1 do        begin                Screen.Forms[i].Font.Size := FontSize;        end;        AlignItems;end; procedure StepFontSize(step: LongInt);begin        FontSize := LongWord(LongInt(FontSize) + step);        ApplyFontSize;end;Also i tried to use magnifying instead of font size (as in having a multiplier value for original sizes), but it gave even weaker results...

howardpc:

--- Quote from: TCH on April 19, 2022, 02:02:18 pm ---Is there a simple way to magnify elements (size, fontsize) on the form without screwing up the alignments, distances, etc.?

--- End quote ---
Layout that survives fundamental changes to sizes of form elements is never simple, especially if it needs to be cross-platform and multilingual.
The LCL's autosize/preferred-size mechanisms combined with LCL anchoring (and maybe childsizing) is about the best "simple" compromise I've seen in the Object Pascal world.
It is not perfect, but you'll probably find it works better than any roll-your-own solutions (depending on how complex and adaptable your particular layout needs to be).

Navigation

[0] Message Index

Go to full version