Alignement boutons dans un Tpanel

Résolu
Messages postés
3
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
13 août 2006
-
Messages postés
3
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
13 août 2006
-
bonjour tout le monde ,

je viens de terminer mon graduat d'analyste-programmeur en cours du soir

et je dois donc realiser un travail de fin d'études

j'ai choisi de faire la gestion complete d'un café-restaurant de ma région

j'utilise pour ce faire delphi 2005 , et microsoft access

voici mon probleme :

pour la réalisation de l interface de la caisse-enregistreuse de ce café

j'ai pensé qu'a la creation de ma Form , compter le nombre d'enregistrements de ma requetes concernant les familles de produits

exemple : pour ma famille alcool , j'ai 22 enregistrements et donc j'aimerais creer dynamiquement 22 boutons et les mettre dans un Tpanel

Mon probleme,j'arrive a creer dynamiquement mes boutons , mais le probleme c est que ca dépasse de mon Tpanel

Comment puis je faire pour par exemple les aligner en colonnes dans mon Tpanel et qu'ils ne dépassent pas de mon Tpannel ?

merci d'avance en tout cas a tous pour votre aide ;)

5 réponses

Messages postés
3827
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
16 décembre 2021
46
Salut

Essaye voir ce bout de code .

Je l'avais écris pour aligner tous les composants (TWinControl) dans un Panel

Tu places un TPanel sur ta fiche que tu nommes MPanel et un TButton (en dessous du Panel don sur la fiche ) que tu nommes btn_Arrange.
(Le Panel porte le nom de MPanel pour Main-Panel où Master-Panel)
Tu places, dans le MPanel, autant de TWinControl que tu désires  (Button, Panel, BitBtn, Edit, Memo, CheckBox, RadioButton ...)
 
Tu double-Cliques sur le bouton "btn_Arrange"(en mode conception bien sur) et tu complète comme ceci :

Procedure TfrmMain.btn_ArrangeClick(Sender: TObject);
{Grâce à DeferWindowPos les controles sont redimenssionnés et déplacés en une fois
ce qui est plus jolie visuellement parlant}
Var
  ButtonsPerCol, ButtonWidth, ButtonHeight, FColumns,
    FMargin, WinCtrlCount, I, J: Integer;
  DeferHandle       : THandle;
  ALeft             : Integer;
Begin
  FColumns := 6; // Nombre de colonnes
  FMargin := 10; // Marge entre le bord du MPanel et le premier composant
  WinCtrlCount := 0;
  If MPanel.ControlCount <> 0 Then   // Si MPanel contient des controles
    For I : = 0 To MPanel.ControlCount - 1 Do
      If (MPanel.Controls[I] Is TWinControl) Then Inc(WinCtrlCount);// Si ils sont de type TWinControl alors on incrémente
  If WinCtrlCount <> 0 Then // Si on à trouvé des TWinControl dans MPanel
    Begin
      ButtonsPerCol := (WinCtrlCount + FColumns - 1) Div FColumns; // Calcule ddes positions
      ButtonWidth : = (MPanel.Width - FMargin) Div FColumns;
      ButtonHeight := (MPanel.Height - FMargin) Div ButtonsPerCol;
      MPanel.Width : = FMargin + ButtonWidth * FColumns;
      MPanel.Height := FMargin + ButtonHeight * ButtonsPerCol;
      DeferHandle := BeginDeferWindowPos(WinCtrlCount);
      J := 0;
      Try
        For I : = 0 To MPanel.ControlCount - 1 Do  // Et on applique les changements aux Controles
          If (MPanel.Controls[I] Is TWinControl) Then
            With (MPanel.Controls[I] As TWinControl) Do
              Begin
                BiDiMode := MPanel.BiDiMode;
                ALeft := (J Div ButtonsPerCol) * ButtonWidth + FMargin Div 2;
                If UseRightToLeftAlignment Then
                  ALeft : = MPanel.ClientWidth - ALeft - ButtonWidth;
                DeferHandle := DeferWindowPos(DeferHandle, Handle, 0,  ALeft,
                  (J Mod ButtonsPerCol) * ButtonHeight + FMargin Div 2,
                  ButtonWidth, ButtonHeight,
                  SWP_NOZORDER Or SWP_NOACTIVATE);
                Inc(J);
              End;
      Finally
        EndDeferWindowPos(DeferHandle);
      End;
    End;
End;

Bonne chance pour le reste
@+
Cirec
Messages postés
135
Date d'inscription
jeudi 14 août 2003
Statut
Membre
Dernière intervention
12 octobre 2006
1
Je suis pas sûr de bien comprendre, pour modifier l'emplacement des bouton, il suffit de modifier le Top et le Left .

Pour aligner en colonnes perso je ferais:

I:=ListBoutons.Add(TButton.Create(Self));

Whith TButton(ListBouttons.Items[I]) Do
Begin

Parent:=Self;

Height:=BUTTON_HEIGHT; //Constante

Width:=BUTTON_WIDTH; //Constante

Caption:='Blablabla';

Top:=((I*BUTTON_HEIGHT) Mod (Panel.Height Div BUTTON_HEIGHT))+1;

Left:=(I Div BUTTON_WIDTH)+1;

End;

Bon, j'ai pas testé, mais normalement ça devrait marcher ( si c'est bien ce que tu demande ^^' )


bouh
Messages postés
135
Date d'inscription
jeudi 14 août 2003
Statut
Membre
Dernière intervention
12 octobre 2006
1
Heu, faut mettre ton panel a AOwner (param du constructeur TButton ) et à parent

bouh
Messages postés
3
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
13 août 2006

ok neko , je vais tester ce que tu viens de me dire ,

mais , excuse-moi , je ne comprends pas trop bien ton second message :

"Heu, faut mettre ton panel a AOwner (param du constructeur TButton ) et à parent "  ?

tu sais m eclaircir par un bout de code ?

merci beaucoup ;)
Messages postés
3
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
13 août 2006

merci beaucoup cirec,cela me donne exactement ce que je désirais


tu rox ;)