Premier index disponible

Résolu
cs_antho2005 Messages postés 150 Date d'inscription samedi 8 avril 2006 Statut Membre Dernière intervention 1 mai 2012 - 25 févr. 2007 à 22:09
cs_antho2005 Messages postés 150 Date d'inscription samedi 8 avril 2006 Statut Membre Dernière intervention 1 mai 2012 - 26 févr. 2007 à 12:21
Bonjour,

mon probleme est le suivant : sur ma form je crée et suprrime des composants de même nom avec des index differents en utilisant Load. Le truc c'est que si je prend le dernier plus un (c'est à dire le nombre total, car ça commence par zéro) au bout d'un moment ba l'index y sera trop grand (maximum 32 767).

Donc je prend (enfin j'essaye) de prendre le premier disponible mais j'y arrive pas ...

Voici mon code :

Dim Ctrl As Control
nbr = 0
ok = 0


Do While ok = 0


toto = 0


For Each Ctrl In Form1.Controls


If Ctrl.Name = "etoile" Then


If Ctrl.Tag = nbr Then
toto = toto + 1
Else
toto = toto + 0
End If


nbr = nbr + 1


End If


Next


If toto = 0 Then
ok = 1
End If


Loop


Load etoile(nbr)

Si vous avez une idée ...

Merci.

Antho

2 réponses

cs_antho2005 Messages postés 150 Date d'inscription samedi 8 avril 2006 Statut Membre Dernière intervention 1 mai 2012 3
26 févr. 2007 à 12:21
Salut et merci pour la rapidité de ta réponse,

j'ai relu le code et mis des commentaire puis j'ai décidé de tout changer.Ca marche bien que j'ai mis longtemps à me rendre compte que le chiffre(par exemple 1) du i, qui est un nombre, est different different de celui du tag de l'étoile qui est du texte.

Je met le code complet pour ceux qui le veulent (bien que pour l'instant il n'y a que des points blancs qui descendent la form). Il vous faut une feuille Form1, un control shape nommé etoile en invisible avec un index de zéro et deux timer nommés Timer1 et Timer2 ayant tout deux des intervals de 10.

Code :

Private Sub Timer1_Timer()


Randomize
'prend un nombre au hasard entre 0 et la largeur de la form
a = CInt(Int(Form1.Width * Rnd()))
'prend en nombre au hasard entre 1 et 50
b = CInt(Int((49 * Rnd()) + 1))


'initialisation des variables
Dim Ctrl As Control
ok = 0
nbr = 0


For i = 1 To etoile.Count


combien = 0


'pour chaque control dans la form
For Each Ctrl In Form1.Controls


'Si c'est un control "etoile"
If Ctrl.Name = "etoile" Then
'Si son Tag est le nombre i
If Ctrl.Tag = CStr(i) Then
'alors c'est qu'y en a 1
combien = 1
'ça nous interesse pas, on peut sortir
Exit For
End If
End If


Next


'si il en a pas trouvé
If combien = 0 Then
'c'est que c'est le premier index dispo(à part zéro) c'est donc celui-la qu'on va utiliser
nbr = i
'on sort de la boucle car on a trouvé ce qu'on cherchait
Exit For
End If


Next i


'on crée l'étoile
Load etoile(nbr)


'on régle ses parametres
etoile(nbr).Tag = nbr
etoile(nbr).Visible = True
etoile(nbr).Height = 1
etoile(nbr).Width = 1
etoile(nbr).Top = 0
etoile(nbr).Left = a


'on change l'interval du timer
Timer1.Interval = b


End Sub


Private Sub Timer2_Timer()


Dim Ctrl As Control


For Each Ctrl In Form1.Controls


If Ctrl.Name = "etoile" Then


'on avance chaque étoile
If Ctrl.Tag <> 0 Then
etoile(Ctrl.Tag).Top = etoile(Ctrl.Tag).Top + 50
End If


'on la supprime si elle dépasse de la form
If etoile(Ctrl.Tag).Top > Form1.Height Then
Unload etoile(Ctrl.Tag)
End If


End If


Next


End Sub

Voilà.

Antho
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
25 févr. 2007 à 22:25
Bonsoir,

veux-tu nous expliquer ce que tu comptes faire exactement avec :

If Ctrl.Tag = nbr Then.... etc...

car nbr = 0 (défini plus haut)


pour le reste : une suggestion : commente ton propre code (celà) te permettra à mon avis de mieux prendre conscience...)


Dans quel événement as-tu, enfin, mis ce code ?
0
Rejoignez-nous