C'est possible ?

cs_Xneo Messages postés 48 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 18 janvier 2007 - 7 mai 2005 à 13:39
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 - 8 mai 2005 à 19:38
Voila, en VB6 j'ai un tableau dynamique de String!
J'aimerai en fait parcourir le tableau, et si dans le tableau je trouve une case qui est égale avec une string que j'aurai choisi, je voudrais supprimé la case en fait, mais que le tableau se décale automatiquement, pour pas qu'il y est un trou au milieu par exemple! Possible ? merci davance...

15 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
7 mai 2005 à 15:33
Il ne peut y avoir, à ma connaissance, de décalage "automatique". Mais, tu peux essayer ce code :

Dim t() As String
Dim i As Integer


ReDim t(3)
t(0) = "toto0"
t(1) = ""
t(2) = "toto2"
t(3) = "toto3"


For i = LBound(t) To UBound(t) - 1
If t(i) = "" Then
t(i) = t(i + 1) 'on décale vers le haut
t(i + 1) = "" 'on efface la valeur décalée
End If
Next


If t(UBound(t)) = "" Then
ReDim Preserve t(UBound(t) - 1) 'on redimensionne le tableau
End If

Loup Gris
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 mai 2005 à 15:34
Salut
Oui, c'est possible
Il suffit d'utiliser une Collection au lieu d'un tableau.
Avantage : Tu gères tes 'cases' par leur contenu, c'est à dire que tu vas pouvoir faire des recherches en un clin d'oeil
Inconvénient : Plus long (en temps machine) à gérer les Remove par exemple.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
7 mai 2005 à 15:35
Salut ;O)

Ou tu utilises 2 tableaux...
Sur ton form : 2 ListBox, un bouton de commande et colle ceci :

Private Tab1(1 To 100) As String
Private Tab2() As String


Private Sub Command1_Click()


Dim MyStr As String
Dim Counter As Long
Dim i As Long


'Chaîne à rechercher
MyStr = "String50"


For i = 1 To UBound(Tab1)
If Tab1(i) <> MyStr Then
Counter = Counter + 1
ReDim Preserve Tab2(Counter)
Tab2(Counter) = Tab1(i)
Me.List2.AddItem Tab2(Counter)
End If
Next i


End Sub


Private Sub Form_Load()


Dim i As Long

'Remplissage du tableau initial
For i = 1 To UBound(Tab1)
Tab1(i) = "String" & Trim$(Str$(i))
Me.List1.AddItem Tab1(i)
Next i


End Sub
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
7 mai 2005 à 16:53
Moi j'aime bien la solution de Néo même s'il faut bien reconnaitre que celle de Lupus est clairement la plus efficace.



Cependant, j'aimerais bien que Jack nous donne un petit exemple de sa
solution... Car en effet, si l'utilisation des tableaux est bien
pratiques, ce genre de problèmes est récurrent!
0

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

Posez votre question
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
7 mai 2005 à 17:12
ScSami > ma solution a en effet le mérite d'être simple à comprendre, mais certes la moins efficace en terme de performance...
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
7 mai 2005 à 17:37
Il y a une autre solution mais c'est juste pour montrer qu'il y a n solutions. Un exercice de style si on peut dire :

Dim t() As String
Dim i As Integer
Dim s As String


' remplissage du tableau
ReDim t(3)
t(0) = "toto0"
t(1) = "toto1"
t(2) = "toto2"
t(3) = "toto3"


'transformation du tableau
' en 3 lignes
s = Join(t, ";")
s = Replace(s, ";toto1;", ";")
t = Split(s, ";")

'ou


' en 1 ligne
't = Split(Replace(Join(t, ";"), ";toto1;", ";"), ";")


'affichage des résultats
For i = LBound(t) To UBound(t)
MsgBox t(i)
Next

Tite explik : je convertis le tableau en chaine (chaque item étant séparé par un ";" mais on peut choisir autre chose), je remplace l'enregistrement (ou case ou quelque soit le nom qu'on lui donne) par un ";" (dans l'exemple ";toto1;"). Et enfin, je réinjecte le résultat dans le tableau.

Inconvénient : ça ne marche QUE pour des tableaux dynamiques à 1 dimension.

Je n'ai pas calculé la vitesse d'exécution entre ma 1ère solution et celle-ci. A voir....

------------------------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
7 mai 2005 à 17:47
Comme quoi, on peut être dresseur de puces, baver de rage et avoir du style ;-)



Mais j'attends toujours un solution avec des Collections!
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
7 mai 2005 à 20:18
Je t'appuie ScSami, j'aimerais aussi connaître une solution avec des Collections car mon museau n'a rien reniflé de ce côté en ce qui concerne les tableaux dynamiques en mémoire.

PS : je n'ai pas encore la rage et si je bave, c'est d'admiration devant quelqu'un(e) qui trouve une astuce que je ne connais pas ! Et je bave souvent !!!

--------------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
7 mai 2005 à 21:06
Salut ;O)

Avec une collection, voici ce que j'ai pondu...
Sur un form : 2 ListBox, un bouton de commande et on colle ceci :

Private MyCollection As New Collection

Private Sub Form_Load()


Dim i As Long

For i = 1 To 100
MyCollection.Add "String" & Trim$(Str$(i))
Me.List1.AddItem MyCollection(i)
Next i


MsgBox "Nombre d'éléments dans la collection: " & MyCollection.Count


End Sub


Private Sub Command1_Click()


Dim i As Long
Dim MyStr As String


'Chaîne à rechercher
MyStr = "String50"

For i = MyCollection.Count To 1 Step -1
If MyCollection(i) = MyStr Then MyCollection.Remove (i)
Next i


'On affiche le contenu de la collection dans le listbox2
For i = 1 To MyCollection.Count
Me.List2.AddItem MyCollection(i)
Next i

MsgBox "Nouveau nombre d'éléments dans la collection: " & MyCollection.Count

End Sub
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
8 mai 2005 à 05:15
Pardonne moi pour la rage mon Loup ,
mes écris dépassent parfois mes pensées... Ah... si seulement ça
pouvait aussi être vrai quand je programme... ce serait génial!

En fait, je voulais dire : "Comme quoi, on peut avoir des puces, des poils et de la classe!" ;-))

J'espère ne pas t'avoir offensé, sinon, je m'en excuse platement.



Je crois que notre NéaGates, à défaut de notre Jack, nous a fournit un
très bonne exemple d'utilisation des collections comme alternative aux
tableaux.. Je vais m'empresser de tester tout ça... En tous les cas,
moi, chien ou loup, perso, je bave d'admiration devant cette
démonstration qui me sera plus qu'utile...



Merci Balastik
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
8 mai 2005 à 05:34
Dites les gars, j'ai juste une petite question là qui me trotte dans la tête depuis un bout de temps...

Pourquoi parlez-vous de "formulaire" ??? Une "Form", certes, au sens de
"document" peut se traduire ainsi. Mais en français, tout comme dans la
MSDN, on parle d'une "fenêtre"!!! J'dis une connerie ou pas??? Alors,
est-ce une lubie de oldschooler ou alors une mauvaise interprétation de
cette vilaine langue qu'est celle du trop connu Shakespeare ??? Mais
peut-être est-ce une interprétation prenant en compte un mystèrieux
facteur technique ???



S'il vous plait, éclairez ma lenterne... parce que tout seul, dans le
noir, entouré d'être aussi féroces que voraces que sont les BillGates
et autres Loups (garou qui sait!) et enfants éventreurs, ben moi,
j'suis pas rassuré sur mes connaissances ;-)

[le prenez pas mal... c'est qu'un petit amusé]
0
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
8 mai 2005 à 10:53
ScSami> Form, Formulaire, Fenêtre c'est juste une question de vocabulaire, tant que l'on sait qu'on à les pieds dans VB6 et de quoi on parle! Selon moi, le terme de formulaire est plus adapté à Access, ce site n'étant strictement pas limité à VB, certaines questions viennent d'utilisateurs Access, qui eux, connaissent plus le terme formulaire. On parlera aussi de UserForm pour Word et Excel et sans doute aussi pour les autres produits de la suite Office.

Ceci dit, l'IDE de VB6 en anglais parlera de "Forms" tandis que celui en français adoptera le terme de "Feuilles".

Toutefois, en programmation VB, l'objet Form sera utilisé et Forms pour une collection de Forms.

Personnellement, tous ces différents termes ne m'empêchent pas de dormir...

Voilà... Espérant avoir éclairé ta lanterne.

Guy
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
8 mai 2005 à 13:22
D'abord, merci Guy pour ta démo avec une collection. Il faudra que je teste la rapidité d'exécution. A vu de museau, ça ne doit pas être le plus performant mais ça peut être utile parfois.
D'autre part, je te rejoins sur les Forms. Ca peut s'appeler autrement, du moment que chacun sache ce que ça recouvre. Reste encore le problème du sexe de cet objet. Perso, j'ai l'habitude de dire UN Form (si form est l'abréviation de formulaire ou la contraction de UN OBJET FORM) mais bon UN ou UNE .... je ne suis pas puriste dans ce cas (du moment que j'arrive à faire la différence ailleurs ).

--------------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
8 mai 2005 à 17:11
CanisLupus > je pencherais plus sur le terme Form, sachant qu'en anglais le genre ne s'applique pas. Donc ça simplifie tout ;O)

Pour ce qui est de la rapidité d'une Collection, ce ne doit pas être execessivement optimisé. En revanche, l'utilisation est très pratique.

Guy
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
8 mai 2005 à 19:38
Le sexe... j'y avait pas pensé!!! C'est
vrai ça... c'est une question pertinente... Perso, je préfère mettre le
plus de féminin que possible dans les termes informatiques parfois si
machos voire phallocratiques! Donc, je préfère dire "une form" même si
cela peut porter à confusion ("une forme"). Ceci dit, je crois que
l'anglophinie d'apparence si pragmatique n'a justement pas le charme
qu'apporte parfois si gracieusement le genre de nos langues latines...
Soutenons cependant l'effort de CS de promouvoir la francophonie si
rare sur le net. Mais ce n'est que mon point du vu... Pi de toutes
façons, on s'en fout complètement puisqu'on parlera tous chinois dans
moins de 50 ans!



Non mais c'est vrai qu'on s'en fout un peu du moment que l'on sait de
quoi on parle. Mais je tein à remercier Néo (et pas Néa... sorry ;-)
pour ces précisions. En effet, ignorant l'appellation donnée aux
fenêtres sous Access, je ne comprenais pas le pourquoi de "formulaire".
Mais maintenant, mes lanternes sont allumées et ma vision est plus
claire, merci.



CanisLupus, tu sais, tu as bien de la chance d'arriver à faire la différence ailleurs parce que parfois, c'est pas évident ;-)
0
Rejoignez-nous