{
Hier eine einfache Möglichkeit, um alle Elemente einer Form gleichzeitig zu skalieren
Vielleicht wäre es noch besser, eine Klasse anstelle von object zu nehmen?
}

Type
Tform1 = class(TForm); // ich lasse die übrigen Deklarationen weg
end;

const startwidth:integer=0; startheight:integer=0;
                 // werden zu Beginn mit Breite und Höhe der Form geladen
      fontsize:integer=0;

      ChangeBoundsBusy:boolean = false; // für OnChangeBounds
      skal: real = 1.0;  // Skalierfaktor, nehme das arithmetische Mittel
                       // der Änderung von Breite und Höhe

// RefBoxen: enthalten die ursprgl. Dimensionen zur Skalierung
Type
  TRefBox = object
     t:tcontrol; fix:boolean; // wenn TopLeft = fix
     oben,links,breit,hoch:integer;
    Procedure Skalieren(x:real);
  end;

  TRefBoxen = object
    anz:integer;
    TB: array of TRefBox;
    procedure Load(lg:integer);    procedure Free;
    procedure Add(tc:TControl; fixed:boolean);
    procedure Skalieren(x:real);
   end;

 procedure TRefBox.Skalieren(x:real);
   begin
      if  not fix then
       begin
          t.Top := round(x*oben);
          t.left:= round(x*links);
       end;
        t.width:=round(x*breit);
        t.height:=round(x*hoch);
   end;

 procedure TRefBoxen.Load(lg:integer);
    begin anz:=lg; setlength(TB,lg); end;
 procedure TRefBoxen.Free; begin load(0); end;
 procedure TRefBoxen.Add(tc:TControl; fixed:boolean);
    begin inc(anz); Load(anz);
      with TB[anz-1] do
           begin t:=tc; fix:=fixed;
             links:=t.left; oben:=t.top;
             breit:=t.width; hoch:=t.height;
           end;
    end;
 procedure TRefBoxen.Skalieren(x:real);
           var i:integer;
     begin for i:=0 to anz-1 do
          TB[i].Skalieren(x);
     end;

var RefBoxen: TRefBoxen;

procedure TForm1.RefBoxen_Init;
  begin
     with Refboxen do
      begin
         Load(0);
         Add(FontButton,false);
         Add(ZeigeButton,false);
         Add(Image1,false);
         Add(Status,false);  // Statusbar, mit Prozedur StatusZeigen
         Add....

        Add(popup,true);  // LinksOben = fix
      end;
  end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  RefBoxen.Free;
  inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  inherited;
   RefBoxen_Init;
   ChangeBoundsBusy:=false;
   DoOnChangeBounds;
end;

procedure TForm1.FormChangeBounds(Sender: TObject);
  var s:string;
begin
  if ChangeBoundsbusy then exit; ChangeBoundsbusy:=true;
  skal   := (Width / startwidth + Height / startheight) / 2;  // SkalierFaktor
  width:= round(skal*startwidth);   height:=round(skal*startheight);

  if skal<>1.0 then RefBoxen.Skalieren(skal);

  //.......weiterer Programm-Code......

  // wenn auch Fontgröße von Canvas.Font mit skaliert werden soll:
  font.Size := round(skal * fontsize);
  image1.canvas.Font:=font;

 // Angabe der FontGröße
  s := FloatToStr(skal);
  s := copy(s, 1, 4);
  StatusZeigen('skal = ' + s + '  font: ' + IntToStr(font.size));
  ChangeBoundsBusy:=false;
end;

