Création de boutons automatiques

Résolu
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 4 janv. 2012 à 09:20
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 10 janv. 2012 à 16:04
Bonjour et meilleurs voeux,

Je suis sur un projet pour l'école dans lequel je dois développer une application qui sera utilisée sur un écran tactile. Ainsi les contraintes sont très différentes puisqu'il faut que le programme soit très simple et rapide à utiliser avec ses doigts et non la souris.
Voici mon problème : J'ai une liste de 10 personnes, seulement sur ces 10 personnes, seulement 5 sont présentes le jour d'utilisation de mon application. Je voudrais que chaque personne qui soit présente puisse cliquer sur un bouton correspondant à son nom. Mais il est inutile d'afficher 10 boutons si seulement 5 personnes sont présentes. Je voudrais ainsi, avant l'arrivée des gens, sélectionner a l'aide de ma souris les gens qui sont présent et que des boutons soit créés et ajustés sur ma form. Les gens sont enregistrées dans une BDD.

Je ne sais pas si c'est possible, ni même comment enregistrer des infos derrière un bouton qui retiendrait par exemple l'id de la personne, et qu'il y ait du code derrière chaque bouton.

Suis je assez clair ? Est ce possible selon vous et avez vous des astuces qui pourraient m'aider car je n'ai aucune idée de comment faire.

Cordialement

39 réponses

Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
5 janv. 2012 à 13:14
En effet, pour l'instant j'ai 15 personnes dans la liste, ces gens ne seront pas toujours tous présents en même temps, et peut être amenée a s'agrandir. Ton code est super le seul problème est qu'au niveau des coordonnées, ca s'incrémente et du coup sort de la forme, je ne vois pas comment faire pour décaler vers le bas les boutons dès que la ligne est terminée.

Voila concrètement ce que va faire mon projet : Une personne X va venir se sélectionner pour ensuite faire des actions, et a chaque action, on saura que c'est elle qui l'a faite. Le principe est qu'en début de journée, j'ouvre le programme, je clique sur les personnes présentes, et cela va générer 1 bouton par personne présente

Exemple : J'appuie sur le bouton associé à mon nom et ensuite j'appuie sur "J'ai pris un gobelet". Et après dans la BDD on peut voir tel jour a tel heure, j'ai pris un gobelet.

C'est un exemple bête mais en gros c'est ça que je souhaite faire
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
5 janv. 2012 à 14:31
j'ouvre le programme, je clique sur les personnes présentes, et cela va générer


les pauvres personnes

comment vas tu affiché la liste de personne
dans un combobox
supposons que ton projet est terminé
je lance le exe
que dois t'il apparaitre sur l'écran
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
5 janv. 2012 à 14:35
On va dire que j'ai un menu dans lequel j'ai la liste de toutes les personnes enregistrées, et je vais sélectionner celles présentes dans une listbox. Et lorsque je vais valider la liste des personnes présentes, alors cela va générer autant de boutons que j'ai sélectionner de personnes, sur ma Form.

J’espère être assez clair
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
6 janv. 2012 à 10:09
Ce code est exactement ce que je souhaitais faire !
Merci mille fois !
Cependant j'aimerais bien le comprendre et j'ai deux trois questions à te poser

Je ne comprends pas à quoi sert le DirectCast. D'après le MSDN ce serait une conversion ?

 panelbutton.Width = maxwith * 5 + 7 * space
        panelbutton.Height = maxheight * 10 + 12 * space
        panelbutton.Left = Me.Width \ 2 - Me.panelbutton.Width \ 2
        panelbutton.Top = Me.Height \ 2 - Me.panelbutton.Height \ 2
       


Se je comprends bien : On redéfinit la largeur du panelbutton, mais je ne comprends pas les valeurs qui sont à la suite ni même pourquoi on redéfinit la largeur...

idem pour la Hauteur... pourquoi *10 + 12 ?
idem pour Left,Top, pourquoi des /2 ??

Je suis completement perdu avec ces valeurs...

