Alors finalement, j'ai pu résoudre mon problème avec une autre solution, quoique évoquée en partie :
Voilà la disposition des TLayout (j'ai mis des TLabel dans les Tlayout pour mieux visualiser) :

On voit bien la structure sur le côté.
La propriété Align de chaque Layout est la suivante :
Layout1 (conteneur "racine") : ClientLayout2 (contenu dans Layout1) : Top
Layout3 (contenu dans Layout1) : Client
Layout4 (contenu dans Layout3) : Top
Layout5 (contenu dans Layout3) : Client
Donc l'objectif est que le Layout2 et le Layout3 soit l'un au-dessous de l'autre en mode portrait et que en mode paysage, ils soient côte à côte.
Pour cela j'ai mis un petit bout de code dans un onResized (pas onResize) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
procedure TForm3.Layout1Resized(Sender: TObject);
begin
// si la hauteur du conteneur racine est supérieure à la largeur
if Layout1.height>Layout1.Width then
begin
// mode portrait
Layout2.align:=TAlignLayout.Top;
Layout2.Height:=Hauteur_définie_ou_calculée; //hauteur choisie pour le Layout2 en mode portrait.
end
else
begin
// mode paysage
Layout2.align:=TAlignLayout.Left;
Layout2.Width:=Layout1.Width/2; //choix de diviser l'écran en deux parties égales en mode paysage
end;
end; |
Les seules contraintes sont :
- de décider la Hauteur du Layout2 en mode portrait car sinon après 2 ou 3 manipulations, la hauteur de Layout2 prend la hauteur de Layout1 et ne laisse plus la place à Layout3.
- en mode Paysage, de choisir comment partager l'écran en largeur (j'ai choisi de partager l'écran en deux moitiés égales, mais c'est adaptable).
Pour ce qui me concerne, ce n'était pas une contrainte.
Bien entendu, tout ce qui est à l'intérieur des Layout doit être le cas échéant redimensionné, notamment en largeur en mode Portrait selon le partage choisi.
Mais ça marche très bien.
Partager