IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

List Of Buttons et methode recursive


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Par défaut List Of Buttons et methode recursive
    Bonsoir,

    J'ajoute une serie de boutons dans une grille delimitee (Bouton introduit sur cette grille par un Drag & Drop). Ces boutons se replacent automatiquement lors de l'evenement Mouse_up qui appelle la Sub SetLocation.
    Lorsque je sors de la grille, je voudrais supprimer le dernier bouton selectionne.
    Voila le code que j'utilise avec un probleme que je comprends, mais je ne sais pas comment le contourner ou le resoudre (recursivite et list of buttons).

    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
        Public Function Collision(ByVal selBtn As Button, ByVal xBtn As Button) As Boolean
            If selBtn.Bounds.IntersectsWith(xBtn.Bounds) Then
                Return True
            Else
                Return False
            End If
        End Function
     
        Public Sub SetLocation(ByVal selBtn As Button)
     
            selBtn.Left = selBtn.Left + 20
            selBtn.Top = selBtn.Top
     
            If selBtn.Left + selBtn.Width > 500 Then
                selBtn.Left = 20
                selBtn.Top = selBtn.Top + 20
            End If
     
            If selBtn.Top + selBtn.Height > 500 Then
                myPanel.Controls.Remove(selBtn)
                lstButtons.Remove(selBtn) 'PROBLEM: lstButtons modified THEN ForEach issue
                Exit Sub
            End If
     
            ' ================================================
            For Each item As Button In lstButtons
                If item Is selBtn Then Continue For
                If Collision(selBtn, item) Then
                    SetLocation(selBtn)
                End If
            Next
            ' ================================================
     
        End Sub
    Et oui, je modifie ma liste alors que ma boucle ForEach n'est pas terminee. J'avoue, c'est pas terrible!

    C'est dommage, car j'etais assez content du code jusqu'a ce dernier probleme.

    Un petit coup de pouce serait le bienvenu!
    Merci,

    A+
    JLuc01

  2. #2
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Par défaut
    Bonjour

    la grille c'est un datagridview

  3. #3
    Membre confirmé
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Par défaut
    Bonjour,

    Non, en fait, la grille est representee par un Rectangle(20,20,500,500) avec des points espaces de 20 en 20.
    Mais peu importe, les boutons "circulent" sur la Form. Si un Bouton se trouve en dehors de ce Rectangle, une routine (code dans l'evenement Mouse-Up) le remet a l'interieur du Rectangle.

    Voila, en esperant que c'est plus clair. Mais, je pense qu'on s'eloigne du sujet.
    Merci quand meme.

    En fait, quand la grille (ou le Rectangle) est pleine, je veux supprimer automatiquement tout eventuel boutons qu'on pourrait ajouter . Pas sur de la clarte de cette phrase.

    A+
    JLuc01

  4. #4
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Plutôt que de s'embêter avec un placement à la main des contrôles (avec tout un tas de calculs fastidieux) pourquoi ne pas utiliser un contrôle de mise en forme type TableLayoutPanel ou FlowLayoutPanel (qui semblerait a priori assez adapté ici) ?

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    en poursuivant sur le sujet du Po, je pense que la boucle n'est pas bien placée.
    A tester :
    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
        Public Function Collision(ByVal selBtn As Button) As Boolean
     
            For Each item As Button In lstButtons
                If item Is selBtn Then
                    Continue For
                End If
     
                If selBtn.Bounds.IntersectsWith(item.Bounds) Then
                    Return True
                End If
            Next
     
            Return False
     
        End Function
     
        Public Sub SetLocation(ByVal selBtn As Button)
     
            selBtn.Left = selBtn.Left + 20
            selBtn.Top = selBtn.Top
     
            If selBtn.Left + selBtn.Width > 500 Then
                selBtn.Left = 20
                selBtn.Top = selBtn.Top + 20
            End If
     
            If selBtn.Top + selBtn.Height > 500 Then
                myPanel.Controls.Remove(selBtn)
                lstButtons.Remove(selBtn)
                Exit Sub
            End If
     
            If Collision(selBtn) Then
                SetLocation(selBtn)
            End If
     
        End Sub

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    En fait, quand la grille (ou le Rectangle) est pleine, je veux supprimer automatiquement tout eventuel boutons qu'on pourrait ajouter . Pas sur de la clarte de cette phrase.
    La seule signification de "plein" pour une grille surface de dessin ne peut etre que => etre complemetement pave de boutons espaces de 20...
    Mais si elle est totalement pave le deplacement des boutons sera limite sur une distance de 20 alors que les boutons ont mettons une taille superieure 40x30...
    Mauvais si c'est unjeu...
    Pour s' assurer que les boutonts circulent avec fluidite ,il faudrait un espacement entre buttons superieur à Math.Max(40,30)= 40..
    Apres cela l'espacement +20 que tu ajoutes devrait etre remplace par un espacement de : Math.Max(button.width,button.height)+ 20....
    Pour avoir un espacement encore plus confortable tu peux utiliser l'api Rectangle.Union(rect1,rect2) ...

    Code : 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
    18
     
        Private unionRect As Rectangle
        Private penBack As Pen = New Pen(Brushes.Red, 2.0)
        Private  Rectangle Function TotalSurface() as Rectangle
            Dim gr As Graphics = Panel1.CreateGraphics()
            Dim btn As Button = lstButtons(0)
            unionRect = btn.Bounds
            For i As Integer = 1 To lstButtons.Count - 1
                btn = lstButtons(i)
                unionRect = Rectangle.Union(unionRect, btn.Bounds)
     
            Next
            Dim gr As Graphics = Panel1.CreateGraphics()
            gr.DrawRectangle(penBack, unionRect)
            gr.Dispose()
     
            return unionRect
        End Function
    Avant d'ajouter un bouton tu appelles ce Function qui te renvoie un rectangle et tu verifies si tu n'as pas atteints un width de 500 ou un height de 500....

    bon code.....

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

Discussions similaires

  1. liste des attributs (et methodes) d'un objet
    Par KINENVEU dans le forum Général Python
    Réponses: 3
    Dernier message: 20/01/2009, 21h06
  2. tour de hanoi(methode recursive)
    Par houcem001 dans le forum Qt
    Réponses: 0
    Dernier message: 30/08/2008, 17h05
  3. definir une methode recursive
    Par houcem001 dans le forum Débuter
    Réponses: 2
    Dernier message: 27/08/2008, 00h18
  4. [VBA-e] methode recursion
    Par trach.sam dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/01/2007, 15h07
  5. Liste non passee par methode post
    Par Fablondon dans le forum ASP
    Réponses: 5
    Dernier message: 09/05/2006, 13h57

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