Modifier la position de composants (gauche, droite,centrer)

Contenu du snippet

Voici une petit procedure sympa pour positionner des composants. Par exemple mettre à droite ou au centre des bouton fermer d'une fenetre quelque soit sa taille

Source / Exemple :


//==============================================================================
// Procedure pour modifier la position des contrôles passés en parametre
// il y a 4 paramètres
// - aCentrage : définis le type de potionnement (Gauche,Droite,Centre)
// - aCentrerHauteur : Si vrai alors on centre aussi selon la hauteur
// - aControles : liste des controles à positionner
// - aDistanceBord : Distance en pixels par rapport aux bords (8 par défaut)
//==============================================================================
procedure PositionnerHorizontalementControles(aPositionnement : TPositionnement;aCentrerHauteur : Boolean; aControles: array of TControl;aDistanceBord : Integer =8);
var
  i, lLongueurBloc, lLeftBloc : Integer;
  lEcartAvecPrecedent : array of Integer;
  lParent: TControl;
begin
  if length(aControles) < 1 then Exit;
  for i := 0 to length(aControles)-1 do
    if aControles[i] = nil then
      Raise Exception.Create('Aucun contrôle ne peut etre à nil');
  lParent := aControles[0].Parent; // tous les parents doivent identiques
  // Vérifications que tous les contrôles possedent le même parent
  for i := 0 to length(aControles)-1 do
    if aControles[i].Parent <> lParent then
      Raise Exception.Create('Tous les contrôles n''ont pas le même parent');

  SetLength(lEcartAvecPrecedent,length(aControles));

  // On recupere les ecarts en pixels entre tous les controles
  for i := 0 to length(aControles)-1 do
  begin
    if i = 0 then
      lEcartAvecPrecedent[i] := 0 // Pas d'ecart, c'est le premier
    else
      lEcartAvecPrecedent[i] := (aControles[i].Left-(aControles[i-1].Left+aControles[i-1].Width));
  end;

  // on recupere la longueur du bloc qui doit posseder la longueur de tous les
  // controles, en comptant l'ecarts entre chaque 
  for i := 0 to length(aControles)-1 do
  begin
    if i = 0 then
      lLongueurBloc := aControles[i].Width
    else
      lLongueurBloc := lLongueurBloc + lEcartAvecPrecedent[i] + aControles[i].Width;
  end;

  // Determine le Left du Bloc qui represente les controles
  // avec ce left, le bloc est centré
  case aPositionnement of
    pGauche : lLeftBloc := aDistanceBord;
    pDroite : lLeftBloc := lParent.Width-lLongueurBloc-aDistanceBord;
    pCentre : lLeftBloc := (lParent.Width DIV 2) - (lLongueurBloc DIV 2);
  end;

  // on change le Left de tous les controles
  for i := 0 to length(aControles) -1 do
  begin
    if aCentrerHauteur then
      aControles[i].Top := (lParent.Height DIV 2) - (aControles[i].Height DIV 2);
    if i = 0 then
      aControles[i].Left := lLeftBloc
    else
      // le left d'un controle, c'est le left du précedent + la longueur du precedent
      // + l'ecart avec le precedent
      aControles[i].Left := aControles[i-1].Left+aControles[i-1].Width+lEcartAvecPrecedent[i];
  end;
end;

Conclusion :


si vous avec des commentaires envoyer moi un mail

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.