1. #1
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    6 178
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 178
    Points : 8 427
    Points
    8 427

    Par défaut Comment centrer un contrôle dans son parent ?

    Bonsoir,

    Question stupide, direz-vous ?

    Au départ j'étais parti sur une histoire classique de contrôle.Left := (parent.Width-contrôle.Width) div 2; et pareil pour le Top et la hauteur, mais j'avais des effets de bord trop longs à expliquer ici, alors j'ai un peu googlé et bien mal m'en a pris, parce qu'au plus je lis au plus je m'enfonce...

    Pour la faire courte, je me suis retrouvé sur le wiki, où j'ai pu voir la mise en application de choses que je n'utilise jamais, l'aide étant tellement vide sur ce sujet...

    Bref, j'ai trouvé ça (je n'ai mis que les parties en rapport avec mon souci) :
    Citation Envoyé par wiki
    http://wiki.freepascal.org/Autosize_...#BorderSpacing
    The BorderSpacing properties controls the minimum amount of space around a control.
    The properties are:
    CellAlignHorizontal: This is used in table layouts
    like ChildSizing.Layout=cclLeftToRightThenTopToBottom.
    If the control is smaller than the table cell,
    this property defines where to align the control: to the left ccaLeftTop,
    to the right ccaRightBottom or in the middle ccaCenter.

    http://wiki.freepascal.org/Autosize_...dividual_cells
    There are four possible values for CellAlignHorizontal/CellAlignVertical:
    ccaCenter: the child control uses its preferred width (height) and will be centered in the cell
    Lisant "This is used in table layouts" j'ai supposé qu'il pouvait être question de grilles, j'ai donc dessiné une fiche avec une DrawGrid, j'ai mis les options d'alignement de la cellule (il n'y en a qu'une) à ccaCenter et pour le panneau que j'espère aligner, tous les Anchors (akTop, etc.) à False comme expliqué + ou - dans le wiki,
    Citation Envoyé par wiki
    http://wiki.freepascal.org/Autosize_...chored_control
    When changing the size of a parent all anchored child controls are moved and/or resized immediately
    With no akLeft and no akRight their centers are scaled:
    et tout mon code est là :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      dg.DefaultDrawing := False; // pour éviter le pointillé de sélection
      Panel4Grid.Parent := dg; // pour aligner le panel dans la cellule de la dg
    end;
     
    procedure TForm1.Panel2Resize(Sender: TObject); // pour voir le comportement du Panel4Grid
    begin
      with dg do begin
        Height:= panel2.Height div 2;
        Width := panel2.Width-20;
        Columns[0].Width := Width-20;
        RowHeights[0] := Height;
        Color:=clSkyBlue;
        Columns[0].Color:=clYellow;
      end;
    end;

    Ce code donne ça :
    Nom : centercontrol.png
Affichages : 61
Taille : 9,4 Ko

    Le Panel1 est aligné à gauche, le 2 à client, et le Panel4Grid, comme son nom l'indique, se retrouve sur la DrawGrid, mais bien mal placé...

    Questions : c'est moi qui me suis gourré quelque part ?
    C'est le wiki qui est à la ramasse ?
    C'est pas supporté sous Linux ?
    Ah, sous Windows XP et Laz 1.6rc1, sans rien changer au code ni aux réglages dans l'EDI (qui sont corrects !), le centrage vertical fonctionne.
    Nom : edi.png
Affichages : 58
Taille : 3,5 Ko

    Le boulot à moitié fait ? Allez comprendre...

    Nom : sous_xp.png
Affichages : 58
Taille : 4,6 Ko
    J'ai "estranciné" la fiche pour montrer la réduction du Panel2, et donc la DrawGrid, et on voit bien le panel qui se barre lamentablement à gauche...

    EDIT 5 minutes + tard : après avoir fait la copie d'écran sous Linux avec le panneau pas du tout centré puis être passé sous XP où j'ai découvert l'alignement vertical, je suis repassé sous Linux et là, l'alignement vertical est apparu également !
    Est-ce que le passage sous un EDI + récent que mon vieux 1.4 aurait rajouté quelque chose ? Mystère et boule de gomme...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    6 178
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 178
    Points : 8 427
    Points
    8 427

    Par défaut

    Alors, 64 lectures et personne n'a d'idée ?

    C'est du lourd, ce truc !
    Du coup j'ai viré les gadgets de l'EDI pour retourner aux fondamentaux, les bons vieux calculs et là, ma foi, le centrage fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      procedure CenterPanel(p: TPanel);
      begin
        with p do begin
          Left:= (Parent.ClientWidth -Width ) div 2;
          Top := (Parent.ClientHeight-Height) div 2;
        end;
      end;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    février 2009
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2009
    Messages : 208
    Points : 148
    Points
    148

    Par défaut

    Salut,

    Réponse peut-être con...
    Tu as essayé de viré tous les Anchors sans ajouter de code particulier ?

  4. #4
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    6 178
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 178
    Points : 8 427
    Points
    8 427

    Par défaut

    Salut aussi,
    Citation Envoyé par benoit1024 Voir le message
    Réponse peut-être con...
    Tu as essayé de virer tous les Anchors sans ajouter de code particulier ?
    On parle bien des Anchors concernant l'objet en tentative de centrage ? Alors :
    Citation Envoyé par Jipété Voir le message
    Lisant "This is used in table layouts" j'ai supposé qu'il pouvait être question de grilles, j'ai donc dessiné une fiche avec une DrawGrid, j'ai mis les options d'alignement de la cellule (il n'y en a qu'une) à ccaCenter et pour le panneau que j'espère aligner, tous les Anchors (akTop, etc.) à False comme expliqué + ou - dans le wiki,
    Citation Envoyé par wiki
    http://wiki.freepascal.org/Autosize_...chored_control
    When changing the size of a parent all anchored child controls are moved and/or resized immediately
    With no akLeft and no akRight their centers are scaled:
    D'autres idées ?

    En fait, comme dit hier tard, avec la méthode à l'ancienne (les calculs) ça fonctionne, donc ce sujet est résolu si l'on peut dire, j'en ouvre un autre avec les ScrollBars invisibles dans la ScrollBox...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Centrer un item dans son parent
    Par GilbertLatranche dans le forum Qt Quick
    Réponses: 5
    Dernier message: 08/01/2015, 20h07
  2. Comment trouver les contrôles dans un DBCtrlGrid
    Par Bruno75 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 19/12/2010, 18h42
  3. [ SWING ] Ouvrir une fenêtre dans son parent
    Par Blaise1 dans le forum AWT/SWING
    Réponses: 9
    Dernier message: 12/01/2006, 17h12
  4. Comment gérer plusieurs icones dans son exécutable ?
    Par declencher dans le forum Langage
    Réponses: 5
    Dernier message: 15/10/2003, 11h49
  5. Comment centrer un Texte dans un rectangle ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 22h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo