none
SVP Aidez-moi à corriger ce code vb6 RRS feed

  • Question

  • Dim Clicknum As Integer
    Private Sub Combo1_Click()
      Clicknum = Clicknum + 1
      Select Case Clicknum
        Case 1
        Text1= Combo1.Text
        Case 2
        Text2 = Combo1.Text
        Case 3
        Text3 = Combo1.Text
        Case 4
        Text4 = Combo1.Text
        End Select
        End Sub

    Avec ce code, le premier remplissage des textboxes se fait trés bien mais si je voudrai faire un deuxième remplissage le code ne marche pas comme il le faut.

    c-à-d, si je remplis text1 et text2 puis je quitte la forme. Ensuite, je reviens au mème forme pour faire un nouveau remplissage, je clique sur combo1; le remplissage commence par text3 meme si text1 et text2 sont vides. Alors que mois je voudrais que le remplissage commence par text1.

    merci

    vendredi 3 septembre 2010 01:20

Réponses

  • Hello,

    Sur le principe, même remarque que Joe: il faut réinitialiser ta variable dans le form_load.

    En plus, quelques remarques:

    - Dans ce cas, il faut utiliser des textboxes avec indice

    - Il n'est pas conseillé d'utiliser les propriétés par défaut des controles. Exemple: on ne doit pas écrire Text1= "toto" mais Text1.Text = "toto".

     

    Au final, ça donne cei pour Form2:

     

    (il faut créer les 4 textboxes avec comme nom Text1 et des indexs de 1 à 4).

     

    Const NB_TEXT_BOXES As Long = 4

    Dim clicknum As Long

     

    Private Sub Form_Load()

     

        clicknum = 0

    End Sub

     

    Private Sub Combo1_Click()

        clicknum = clicknum + 1

        If clicknum > NB_TEXT_BOXES Then

            clicknum = 1

        End If

        Text1(clicknum).Text = Combo1.Text

    End Sub

     

     


    Jean-marc
    • Marqué comme réponse Alex Petrescu mardi 7 septembre 2010 08:55
    vendredi 3 septembre 2010 09:39
  • Bonjour Zidane n°2,

    A priori tu peux déjà commencer en arrivant dans ta form par remettre la variable à 0 puisqu'elle fait +1 d'entrée dans sa procédure, elle sera à 1.

    Dim Clicknum As Integer ' global
    '
    sub Load ...
     Clicknum = 0
    End Sub
    '
    Sub Combo1_Click()
     Clicknum = Clicknum + 1
     Select Case Clicknum
      Case 1 : Text1= Combo1.Text
      Case 2 : Text2 = Combo1.Text
      Case 3 : Text3 = Combo1.Text
      Case 4 : Text4 = Combo1.Text
     End Select
    End Sub
    

    Si tu es satisfait de la réponse, ne pas oublier de cliquer dans le rectangle de cette dernière, en haut à gauche où se trouve le triangle vert, afin de marquer ta satisfaction ;o)

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Marqué comme réponse Alex Petrescu mardi 7 septembre 2010 08:54
    vendredi 3 septembre 2010 05:01

