Créer un évènement.

cs_nicolee Messages postés 8 Date d'inscription mardi 28 novembre 2006 Statut Membre Dernière intervention 9 mars 2007 - 7 mars 2007 à 16:33
cs_nicolee Messages postés 8 Date d'inscription mardi 28 novembre 2006 Statut Membre Dernière intervention 9 mars 2007 - 9 mars 2007 à 10:26
Bonjour,
  Un fonction timer met à jour une variable publique sous certaines conditions(suivant d'autres variables publiques). Je souhaite que cette mise à jour déclenche une function. Mais je ne souhaite pas faire un call depuis le timer, car si la fonction appellée prend trop de temps à être exécutée, ça pourrait merder (on retenterai de re-rentrer dans la fonction timer, qui rappellerai la function etc etc, explosion de pile).
  Je suis un parfait débutant en VB. Puis-je créer un évènement à ma convenance? Un clic sur un bouton c un évènement qui appelle une fonction bouton_click() par exemple. Puis-je fabriquer un évènement qui fera que lorsque la variable "var" changera de valeur (ou est TRUE ou autre), cela lancera un function ou une procédure change_var par exemple?
  Ou bien j'ai rien compris?

Merci d'avance

Nicolas

9 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
7 mars 2007 à 16:45
Salut,
Tu peux passer par un contrôle utilisateur qui pourra générer lévénement souhaité que tu capteras ensuite depuis la Feuille ou il est inséré.

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_nicolee Messages postés 8 Date d'inscription mardi 28 novembre 2006 Statut Membre Dernière intervention 9 mars 2007
7 mars 2007 à 16:51
hello,
merci, mais je ne sais ni ce qu'est un "controle utilisateur", ni comment "capter" un "évènement".
je suis un débutant, un vrai de vrai 
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 mars 2007 à 18:16
Bonjour,

Une mise au point, avant tout, on ne "crée" pas un événement ! On le subit...Ne pas confondre les instructions que l'on demande d'exécuter l'ors de la survenue d'un événement avec un événement...

Dans ton affaire, tu veux faire en sorte que lorsqu'une variable voir sa valeur modifiée et sous certaines conditions, une fonction ou une routune de ton choix s'exécute.
Tu n'as popur celà nul besoin d'un timer. Ta variable, en effet, ne se modifie pas de façon "spontanée", n'est-ce-pas ? tu sais donc quand elle a été modifiée et quand, donc, procéder à la vérification de tes conditions, vérification qui conduira ou non à l'appel de ta fonction ou de ta routine.


Tu crains par ailleurs que pendant cette exécution, un geste de l'utilisateur ne la déclenche à nouveau, alors qu'elle est déjà en cours.


Les solutions ne manquent pas !  En voilà 2 :


1) tu sais ce que doit faire cette fonction ou routine : il te suffit alors de mettre en début de ta fonction une condition d'exécution en fonction de l'effet attendu de ses instructions. Umaginons par exemple que les instructions à exécuter modifient une variable. Tu vides cette variable avant l'appel de la fonction ou routine et, en 1ère instruction de ta fonction ou routine, abandon si la variable contient quelquechose, puis, en 2ème ligne, attribution d'une valeur arbitraire de ton choix à cette variable. De la sorte, elle ne risquera jamais d'être lancée 2 fois...

2) tu utilise une variable booléenne globale. A l'appel de ta fonction, tu lui donne la valeur False. En 1ère instruction ; abandon si True. en 2ème instruction : mettre cette variable booléenne à True.

Comme tu peux le voir, ul ne s'agit pas là de code mais de stratégie à définir.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 mars 2007 à 19:14
quel barbare ce jmfmarques

malheureusement, c'est tout à fait vrai.
traduisons pour un débutant.

contrôle utilisateur : c'est un contrôle personnel. comme une picturebox, une textbox etc.. mais de toi
jrivet propose cette solution parce qu'elle est très facile à mettre en oeuvre, et que tu peux poser ton timer sur le usercontrol ; c'est un conteneur graphique et supporte donc d'autres contrôles.
il est possible de faire (presque) la même chose avec un module de classe qui est aussi un objet.

