2015-09-16 1 views
1

Je souhaite implémenter des boutons de redimensionnement automatique en conservant la même largeur lorsque certains boutons sont invisibles. J'ai utilisé le code préparé par Andreas Rejbrand at this link, mais le problème est plus compliqué quand je mets des boutons invisibles. Dans les endroits où nous avons des boutons invisibles, il y a des lacunes. Mon idée est de vérifier combien de boutons sont invisibles et ensuite btnWidth en fonction de la quantité de boutons visibles. Je ne sais pas vraiment comment je peux vérifier si les boutons sont invisibles dans ce cas.Redimensionner les boutons en conservant la même largeur lorsque certains boutons sont invisibles

Je veux utiliser TAdvGlowButton composants pour les boutons et composant TPanel pour le panneau et ajouter la procédure OnResize au panneau comme ci-dessous:

procedure TForm3.Panel4Resize(Sender: TObject); 
var 
    i: Integer; 
    btnWidth: Integer; 
begin 
    btnWidth := Panel4.Width div Panel4.ControlCount; 
    for i := 0 to Panel4.ControlCount - 1 do 
     begin 
     Panel4.Controls[i].Left := i * btnWidth; 
     Panel4.Controls[i].Width := btnWidth; 
     end; 
end; 

Pourriez-vous me donner une idée de comment résoudre ce problème?

+1

Vous devez remplacer 'Panel4.ControlCount' par le nombre de contrôles visibles à la place, puis ne définir que la largeur et la gauche de ces contrôles visibles (pas tous). Vous devrez suivre les numéros visibles vous-même, ou faire une boucle une première fois pour les compter avant de les boucler pour les redimensionner/les repositionner. –

Répondre

1
procedure TForm3.Panel4Resize(Sender: TObject); 
const 
    cLeftMargin = 10; //Margin at the left side of the group of buttons 
    cSpacing = 10;  //Spacing/Margin between the buttons 
    cRightMargin = 10; //Margin at the right side of the group of buttons 
var 
    i, VisibleControls, lLeft: Integer; 
    btnWidth: Integer; 
begin 
    //count number of visible controls 
    VisibleControls := 0; 
    for i := 0 to Panel4.ControlCount - 1 do 
     if Panel4.Controls[i].Visible then 
     inc(VisibleControls); 

    btnWidth := (Panel4.Width-cLeftMargin-cRightMargin - cSpacing*(VisibleControls-1)) div VisibleControls; 

    //distribute the visible controls 
    lLeft := cLeftMargin; 
    for i := 0 to Panel4.ControlCount - 1 do 
     if Panel4.Controls[i].Visible then 
     begin 
     Panel4.Controls[i].Left := lLeft; 
     Panel4.Controls[i].Width := btnWidth; 
     lLeft := lLeft + btnWidth + cSpacing; 
     end; 
end; 
+0

merci pour votre idée intelligente, mais je pense à un futur plus - les marges entre les boutons. J'ai mis ce code à '' procédure miResizeButtons (pnlToResize: TPanel) 'pour l'utiliser pour d'autres panneaux. Ensuite, j'ai modifié le code en distribuant les contrôles visibles et ajouté: 'pnlToResize.Controls [i] .Left: = iVisibleButtons * (btnWidth + 1); pnlToResize.Controls [i] .Width: = btnWidth - 1; pnlToResize.Controls [i] .Top: = Panel4.Controls [0] .Top; pnlToResize.Controls [i] .Hauteur: = Panel4.Controls [0] .Hauteur; '. Le seul problème est que parfois le dernier bouton s'étend au-delà du cadre. Avez-vous un conseil? – astack

+1

J'ai modifié la réponse pour inclure les marges gauche et droite et l'espacement des boutons. Vous pouvez simplement ajuster les valeurs const. – Hans