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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 449 fois - Téléchargée 32 fois

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

Ajouter un commentaire

Commentaires

benabdessamed
Messages postés
52
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
26 septembre 2012
-
bonjour Also know as
je besoin de source, te peut m'aidé

merci
Also know as
Messages postés
269
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
22 novembre 2010
-
Pourquoi ne pas utiliser un timer ?
Ainsi en redimensionnant la fenêtre il suffit d'activer le timer et de lui dire de se positionner au centre, ou à droite ou à gauche, non ?

J'ai utilisé ma propre manière pour recentrer automatiquement un texte ainsi qu'une fênetre grace à un Timer.

Ne serait-ce pas mieux plutôt que tout cela ?

(Je donnerais ma source mardi soir, désolé je l'ai pas sous la main)
straahd
Messages postés
4
Date d'inscription
vendredi 4 octobre 2002
Statut
Membre
Dernière intervention
10 novembre 2003
-
en effet, c'est pour ca que je viens de faire quelques modifications
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24 -
Une petite remarque :
for i := 0 to length(aControles)-1 do
if aControles[i].Parent <> aParent then
raise Exception.Create(aParent.Name+' n''est pas le possesseur de '+aControles[i].Name);

peut poser problème si :
1- l'indice du premier élément du tableau ne commence pas à zéro. Il serait préférable d'écrire :
for i:= Low(AControles) to High(AControles)-1 do

2- Si un élément du tableau n'a pas de valeur (=nil ?), comment réagit le code qui suit : aControles[i].Parent
Cette erreur déclenchera bien l'exception qui suit mais, elle aussi, déclenchera une nouvelle exception en voulant afficher aControles[i].Name

Dans le cas d'un tableau, Length donne le nombre d'éléments du tableau, pas celui des éléments non nuls !
Enfin, c'est juste mon avis...

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.