Doevent??? Option ???

Résolu
Signaler
Messages postés
101
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
8 septembre 2010
-
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
-
Salut, ca fait plusieurs fois que je vois Doevent et Option quelque chose en vb et je me demandais ce que ca voullais dire. Si quelqu'un pouvais me l'expliquer svp (si possible, me dire la différence entre option explicite, base, compare et private). Jamais trop pour apprendre... Et tant ka y être, dsl, je suis pas très bon en vb, activex, c'est quoi et a quoi ca sert? Merci à l'avance

11 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
AbriBus j'ai l'impression que tu confond boucle bloquante et boucle
infinie, ce que tu décrit est une boucle bloquante, une boucle infinie
est une boucle qui n'a pas de condition de sortie, ex:



Do

.....

Loop while 1



Au sujet des variables tu t'es mélangé les pinceaux aussi



Pour reprendre :

DoEvents : rend la main au système pour traiter les autres évènements

Do

....

Loop condition

c'est bloquant, ton prog ne fait plus faire que le code à l'intérieur de ta boucle.

Do


....

DoEvents


Loop condition

c'est pas bloquant, ton prog est capable de traiter les autres
évènement comme un click de souris ou un timer même s'il reste à
tourner dans ta boucle un moment.



Option Explicit

Sans , tu peux utiliser tes variables sans les déclarer et sans même leur donner un type

Avec, toutes les variables utilisées doivent au préalable être déclarer et typer :

Dim i as integer, toto as variant .....

Personellement Option Explicit n'est pas une option c'est une OBLIGATION et une NECESSITE.

Option Base
correspond je crois (de mémoire) au numéro (0 ou 1) que porte le
premier élément d'un tableau (ex: en C c'est toujours 0, en VB on peut
choisir mais ça influe sur la déclaration de la taille du tableau).

Option Compare détermine la
façon dont sont comparer les chaines de caractère (Text : comparaison
au niveau de la lettre, Binary : comparaison au niveau du code
hexadécimal me semble-t-il) voir l'aide pour plus de édtail, c'est une
option que je n'utilise pas.



Private sert à déclarer les
variable globales de type privé, elle ne sera visible uniquement qu'a
l'interieur de la form ou du module ou elle est déclarée. Avec Public
par contre, elle sera visible par tout le programme.



En espérant avoir été assez clair
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Effectivement, il n'y a qu'en VB à ma connaissance (mais je ne connais
pas tout non plus) que l'on peut ou non utiliser Option Explicit. En C
par exemple il obligatoire de préalablement déclarer les variables.
Option Explicit comme tu dis AbriBus est une "obligation" de bon
programmeur, ça evite de faire n'importe quoi (comme dans ton exemple)
et surtout de bien réfléchir à l'utilisation des tes variables et
finalement quelque part à la construction de ton prog.



Quand aux boucles bloquantes, ta remarque est judicieuse, mais
personnellement je m'assure toujours que ma condition de sortie se
réalise toujours dans mes boucles même bloquantes, en par exemple dans
des cas particuliers, rajouter un timeout dans la condition



Quand j'ai dis que tu te mélangais les pinceaux, ce n'était pas méchant c'est juste que dans ton premier post tu dis :

j = 3 'Va génerer une erreur en présence du DoEvent

et en fait il fallait comprendre :


j = 3 'Va génerer une erreur en présence du Option Explicit

c'est évident pour moi, mais pas forcement pour d'autre effectivement, désolé



D'ailleurs dans ton 3eme post tu mélange encore DoEvent avec Option
Explicit : que ta source fonctionne sans DoEvent je n'ai rien contre
bien au contraire et Option Explicit n'est pour rien dans l'affaire.
Par contre que la variable i serve d'integer puis de caractère dans la même procédure,
ça me plait déjà moins sur le principe, et là Option Explicit est
effectivement utile (mais rien n'empeche de mettre un caractère dans un
integer et même dans ce cas précis il ne doit pas y avoir d'erreur, par
contre mettre une chaine de caractère dans un integer, ça ne passe pas avec Option Explicit)



D'ailleur au passage, on m'a toujours dit que un code avec un DoEvent
était un mauvais code, le DoEvent n'est là que pour cacher une mauvaise
gestion des boucles ou un bug à retardement. Même si j'évite le plus
souvent, ça m'empeche pas de l'utiliser quelque fois.



C'est plus post tout ça c'est un roman
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
MonEntier = Chr(97) ne marche pas toujours pour la même raison, Chr() retourne un type string.



Si tu veux mettre un caractère dans un integer passe par la fonction Asc() qui te retourne le code ascii de ton caractère.



Mais finalement on s'est pas mal éloigné du sujet de départ je crois, non



Je reviens un instant sur mes explications de Private de tout à
l'heure. Je parlais bien entendu du mot clé Private pour la déclaration
des variables.

Quant à toi cire2003 je pense que tu voulais parler de l' Option Private Module



Il s'agit en fait d'une option qui dit que toutes tes variables
publiques ne sont publique que pour le projet ou elles sont déclarées,
mais elles ne sont pas vues dans d'autres projets.

C'est du moins ce que j'ai compris de l'aide. M'en demande pas plus,
c'est une option que je ne connaisais pas jusqu'a aujourd'hui.