Tout comme :
 If (iter Mod 5 = 0) And iter <> 0 Then
                    positionx = 6
                    positiony += DirectCast(ctrl, Button).Height + space
                End If


Pourquoi un modulo 5 ? Le 6 je suppose que c'est la valeur pour commencer en début de panelbutton ?

Enfin pour terminer, question peut être bete, mais iter, ca veut dire quoi ? car ce n'est pas la première fois que je le vois (ex Array.iter).


Encore un grande merci ShayW
0

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

Posez votre question
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
6 janv. 2012 à 11:14
Bonjour Moundir n°76,

Si la form fait 500 et l'objet 100 de largeur :

(Largeur de la form / 2) - (largeur de l'objet / 2)
(500 / 2 250) - (100 / 2 50) = 200 (250-50).
Le left de l'objet sera positionné ainsi à 200

On peut aussi faire :
(largeur form - largeur objet) / 2 = 200, ce qui revient au même que susdit.
Mais l'exemple positionne tout au milieu, ce qui n'est pas toujours le cas

On fait pareil dans la hauteur.

*

Pour les variables ou constantes, sans avoir lu le code, c'est sans doute l'espace nécessaire entre deux objets + une valeur fixe pour ne pas coller le premier objet au bord.

Ainsi dans l'horizontal (X), si on a 3 objets de 50 dans une largeur de form de 320 on va faire ceci :

objet.Left1 = 10
objet.Left2 = objet1.left + objet1.width + 50
objet.Left3 = objet2.left + objet2.width + 50

Le problème vient du fait qu'on ne dispose que de deux valeurs directes (left et top), alors qu'il nous en faut 4 (il manque right et down), alors il faut les calculer :
objet.left + objet.width = objet(right)
objet.top + objet.height = objet(down)

Alors si tu as moult objets tu vas faire une boucle...
Ce qui explique les a * b + c

On peut d'ailleurs utiliser
Space(nombrePixels)

Ceci si les écarts sont ls mêmes on va pouvoir positionner les objets en fonction d'une multiplication ayant une valeur constante selon la valeur de chaque objet.

Imaginons que chaque objet fasse 100 et doivent être séparé de 10 (ce qui fera un pas de 110 entre chaque objet), et que l'on ait 5 objets O(i), on va faire ainsi dans la largeur (10 étant le décollage du bord du premier objet)
for i = 0 to 4
o(i+1).left = 10 + (110 * i)
next i

décomposition:
i=0 o(i+1) left à 10 + (110 * i) = 000 : left 010
i=1 o(i+1) left à 10 + (110 * i) = 110 : left 120
i=2 o(i+1) left à 10 + (110 * i) = 220 : left 230
i=3 o(i+1) left à 10 + (110 * i) = 330 : left 340
i=4 o(i+1) left à 10 + (110 * i) = 440 : left 450

Cordialement, Joe.
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
6 janv. 2012 à 14:46
@Ehjoe : Merci pour ces explications.

@ShayW : Merci pour ton aide j'ai tout compris maintenant, donc corrige moi si je me trompe mais dans mon code je vais rajouter des variables qui vont contenir le nombre d'élements que j'ai dans ma liste :

Mavar = listboxname.Items.Count
panelbutton.Width = maxwith * 5 + Mavar+1 * space


Par contre après pour le modulo
Enfin ca me permet déjà de bien bosser.

Pour le DirectCast j'avais bien été voir sur le MSDN mais toujours pas compris. C'est une association avec un objet ?

Merci beaucoup
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
9 janv. 2012 à 09:40
On est sur la même longueur d'ondes maintenant, merci beaucoup

Oui ça marche très bien sur l'écran tactile, comme un mouseclick !

Cependant avec le nouveau code que tu viens de me donner, ça ne marche pas si j'ai un nom trop long, le buttonpanel va avoir des dimensions trop importantes et ainsi sortir de la forme a gauche... puisqu'avec le modulo5, on lui indique qu'il devra y avoir 5 boutons par "ligne", donc évidemment qu'il essaye de les placer mais c'est trop long....
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
9 janv. 2012 à 14:10
oui je comprends
en plus tu ne connais pas la liste des personnes

mais meme avec le code d'avant tu peux avoir un
problème tout dépend du font et de la taille
choisi
pour cela il faut jouer avec le nombre de boutons
par rangée
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
9 janv. 2012 à 15:04
encore un parametre à prendre en consideration
en plus comme c'est un écran tactile
les boutons doivent avoir une taille minimum
un doigt n'est pas comme la pointe de la souris

si ça peut etre utile
la largeur et hauteur de l'écran
w = Windows.Forms.Screen.PrimaryScreen.Bounds.Width
h 
Windows.Forms.Screen.PrimaryScreen.Bounds.height


ainsi on peut établir une formule
N nombre de boutons par rangée
E Espace entre chaque bouton
R nombre de rangée
Lmax largeur maximal du bouton
Hmax hauteur du bouton

N * Lmax +(N+1)*E < w
R * Hmax + (R+1)*E < h
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
9 janv. 2012 à 15:27
C'est ce que j'ai fait, et c'est vrai que d'avoir des boutons tous de la même taille fait quand même plus "propre".

Encore un énorme merci ShayW

Bonne journée !
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
9 janv. 2012 à 15:45
N * Lmax +(N+1)*E < w
R * Hmax + (R+1)*E < h


Désolé mais je n'avais pas vu ce message !

je comprends ces formules mais je ne vois pas pourquoi tu rajoutes <w et <h. Puisqu'on définit w et h par rapport à l'écran...
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
9 janv. 2012 à 17:09
N * Lmax +(N+1)*E < w
R * Hmax + (R+1)*E < h

N * Lmax +(N+1)*E = la largeur du panelbouton
donc il faut qu'il soit plus petit ou égale
à la largeur de l'écran
donc plutot
N * Lmax +(N+1)*E < = w

pareil pour la hauteur du panelbouton

et que fais tu si deux personne ont le meme
nom et prénom ?
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
10 janv. 2012 à 10:59
D'accord, j'avais bien compris ces formules mais je pensais que tu voulais les intégrer au code.

Si deux personnes ont le même nom et prénom ?

Aucune idée, j'espère que ça ne se produira pas. Je n'y avais pas pensé en effet...
Je voulais sur le principe créer des déclencheurs (chose que je n'ai jamais réussi à exécuter, même en copiant bêtement...) qui pourraient indiquer à l'utilisateur que la combinaison nom/prénom existe déjà et ainsi refuser l'ajout de la personne dans la BDD. Je pense que je vais poster ça dans la section SQL...
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
10 janv. 2012 à 12:50
les 2 personnes qui ont les meme nom
normalement on identifie avec son no d'indentité
ou soi attribue un identifiant à chaque personne
ou soi ajoute un numéro au nom identique
dans ta bdd tu dois avoir un tableau où tu
enregistres les données des personnes
avant d'enregistrer verifie si dans le tableau
il n'y a pas le meme nom et prénom
si c'est le cas enregistre la personne en ajoutant un numéro à son prénom victor1 hugo
victor2 hugo
comment vas tu savoir si c'est victor1 ou victor2
avec une requette
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
10 janv. 2012 à 13:43
Oui dans ma BDD j'ai un id un nom et un prenom.
Et les boutons qui s'ajoutent prennent comme nom l'id de la personne

ex bouton |Romain| . quand je clique sur Romain, j'obtiens l'identifiant 1 grace a la proprité Button.Name

Mais c'est vrai que si j'ai 2 |Romain DUPONT| et |Romain DUPONT|, impossible de faire la différence. c'est pour cela que je pense qu'un trigger serait une bonne chose. Hier encore en donnant mes coordonnées dans un magasin, il y avait quelqu'un qui s'appellait Romain DUPONT, donc elle m'a dit "Vous êtes Romain DUPONT2".
C'est ce principe que je souhaite faire
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
10 janv. 2012 à 14:20
"Vous êtes Romain DUPONT2".

t'aurais du lui dire Moundir76

Et les boutons qui s'ajoutent prennent comme nom l'id de la personne

que veut dire prenne comme nom
le texte du bouton ?
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
10 janv. 2012 à 14:29
For Each name As String In listname
            Dim mybutton As New Button
            With mybutton
                .Font = New Font("arial", 16, FontStyle.Bold)
                .TextAlign = ContentAlignment.MiddleCenter
                .Text = LTrim(Strings.Mid(name, 5))
                .BackColor = Color.PowderBlue
                .AutoSize = False
                .Width = Convert.ToInt32(maxsizebuton.Width)
                .Height = Convert.ToInt32(maxsizebuton.Height)
                .Name = Strings.Left(name, 5)

                AddHandler .MouseClick, AddressOf mouseclickbutton
            End With
           
            panelbutton.Controls.Add(mybutton)
        Next


Car je fais afficher ma liste de prénom avec un SqlDataReader (pas réussi a adapter le code avec un SqlDataAdapter...), et du coup dans la liste je fais afficher les id + nom_prenom. Et après pour les boutons je sélectionne uniquement l'id avec lequel je nomme chaque bouton avec sa personne qui lui correspond.

Le but est que lorsque je clique sur un bouton, j'obtiens aussi son id mais il reste invisible pour l'utilisateur de l'appli
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
10 janv. 2012 à 15:29
pourquoi ne pas afficher les boutons avec l'id
seulement ?
ici j'ai un petit code c'est avec bdd access
un module
Imports System.Data.OleDb


Module db
    Private Connection As New OleDb.OleDbConnection 'declares  connection

    Public Sub Init()
        'initialise le database
'à modifier pour sql server 
        Dim base As String = "provider=microsoft.jet.oledb.4.0;data source=" & Application.StartupPath & "\DBTEST.mdb"
        Connection.ConnectionString = base
        Try
            Connection.Open()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
    Public Function GetListName() As OleDbDataReader
     
        Dim sql As String
        Dim recordset As OleDbDataReader
        recordset = Nothing

        sql = "SELECT Famillyname,Name,id FROM table1  ORDER BY Famillyname,Name"
        Dim myquery As New OleDbCommand(sql, Connection)
        Try
            recordset = myquery.ExecuteReader
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        Return recordset
        Connection.Close()
    End Function


dans la form
Imports System.Data.OleDb

Private Sub DesignListName()

   Dim myrecordset As OleDbDataReader
        Try
            myrecordset = db.GetListName

            ComboName.Items.Clear()
            While myrecordset.Read
                ComboName.Items.Add(myrecordset.GetString(0) & " " & myrecordset.GetString(1) & " " & myrecordset.GetString(2))
            End While
            ComboName.Text = "liste de noms "
           
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

    End Sub

comboname est un combobox
avec sql server je ne sais pas si c'est pareil
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
10 janv. 2012 à 16:04
pourquoi ne pas afficher les boutons avec l'id seulement ?


Je ne vais pas demander à toutes les personnes d'apprendre leur ID par coeur !

Merci pour ton code, mais je pense que c'est exactement la même chose. Toi tu utilises un recordset (Je me demande même si ce n'est pas toi qui m'avais appris à m'en servir l'an dernier sur un vieux topic ^^). Moi avec un DataReader c'est la même chose.
Ce que j'aurais souhaité faire pour être plus optimisé, c'était un code de ce genre :

 Dim CmdSelectUtilisateurs As New SqlCommand("SELECT idEntite, nom + '  ' + prenom as nom_prenom FROM ENTITE", MaConnexion)

        'Avec un DataAdapter on va remplir la listbox des Utilisateurs
        Dim dt As New DataTable()
        Dim daTable As New SqlDataAdapter(CmdSelectUtilisateurs)
        daTable.Fill(dt)
        lstboxUtilisateurs.DataSource = dt
        lstboxUtilisateurs.DisplayMember = "nom_prenom"
        lstboxUtilisateurs.ValueMember = "idEntite"


Mais ce n'est pas grave car ca marche très bien avec un DataReader, c'est juste moins optimisé et un peu bidouillé.

Merci pour ta patience et ton aide ShayW
0
Rejoignez-nous