Alignement boutons dans un Tpanel

Résolu
softstar Messages postés 3 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 13 août 2006 - 13 août 2006 à 10:19
softstar Messages postés 3 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 13 août 2006 - 13 août 2006 à 23:42
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

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
13 août 2006 à 14:23
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
3
cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
13 août 2006 à 11:55
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
0
cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
13 août 2006 à 11:57
Heu, faut mettre ton panel a AOwner (param du constructeur TButton ) et à parent

bouh
0
softstar Messages postés 3 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 13 août 2006
13 août 2006 à 12:00
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 ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
softstar Messages postés 3 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 13 août 2006
13 août 2006 à 23:42
merci beaucoup cirec,cela me donne exactement ce que je désirais


tu rox ;)
0
Rejoignez-nous