Wiki copymirror

This is a mirror of the wiki at pascal.chat. Editing, history and sign-in are there.

Example: Anchors. How to reliably align dynamically created controls under changing visibility

Note: This example works since Lazarus 0.9.25 rev.12800 (read)

For testing, you can copy text to files:

Code

pascal
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Buttons, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    CheckGroup1: TCheckGroup;
    Panel1: TPanel;
    procedure CheckGroup1ItemClick(Sender: TObject; Index: integer);
    procedure FormCreate(Sender: TObject);
  private
    FButtons: array of TButton;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  if CheckGroup1.Items.Count = 0 then
    Exit;
  SetLength(FButtons, CheckGroup1.Items.Count);

  for i:=Low(FButtons) to High(FButtons) do
  begin
    FButtons[i] := TButton.Create(Self);
    with FButtons[i] do
    begin
      Parent := Panel1;
      Caption := IntToStr(i+1);
      CheckGroup1.Checked[i] := True;
      Anchors := [akTop, akLeft, akRight];

      AnchorSide[akLeft].Control := Parent;
      AnchorSide[akLeft].Side := asrLeft;

      AnchorSide[akRight].Control := Parent;
      AnchorSide[akRight].Side := asrRight;

      if i=0 then
      begin
        AnchorSide[akTop].Control := Parent;
        AnchorSide[akTop].Side := asrTop;
      end
      else
      begin
        AnchorSide[akTop].Control := FButtons[i-1];
        AnchorSide[akTop].Side := asrBottom;
      end;
    end;
  end;
end;

procedure TForm1.CheckGroup1ItemClick(Sender: TObject; Index: integer);
begin
  FButtons[Index].Visible := (Sender as TCheckGroup).Checked[Index];
end;

end.

Form

lfm
object Form1: TForm1
  Left = 527
  Height = 187
  Top = 346
  Width = 270
  Caption = 'Form1'
  ClientHeight = 187
  ClientWidth = 270
  OnCreate = FormCreate
  Position = poDesktopCenter
  LCLVersion = '1.6.0.2'
  object CheckGroup1: TCheckGroup
    Left = 16
    Height = 105
    Top = 8
    Width = 65
    AutoFill = True
    Caption = 'Visible'
    ChildSizing.LeftRightSpacing = 6
    ChildSizing.TopBottomSpacing = 6
    ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
    ChildSizing.EnlargeVertical = crsHomogenousChildResize
    ChildSizing.ShrinkHorizontal = crsScaleChilds
    ChildSizing.ShrinkVertical = crsScaleChilds
    ChildSizing.Layout = cclLeftToRightThenTopToBottom
    ChildSizing.ControlsPerLine = 1
    ClientHeight = 87
    ClientWidth = 61
    Items.Strings = (
      '1'
      '2'
      '3'
      '4'
      '5'
    )
    OnItemClick = CheckGroup1ItemClick
    TabOrder = 0
    Data = {
      050000000202020202
    }
  end
  object Panel1: TPanel
    Left = 120
    Height = 171
    Top = 8
    Width = 138
    Anchors = [akTop, akLeft, akRight, akBottom]
    TabOrder = 1
  end
end

See also


From the Free Pascal wiki, page "Example: Anchors. How to reliably align dynamically created controls under changing visibility", as it stood on 2020-02-14 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 2, last changed by WikiArchive .