le fonctionnement est simpliste est le suivant :
ton objet a une propriété (comme ta variable public)
lorsqu'elle est modifiée, le usercontrol le sait (sans passer par un timer)
et tu peux générer un évènement (que tu déclares)

çà donne :

Option Explicit
Dim mMaVariable As Long
Public Event MaVariableEstModifiee()

Public Property Get MaVariable() As Long
    MaVariable =  mMaVariable
End Property
Public Property Let MaVariable(Value As Long)
    If mMaVariable <> Value Then
        mMaVariable = Value
        RaiseEvent MaVariableEstModifiee
    End If
End Property

Private Sub UserControl_Initialize()
    mMaVariable = 0
End Sub

<small>Coloration
syntaxique automatique [AFCK] </small>
       

ce contrôle posé sur une form, l'évènement se déclenche :

Option Explicit

Private Sub Command1_Click()
    Test1.MaVariable  = Test1.MaVariable + 1
End Sub

Private Sub Test1_MaVariableEstModifiee()
    MsgBox Test1.MaVariable
End Sub

<small>Coloration
syntaxique automatique [AFCK]</small>
       

c'est précisément ce que jmfmarques indique : pas besoin de timer

tu peux faire çà sous forme de module de classe (instanciée en public), ou de usercontrol. dans ce dernier cas, les autres forms ou modules devront prénommer le usercontrol :

Form1.Test1.MaVariable = 95

++
PCPT   [AFCK]
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0

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

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 mars 2007 à 19:16
woups j'y pense, pas d'évènement dans un module donc pas d'évènement si c'est sous forme de module de classe public ^^
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 mars 2007 à 20:30
   Salut, PCPT,

   Je ne cesserai jamais d'admirer tes approches....


   Je te suis personnellement reconnaissant d'avoir exposé celle-ci, de cette façon là ....et prie pour qu'elle soit comprise.

   Je prie également pour que chaque débutant commence par l'étude de certains aspects et définitions qui ne sont pas seulement essentiels. Ils conditionnent tout simplement non seulement la compréhension de tout le reste, mais également la mise en oeuvre de stratégies qui peuvent être diverses mais ont toujours un point commun : l'utilisation de ce qui est clair dans l'esprit du développeur.

   Je prie enfin et surtout pour que soient de plus en plus nombreux ceux qui exposent des stratégies plutôt que d'offrir une solution prête à être dégustée (tu viens, en ce qui te concerne, d'éviter d'offrir le "plat tout cuit", donnant la préférence à l'exposé du mécanisme. Voilà exactement ce qui justifie la formulation de ma reconnaissance et de mon amitié renouvelée.

  Jacques


 
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 mars 2007 à 20:52
merci pour cet hommage
(je n'ai pas toujours le temps ou la volonté... le "tout cuit" est moins bénéfique mais est parfois la seule solution. par chance pas le cas ici)

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 mars 2007 à 21:03
nicolee
-> à noter que le principe de propriété (voir code fourni) est valable pour un simple module.
selon le reste du code tu peux remplacer le RaiseEvent... par une fonction ou procédure

++
0
cs_nicolee Messages postés 8 Date d'inscription mardi 28 novembre 2006 Statut Membre Dernière intervention 9 mars 2007
9 mars 2007 à 10:26
Bonjour,
 merci pour toutes ces explications, merci PCPT, on sent bien qut tu veux faire comprendre les choses.


Pour ma part, les qq heures de POO à l'école sont très loins derrières (s'il s'agit bien de POO). Je crois comprendre la philosophie de la solution proposée, mais je ne sais pas que je vais choisir cette solution:
  primo ça demande un peu de temps pour s'y pencher et je n'en ai pas.
  deusio, ce soft sera à faire évoluer par un gars qui n'y connait rien en POO, et pas grand chose en Basic.
Je voudrai rentrer le moins possible dans ce genre de choses. J'avais penser qu'il y aurai une solution tout de suite compréhensible pas simple lecture (ça l'est peut etre pour des personnes familieres avec vb, pas pour moi).

J'ai donc trouver (on verra par la suite si elle suffit) une autre solution pour arriver à mes fins, on verra par la suite si elle suffit

merci en tout cas, je n'hésiterai à revenir sur ce forum si besoin

nciolee
0
Rejoignez-nous