Comme quoi on en apprend tous les jours.
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
492
Date d'inscription
jeudi 28 août 2003
Statut
Membre
Dernière intervention
25 avril 2007
5
Bon, alors deja DoEvent est une fonction de Vb qui permet au systeme d'effectuer d'autres fonctions pendant qu'il realise la fonction ayant appeler le DoEvent .Par exemple, tu fait un prog qui fait une boucle tant qu'un evenement ne c'est pas réalisé (c'est pas propre mais ca illustre bien...), au debut de cette boucle, un DoEvent permetra au systeme de prendre en charge le click de la souris qui déclenchera l'interruption de la boucle (autrement ton CPU reste bloqué à 100% et il n'y a pas de partage des ressources systeme pour le reste on appelle ca une boucle infinie).
En ce qui concerne le Option, moi perso je ne l'utilise que dans un seul contexte "Option Explicit" qui demande au compilateur de vérifier lors de la compilation du projet (création du fichier .exe) de vérifier la DECLARATION de TOUTES les variables utilisées comme suit:

Dim i as Integer 'Déclaration de la variable i
i = 0 'Affectation de 0 à la variable de type Integer i
j = 3 'Va génerer une erreur en présence du DoEvent dans le header du programme principal

En l'absence de DoEvent, le compilateur fait automatiquement une déclaration de type variant (je crois) au moment de l'affectation ce qui, il me semble mais je peux me tromper sur ce dernier point prend plus de place que les autres types de donnees (voir la doc pour les details technique à "Type" si je ne m'abuse).

Je laisse le soin a quelqu'un d'autre de t'explique le reste qui ne serait probablement pas aussi detaillé venant de moi...

AbriBus...
Messages postés
492
Date d'inscription
jeudi 28 août 2003
Statut
Membre
Dernière intervention
25 avril 2007
5
bah oui mais... une bouble bloquante qui attend une condition qui ne se realisera jamais (parcequ'elle est bloquante précisement) devient un boucle infinie non ?

pour les variables... peut etre je me melange les pinceaux c'est possible (ca faisait partit des cours interressants mais monstrueusement barbant) toutefois, tu ne donne pas plus de détail que ca...

Bonne prog...

AbruBis...
(Toujours ouvert aux reflexions constructives )
Messages postés
492
Date d'inscription
jeudi 28 août 2003
Statut
Membre
Dernière intervention
25 avril 2007
5
PS: je suis d'accord pour le Option Explicit... d'ailleur, il me semble qu'il n'y a qu'en Vb que l'on peut instancier une variable sans la declarer préalablement (sans Option Explicit donc). C'est une cessessité pour eviter les bugs dans le programme et pour le rendre moins obscur a ceux qui le liront (j'ai vu une source qui fonctionnait sans DoEvent et l'auteur utilisait la fameuse variable i tantot pour un Integer dans une boucle, et un peu plus loin hors de la boucle comme un Caractère ) Avec Option Explicit, ce genre de blague est simplement impossible...
Messages postés
492
Date d'inscription
jeudi 28 août 2003
Statut
Membre
Dernière intervention
25 avril 2007
5
casy> héhé... t'as absolument raison... j'ai merdé entre DoEvent et Option Explicit... (probablement le manque de sommeil ). Désolé donc a ce sujet (A aucun moment je n'ai considéré ta remarque "méchante" bien au contraire, j'ai plaisir à apprendre et on apprend par ses propres erreurs. Merci donc pour la remarque de nature constructive donc).

De plus, je suis tout a fait d'accord avec toi a propos de ta derniere reflexion sur le DoEvent, il faut noter que cette fonction est peut etre la pour faciliter l'approche avec le coté Objet de Vb (suggestions?). En java par exemple, innutile d'utiliser un DoEvent dans une Thread car la Thread une fois lancée (meme en boucle bloquante), le programme principale poursuit son execution. Toujous est-il que c'est vrai que DoEvent dans un prog... c'est pas joli joli (mais ca reste parfois utile utile)

Bonne prog a tous...
Messages postés
492
Date d'inscription
jeudi 28 août 2003
Statut
Membre
Dernière intervention
25 avril 2007
5
par contre, désolé j'avais pas essayé avant le post précédent mais mettre un type Char dans une variable prévue pour acceuillir un Integer ne marche pas (ce qui me semble normal etant donné que ces deux type n'ont meme pas la meme taille)

Exemple:

Option Explicit


Private Sub Form_Load()
Dim MonEntier As Integer
MonEntier = "r" ' Erreur d'execution :13 Type incompatible
MsgBox "Valeur de mon entier: " & MonEntier
End Sub
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Et non AbriBus, ça ne marche pas.



Ce que tu met n'est pas un type char mais un type string cad une chaine
de caractère de longueur 1 et la effectivement ça ne marche pas.

par contre si tu essaye MonEntier = 'r' il se peut que ça marche (sans garantie, je n'ai pas fait l'essai)



Je ne voudrais pas dire de bétise mais il me semble que le type char
n'exite pas en VB il faut passer par type byte (cad octet) et la ça
rentre dans un integer (mot ou double octet)
Messages postés
492
Date d'inscription
jeudi 28 août 2003
Statut
Membre
Dernière intervention
25 avril 2007
5
ben il y a bien la fonction Chr(AscCod As Integer) qui renvoi le caractere correspondant (AscCod < 256) et avec
MonEntier = Chr(97) ' Erreur d'execution :13 Type incompatible
ca fait pareil...
Messages postés
101
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
8 septembre 2010

monentier est as Integer. tu ne peux donc pas mettre autre chose ke des chiffres dedans. Pour des lettres, c'est as String. Puis la, tu fait les transformations voulluent... s'il y en a.