Toutes les réponses

  • Bonjour Zidane n°2,

    A priori tu peux déjà commencer en arrivant dans ta form par remettre la variable à 0 puisqu'elle fait +1 d'entrée dans sa procédure, elle sera à 1.

    Dim Clicknum As Integer ' global
    '
    sub Load ...
     Clicknum = 0
    End Sub
    '
    Sub Combo1_Click()
     Clicknum = Clicknum + 1
     Select Case Clicknum
      Case 1 : Text1= Combo1.Text
      Case 2 : Text2 = Combo1.Text
      Case 3 : Text3 = Combo1.Text
      Case 4 : Text4 = Combo1.Text
     End Select
    End Sub
    

    Si tu es satisfait de la réponse, ne pas oublier de cliquer dans le rectangle de cette dernière, en haut à gauche où se trouve le triangle vert, afin de marquer ta satisfaction ;o)

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Marqué comme réponse Alex Petrescu mardi 7 septembre 2010 08:54
    vendredi 3 septembre 2010 05:01
  • Hello,

    Sur le principe, même remarque que Joe: il faut réinitialiser ta variable dans le form_load.

    En plus, quelques remarques:

    - Dans ce cas, il faut utiliser des textboxes avec indice

    - Il n'est pas conseillé d'utiliser les propriétés par défaut des controles. Exemple: on ne doit pas écrire Text1= "toto" mais Text1.Text = "toto".

     

    Au final, ça donne cei pour Form2:

     

    (il faut créer les 4 textboxes avec comme nom Text1 et des indexs de 1 à 4).

     

    Const NB_TEXT_BOXES As Long = 4

    Dim clicknum As Long

     

    Private Sub Form_Load()

     

        clicknum = 0

    End Sub

     

    Private Sub Combo1_Click()

        clicknum = clicknum + 1

        If clicknum > NB_TEXT_BOXES Then

            clicknum = 1

        End If

        Text1(clicknum).Text = Combo1.Text

    End Sub

     

     


    Jean-marc
    • Marqué comme réponse Alex Petrescu mardi 7 septembre 2010 08:55
    vendredi 3 septembre 2010 09:39
  • merci à vous Ehjoe et Jean-marc Noury

    ça marche trés bien avec le code de Ehjoe.

    pour le code de Jean-marc Noury, il me donne un message d'érreur au niveau du :

    Text1(clicknum).Text = Combo1.Text (wrong number of argument or invalid property assignement)

    merci encore

    • Marqué comme réponse Alex Petrescu mardi 7 septembre 2010 08:55
    • Non marqué comme réponse Alex Petrescu mardi 7 septembre 2010 08:55
    vendredi 3 septembre 2010 13:49
  • Bonjour Zidane2,

    Merci pour le point :o)

    Ah, généralement mon code fonctionne car je le teste :o)

    C'est pas étonnant que ça marche pas car Text1(i).text ça veut dire que Jean-Marc a considéré que tu déclarais le TextBox1(4 fois), ce qui serait le plus logique, mais toi tu as déclaré 4 textBox différents une fois, alors évidemment on ne peut pas les indicer, là dans le code, c'est comme si tu écrivais TextBox1(0).text = "..." Mais y a pas de texteBox1(i) ... Donc dans ce cas c'est mon code qui tourne car j'ai respecté ta structure, à moins que tu ne veuilles la changer ; mais bof, puisque c'est fait, ça marche aussi comme chat, d'autant que dans vbNet tu ne peux plus indicer directement, ou alors faut mettre dans un container (autant dire que c'est incompréhensible pour quelqu'un qui débute de manipuler tout ça à la fois, eh oui), c'est ça le progrès (hum), alors mieux vaut prendre l'habitude dès maintenant et rester comme tu as fait. Je vais me faire engueuler par Jean-Marc (c'est le chef et il est assez méchant :o)

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 3 septembre 2010 14:13
  •  Je vais me faire engueuler par Jean-Marc (c'est le chef et il est assez méchant :o)

     

    Bha non, pas si méchant :-)

     

    Pour le reste est effectivement, j'indiquais pourtant clairement dans mon code:

    (il faut créer les 4 textboxes avec comme nom Text1 et des indexs de 1 à 4).

     

    Bonne journée !



    Jean-marc
    vendredi 3 septembre 2010 14:28
  • Bonjour Jean-Marc,

    Il ne sait peut être pas le faire ?

    Cordialement.


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 3 septembre 2010 14:35
  • Hello

    j'ai crée 4 textboxes avec comme nom Text1 et comme ça le code de Jean-marc Noury a fonctionné mais ce qui est anormal est que le remplissage des textboxes ne commence pas par  le premier textbox mais par le deuxième.

    Cordialement

    vendredi 3 septembre 2010 14:42
  • Bonjour Zidane 2,

    Normal, le texteBox(i) commence à 0, donc maintenant ta comparaison c'est 0, 1, 2 et 3, ce qui implique que tu initialise ta variable dans le Load à "-1"

    Cordialement.


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe vendredi 3 septembre 2010 15:05
    vendredi 3 septembre 2010 14:49
  • merci infiniment   Ehjoe .

    Maintenant le code de Jean-marc Noury fonctionne trés bien.

    Cordialement

    vendredi 3 septembre 2010 14:59
  • Monsieur Nourry,

    Ne faudrait-il pas mettre le code du Load à "-1"  :o)

    Cordialement.


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 3 septembre 2010 15:04
  •  

    Et non :-)

    Il faut lire TOUT ce que j'avais écrit. (marrant comme les gens ne lisent pas: ils survolent et ne voient que ce qu'ils veulent voir, pas ce qui est écrit. On voit ça partout, y compris dans le milieu professionnel, où très peu de gens se donnent la peine de lire et de comprendre les spécifications ou documentations ou guides d'installation etc.).

    Bref, j'ai écrit ceci (cf mon post plus haut):

    "(il faut créer les 4 textboxes avec comme nom Text1 et des indexs de 1 à 4)."

    Je n'ai pas écrit de 0 à 3, mais: "...de 1 à 4"

     

    Mon code était donc correct (je l'avais d'ailleurs testé, bien entendu :o) )

     

    --

    Jean-Marc

     

    [PS: un seul R à nouRy]

     



    Jean-marc
    vendredi 3 septembre 2010 20:34
  • Bonjour Jean-Marc,

    Désolé pour ton nom ;o)

    En effet tu as mis de 1 à 4, je n'avais pas vu, ça fait créer 0 à 4 puis supprimer le 0, c'est ce que je fais généralement...

    Etrange ce 0 en informatique, sans doute pour des raisons physiques par rapport à l'électronique à l'origine, parce que moi en math, certes je n'ai pas été bien loin, mais le 0 c'était un neutre, pas un positif ... Mais bon, toute l'informatique est comme ça, faut faire avec, où ça devient difficile c'est quand certaines commandes commencent à 0 et d'autre à 1, parfois on se fait avoir ; remarques, désormais vbNet sur ce point est positif, il commence souvent à 1, dont les objets. Preuve que s'ils faisaient une norme internationale pour tout commencer à 1 (ça peut arriver), ben ce serait plus clair et "pluce" logique comme dirait mon chat...

    A part ça et pour répondre, c'est vrai que je lis très mal, je suis un mauvais observateur immédiat, même les romans que je lis souvent ne m'apportent pas l'orthographe, car je passe sur le mot pour le comprendre sans le détailler, et souvent, on ne se rend pas compte, mais un bout du mot suffit pour le comprendre. Par exemple tu lis "Corélig", souvent, inconsciemment ton œil passe au mot suivant, car ton cerveau connaissant le mot a complété tout seul plu rapidement que l'œil ne lui envoie (association), ben je suis de ceux là, j'ai une mauvaise lecture, ce qui explique pourquoi, parfois je réponds complètement à côté avec assurance et de bonne foi ; idem, je fais plein de fautes d'inattention ou de frappe (parfois d'orthographe en minorité), et je ne les vois même pas sans une fastidieuse lecture syllabique, et encore... Bon, je vais aller voir un vétérinaire, j'en profiterai quand j'apporte ma chatte tous les ans pour les vaccins :o)

    In fine aurait dit César, il y a aussi les titres (titulus) des questions, certains présentent peu de perspicacité pour résumer leur question, ce qui fait que le corps (corpus) est totalement différent du titre (titulus non corpus est : "tituluce none corpuce este"), et évidemment, moi je démarre sur le titre, car c'est d'après lui que je présume savoir ou pas répondre. Mais le corps de la question réserve dès fois des surprises par rapport au titre ; ou encore, je crois avoir compris le sujet et je suis totalement à côté de la plaque, souvent par méconnaissance suffisante d'un objet, d'une procédure particulière.

    Ce serait aussi assez bien qu'ils nous mettent un correcteur sur le forum !

    Bon, mon père, j'ai tout confessé de mes tares, ce qui nous laisse une chance puisque je suis lucide, moi, mon plaisir c'est la vraie programmation de base, le code, chercher une solution par le code, c'est grisant  ...

    Au plaisir, cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    samedi 4 septembre 2010 06:53
  • Hello,

    pour ce qui est de commencer à 0 ou à 1, l'explication est assez simple en fait.

    Prenons le mot "PROGRAMME".

    On peut voir la lettre "P" comme (au choix):

    - La première lettre, donc la lettre Numéro 1, donc la lettre à la POSITION = 1

    - La lettre se trouvant a une distance de zéro par rapport au début du mot, donc la lettre au DEPLACEMENT (offset en anglais) = 0

    Les 2 approches sont valables.

     

    Maintenant pourquoi le zéro est il plus fréquemment employé?

    Quand tu demandes de la mémoire au système d'exploitation (pour un tableau par exemple), il te renvoie une adresse (mémoire) avec la garantie que tu peux écrire à cet endroit la quantité de données que tu as demandé.

    Supposons que tu demandes 5 octets, et que le système te renvoie l'adresse M.

    Tu peux écrire à l'adresse M+0, M+1, M+2, M+3 et M+4. Tu as bien 5 cases mémoire, la première à M et la dernière à M+4. 

    C'est tout simple.

    En C, si on déclare un tableau de caracteres:

    char tableau[5];

    on peut donc écrire dans tableau[0], tableau[1], ..., tableau[4]. C'est extrèmement logique.

     

    Pour le langage Basic, censé être plus simple et s'adresser (aussi) à des gens ne connaissant pas les finesses de l'allocation mémoire, on a convenu que lorsque l'utilisateur veut un tableau de 5, il écrit par exemple:

    Dim Tableau(5) as Integer

    Et qu'il est autorisé à écrire dans Tableau(1), Tableau(2), ..., Tableau(5).

    En réalité, la déclaration précédente permet aussi d'écrire dans Tableau(0) : les gens qui ont écrit les compilateurs et interpréteurs ont fait simple: Ils demandent simplement un emplacement de plus, permettant d'adresser de 0 à N et non pas N-1.

     

    En gros, ils transforment ceci:

    Dim Tableau(5) as Integer

    En cela:

    Tableau = (int) malloc( (5 + 1) * sizeof(int));

     

    Voila voila ...

     

    Bon après-midi !

     

    Cordialemement, 

    JM

     

     

     

     

     

     

     


    Jean-marc
    samedi 4 septembre 2010 12:13
  • Bonjour Jean-marc Noury,
    Le 04/09/2010 14:13, Jean-marc Noury a écrit :

    Hello,

    [...]



    Pour le langage Basic, censé être plus simple et s'adresser (aussi) à des gens ne connaissant pas les finesses de l'allocation mémoire, on a convenu que lorsque l'utilisateur veut un tableau de 5, il écrit par exemple:

    Dim Tableau(5) as Integer

    Et qu'il est autorisé à écrire dans Tableau(1), Tableau(2), ..., Tableau(5).

    En réalité, la déclaration précédente permet aussi d'écrire dans Tableau(0) : les gens qui ont écrit les compilateurs et interpréteurs ont fait simple: Ils demandent simplement un emplacement de plus, permettant d'adresser de 0 à N et non pas N-1.



    En gros, ils transforment ceci:

    Dim Tableau(5) as Integer

    En cela:

    Tableau = (int) malloc( (5 *+ 1*) * sizeof(int));



    Voila voila ...

    Et si j'ai indiqué :
       Option Base 1

    en début de code ? ;-)

    que je combine en cochant 'Supprimer les contrôles de limites des tableaux', dans les optimisation avancées de compilation ?

    et que je fais référence à
       Tableau(0)

    que se passe t-l avec l'exécutable ?

    Bon, d'accord, faut le faire exprès ;-)

    Mais bien qu'en se voulant plus simple, il y a des options, certes peu utilisées, avec lesquelles on peut obtenir d'aussi beaux crash qu'en C.



    Cordialement,

    Jacques.


    Cordialement, Jacques
    samedi 4 septembre 2010 15:57
  • Merci Jean-Marc,

    Oui en VB

    x(5)

    Ne signifie pas 5 mais de 0 à 5 = 6

    Sinon, certes j'ai bien compris qu'à l'origine on numérotait de 0, mais c'est juste une convention, on aurait commencé à 1 que mieux ce fut.

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    samedi 4 septembre 2010 17:01
  • Salut Jacques,

    En écrivant mon petit message, je pensais à Option Base 1 et à la suppression de contrôle de bornes... Je me suis dit: ne compliquons pas les choses :-)

    A part ça, par cusriosité, j'ai fait ça:

    Option Base 1

     

    Private Sub Form_Load()

    Dim i As Integer

    Dim t1(5) As Integer

    Dim t2(5) As Integer

    Dim t3(5) As Integer

    Dim s As String

     

        For i = 0 To 5

            t1(i) = 42 + i

            t2(i) = 666 + i

            t3(i) = 2010 + i

        Next i

     

        For i = 0 To 5

            s = s & t1(i) & ", " & t2(i) & ", " & t3(i) & vbCrLf

        Next i

        MsgBox s

    End Sub

     

    compilé avec Remove Check Bounds.

     

    Ca s'exécute sans problèmes et ça affiche les bonnes valeurs (pas de buffer overflow, pas de variables de l'un dans l'autre etc.)

    A mon avis, même avec Option Base 1, ils allouent N+1 pour une demande de N :-)

     

    (je trouve que cette Instruction Option Base est une vraie connerie, entre nous. Alors que bien sur, la construction Dim t(1 to 6) ne me semble pas mal - elle existe d'ailleurs dans pas mal de langages de très haut niveau type ADA).

     

    Cordialement,

     

     


    Jean-marc
    samedi 4 septembre 2010 17:59
  • addendum: par contre bien sur, le même programme mais en écrivant de 0 à 16 (dans des tableaux de 5) provoque un magnifique crash, aussi joli qu'un crash d'un programme C, évidemment :-)

     


    Jean-marc
    samedi 4 septembre 2010 18:06
  • Le 04/09/2010 20:06, Jean-marc Noury a écrit :

    addendum: par contre bien sur, le même programme mais en écrivant de 0 à 16 (dans des tableaux de 5) provoque un magnifique crash, aussi joli qu'un crash d'un programme C, évidemment :-)

    Le petit contrôle que j'ai fait était sur un tableau de String, et la référence à l'indice 0 crashe tout de suite.

    Les allocations mémoires dynamiques seraient elle un peu plus sensibles ?

    Par ailleurs, bien que cela déborde un peu du sujet, il n'y a pas en VB l'équivalent du
       #pragma pack (n)

    concernant l'alignement des allocations mémoires sur l'architecture de la machine, mais cet aspect n'est peut être pas anodin. Pour un tableau d'entier sous un OS 32 bits, les éléments sont ils alignés sur des adresses multiple de 2 ou de 4. Je dirai, par défaut, de 4 ce qui fait que la mémoire alloué est le double de celle nécessaire, au profit de la vitesse. Ensuite suivant la manière d'y accéder, hors aspect langage,
    indice ou pointeur, on plante, on plante pas, ça fait n'importe quoi, au pire ça marche ...



    Cordialement,

    Jacques.


    Cordialement, Jacques
    dimanche 5 septembre 2010 11:32
  • Hello Jacques,

    Concernant l'alignement, un petit test que j'ai fait va dans ton sens:

    J'alloue un tableau de 1 int;

    Dim t1(1) As Integer

    1) J'écris aux indices 0 - 4 : PAS de problème

    2) J'écris à l'indice 5 : CRASH (crash non pas à l'exécution, mais en sortie de programme (donc probablement corruption du stack d'exécution, à vue de nez).

    Difficile de deviner comme ça exactement ce qui se passe - On doit pouvoir s'amuser comme des petits fous en jouant avec VarPtr, StrPtr et tout ça, comme ici par exemple : http://www.thevbzone.com/secrets.htm#VarPtr

    Et comme tu le dis, c'est ici comme en C : à partir du moment où on écrit la ou on n'est pas supposé le faire, le comportement est totalement imprédictible (raison pour laquelle j'aime le C : on ne s'ennuie jamais, même avec plus de 20 ans de pratique!!)

    Bonne soirée !

    JM

     


    Jean-marc
    dimanche 5 septembre 2010 18:46