On peut aussi écrire une procedure plus souple d'emploi.
Cette procedure repositionne également les Controls dans le cas où le nouveau Parent n'a pas les mêmes dimensions que le précédent.
type
TControlClass = class of TControl;
procedure ModifyParentAndAlign(OldParent, NewParent: TWinControl; TypeOfClass: TControlClass);
var
i: Integer;
FoundLeftPos, FoundTopPos: Integer;
begin
with OldParent do
for i := ControlCount - 1 downto 0 do // <- ControlCount diminue !
if Controls[i] is TypeOfClass then
with Controls[i] do
begin
FoundLeftPos := Left;
FoundTopPos := Top;
Parent := NewParent;
Left := Trunc(FoundLeftPos * (NewParent.Width / OldParent.Width));
Top := Trunc(FoundTopPos *(NewParent.Height / OldParent.Height));
end;
end;
On peu s'amuser comme un fou (enfin, je parle pour moi) en testant ainsi :
- 1 Panel déposé sur le Form, de dimension inférieure (exprès, pour le test...)
- quelques Labels dispersés de-ci de-là un peu n'importe où sur le Form (qui est donc leur Papa... heu leur 'Parent',
- 1 Button,
- 1 Button (ça en fait 2 au total).
Et on remplit les évènement OnClick avec le code :
procedure TForm1.Button1Click(Sender: TObject);
begin
ModifyParentAndAlign(Form1, Panel1, TLabel);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ModifyParentAndAlign(Panel1, Form1, TLabel);
end;
Voilà. On clique alternativement sur l'un, puis sur l'autre. Ca distrait un moment...
On peut bien sûr varier les plaisirs en introduisant d'autres Controls sur la Fiche et en filtrant différemment, ou passer plusieurs Controls de type différent dans une procedure modifiée utilisant un array of TControlClass...
Avec Delphi, tout devient possible...