Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Simuler un Cancel

13 réponses
Avatar
jerome
Bonjour,

J'ai une procédure dans un formulaire de type

Private Sub myField_Validate(cancel As Boolean)

... controle des données saisies
...et dans certains cas message d'erreur
Cancel = True

end sub

Dans ce cas la valeur saisie est effacée et le curseur se repositionne sur
le champ.

Mais si je veux écrire une procédure Public en passant comme paramètre
myField comment faire pour le Cancel = True ?
J'ai essayé en testant le résultat du style if... then Cancel = True mais ça
ne fonctionne pas

Merci

10 réponses

1 2
Avatar
LE TROLL
Bonjour,

Oui, la déclaration est locale, en plus il me
semble que sa réagit comme une sorte de mots-clef,
qu'on ne peut définir ?

Par contre, ce que parfois je fais, c'est une
variable à la feuille, qui a un état, et qui prend
le second état en cas où la condition soit réunie,
ainsi, quand elle arrive dans le cancel par
exemple, ben tu testes le cancel, et s'il n'a
rien, tu testes l'autre variable pour savoir quoi
faire...

--
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"jerome" a écrit dans le message de
news: %
| Bonjour,
|
| J'ai une procédure dans un formulaire de type
|
| Private Sub myField_Validate(cancel As Boolean)
|
| ... controle des données saisies
| ...et dans certains cas message d'erreur
| Cancel = True
|
| end sub
|
| Dans ce cas la valeur saisie est effacée et le
curseur se repositionne sur
| le champ.
|
| Mais si je veux écrire une procédure Public en
passant comme paramètre
| myField comment faire pour le Cancel = True ?
| J'ai essayé en testant le résultat du style
if... then Cancel = True mais ça
| ne fonctionne pas
|
| Merci
|
|
Avatar
Fred
Dans : news:%,
jerome disait :
Bonjour,



Bonjour,

J'ai une procédure dans un formulaire de type

Private Sub myField_Validate(cancel As Boolean)

... controle des données saisies
...et dans certains cas message d'erreur
Cancel = True

end sub

Dans ce cas la valeur saisie est effacée et le curseur se
repositionne sur le champ.

Mais si je veux écrire une procédure Public en passant comme paramètre
myField comment faire pour le Cancel = True ?
J'ai essayé en testant le résultat du style if... then Cancel = True
mais ça ne fonctionne pas



De mémoire, VB6 ne permet pas de faire ce que tu veux.

La procédure myField_Validate est automatiquement attachée à l'évènement
Validate du contrôle myField par le compilateur en fonction de son nom.

Peut être une solution en procédant de la manière suivante :

Private Sub myField_Validate(cancel as Boolean)
my_Validate(myField, cancel)
End Sub

Private Sub my_Validate(ctl as Control, cancel as Boolean)
'.......
End Sub

Il faudra tout de même avoir une procédure Validate par contrôle (sauf à
utiliser des tableaux de contrôle).

Pourquoi la procédure de traitement générique doit-elle être publique ?
C'est nécessaire pour l'appeler de l'extérieur mais, en général, on
n'appelle pas une procédure de gestion d'évènement.

J'espère avoir correctement interprété la question !

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
jerome
"Fred" wrote in message
news:uevN$
Dans : news:%,
jerome disait :
> Bonjour,

Bonjour,

> J'ai une procédure dans un formulaire de type
>
> Private Sub myField_Validate(cancel As Boolean)
>
> ... controle des données saisies
> ...et dans certains cas message d'erreur
> Cancel = True
>
> end sub
>
> Dans ce cas la valeur saisie est effacée et le curseur se
> repositionne sur le champ.
>
> Mais si je veux écrire une procédure Public en passant comme paramètre
> myField comment faire pour le Cancel = True ?
> J'ai essayé en testant le résultat du style if... then Cancel = True
> mais ça ne fonctionne pas

De mémoire, VB6 ne permet pas de faire ce que tu veux.

La procédure myField_Validate est automatiquement attachée à l'évènement
Validate du contrôle myField par le compilateur en fonction de son nom.

Peut être une solution en procédant de la manière suivante :

Private Sub myField_Validate(cancel as Boolean)
my_Validate(myField, cancel)
End Sub

Private Sub my_Validate(ctl as Control, cancel as Boolean)
'.......
End Sub

Il faudra tout de même avoir une procédure Validate par contrôle (sauf à
utiliser des tableaux de contrôle).

Pourquoi la procédure de traitement générique doit-elle être publique ?
C'est nécessaire pour l'appeler de l'extérieur mais, en général, on
n'appelle pas une procédure de gestion d'évènement.




Bonjour,

La procédure de traitement est déclarée publique car le traitement en
question contrôle la validité de saisie de dates (format de saisie, bornes
de saisies, etc, etc...)
Et comme elle est appelée dans plusieurs formulaires je souhaiterais une
fonction publique dans laquelle je passe juste le paramètre
Me.ActiveControl.Text et qu'ensuite les contrôles soient effectués.
Avec le Cancel = true en cas de saisie incorrecte .

Mais, peut être y a t-il une autre manière d'arriver au même résultat ?

Merci.
Avatar
Fred
Dans : news:,
jerome disait :

La procédure de traitement est déclarée publique car le traitement en
question contrôle la validité de saisie de dates (format de saisie,
bornes de saisies, etc, etc...)
Et comme elle est appelée dans plusieurs formulaires je souhaiterais
une fonction publique dans laquelle je passe juste le paramètre
Me.ActiveControl.Text et qu'ensuite les contrôles soient effectués.
Avec le Cancel = true en cas de saisie incorrecte .



Si nous sommes bien d'accord que c'est l'évènement Validate de chacun
des contrôles qui appelle ce contrôle de validité alors la solution que
j'ai proposée devrait faire l'affaire (en Public plutôt que Private dans
ce cas).
Il n'y a en effet que dans ce cas que le booléen Cancel sera pris en
compte.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
jerome
"Fred" wrote in message
news:O5qgm%
Dans : news:,
jerome disait :

> La procédure de traitement est déclarée publique car le traitement en
> question contrôle la validité de saisie de dates (format de saisie,
> bornes de saisies, etc, etc...)
> Et comme elle est appelée dans plusieurs formulaires je souhaiterais
> une fonction publique dans laquelle je passe juste le paramètre
> Me.ActiveControl.Text et qu'ensuite les contrôles soient effectués.
> Avec le Cancel = true en cas de saisie incorrecte .

Si nous sommes bien d'accord que c'est l'évènement Validate de chacun
des contrôles qui appelle ce contrôle de validité alors la solution que
j'ai proposée devrait faire l'affaire (en Public plutôt que Private dans
ce cas).
Il n'y a en effet que dans ce cas que le booléen Cancel sera pris en
compte.

--



Bonjour,

J'avoue ne pas réussir à écrire la procédure. Selon mes différents essais,
j'ai divers messages d'erreur.
Si j'écris

Private Sub myField_Validate(cancel as Boolean)
my_Validate(myField, cancel)
End Sub

Public Sub my_Validate(ctl as Control, cancel as Boolean)
'.......
End Sub

J'ai un message d'erreur sur le my_Validate (myField, cancel)
"Erreur de compilation
Attendu : ="

Comme si il attendait une valeur de retour. Et, évidemment dans ce cas le
Public Sub my_Validate doit être une fonction.
De plus je ne sais pas comment tester le cancel.
Donc... je suis perdu.

Ce que je souhaite faire, par exemple c'est
Un controle de type date
Avec

Private Sub myDate_Validate(cancel as booleen)
ControleDate(myDate)
end sub

Et la procédure (ou fonction je ne sais pas)
ControleDate

Public Sub ControleDate(myDate)
' avec comme une des conditions (mais il y en a d'autres)
if myDate>Now() then
msgbox "Date supérieur à la date du jour"
Cancel = true (mais je ne sais pas comment l'écrire)
exit sub
end if

' d'autres contrôles
...

' Et si tout se passe bien, la valeur saisie est affichée correctement
myDate= Format(myDate"dd/mm/yyyy")

end sub


Merci encore
Avatar
jean-marc
> Bonjour,

J'avoue ne pas réussir à écrire la procédure. Selon mes différents essais,
j'ai divers messages d'erreur.
Ce que je souhaite faire, par exemple c'est


<snip>

Hello,

Rien de compliqué à priori.
Il n'est nul besoin de balader le Cancel puisque
le but est de vérifier une condition puis en
fonction de cette condition de prendre une décision
localement.

L'idée est donc dans Validate() d'appeler une fonction
de vérification (externe et autonome) et de prendre
la décision *localement* (et donc de changer le
cancel *localement* aussi).

Tu écris donc ceci: (text1) est le champ de type date à vérifier:

Private Sub Text1_Validate(Cancel As Boolean)
Dim s As String
Dim ret As Boolean

s = Text1.Text
ret = checkDate(s)
If ret Then
' tout va bien, la date est "valide"
Text1.Text = Format$(s, "dd/mm/yyyy")
Else
' probleme, date invalide
MsgBox "Date Invalide"
Text1.Text = ""
Cancel = True
End If

End Sub

Private Function checkDate(ByVal aDate As String) As Boolean

If CDate(aDate) > CDate(Now) Then
checkDate = False
Else
checkDate = True
End If
End Function

Et voila, ça marche et ça fait exactement ce que tu souhaites.

Qui plus est ce design est bon, car tu as écrit une fonction
booléeene CheckDate() qui fait uniquement ce qu'elle doit
faire, qui est réutilisable et *surtout* qui est indépendante
de l'interface (règle N°1 : pas de couplage fonction/interface).

Espérabt que cela t'aide,

Cordialement,


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Fred
Dans : news:OHD$,
jerome disait :

J'ai un message d'erreur sur le my_Validate (myField, cancel)
"Erreur de compilation
Attendu : ="



Oui, ça c'est parce que j'ai oublié qu'on ne met pas de parenthèses pour
un appel de procédure !!
Je vois la solution de Jean-Marc qui suggère à raison de découpler
interface et fonction.
Si j'ai bien compris ton problème, ta solution est un composé de nos
deux solutions. Tu mutualises ta procédure évènementielle comme je l'ai
écrit (mais sans les parenthèses :-) ). Et tu prends soin de décomposer
ton traitement pour ne pas mélanger les MsgBox avec des instructions de
vérification de la cohérence des données.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
Patrice Henrio
Jean Marc ne crois-tu pas que l'écriture suivante permettrait une
affectation de cancel plus dans l'esprit du traitement ?

Private Sub Text1_Validate(Cancel As Boolean)
Dim s As String
'Dim ret As Boolean
s = Text1.Text
cancel = not(checkDate(s))
If cancel Then
' probleme, date invalide
MsgBox "Date Invalide"
Text1.Text = ""
Else
' tout va bien, la date est "valide"
Text1.Text = Format$(s, "dd/mm/yyyy")
End If


"jean-marc" a écrit dans le message de news:
472872a0$0$22312$
Bonjour,

J'avoue ne pas réussir à écrire la procédure. Selon mes différents
essais,
j'ai divers messages d'erreur.
Ce que je souhaite faire, par exemple c'est


<snip>

Hello,

Rien de compliqué à priori.
Il n'est nul besoin de balader le Cancel puisque
le but est de vérifier une condition puis en
fonction de cette condition de prendre une décision
localement.

L'idée est donc dans Validate() d'appeler une fonction
de vérification (externe et autonome) et de prendre
la décision *localement* (et donc de changer le
cancel *localement* aussi).

Tu écris donc ceci: (text1) est le champ de type date à vérifier:

Private Sub Text1_Validate(Cancel As Boolean)
Dim s As String
Dim ret As Boolean

s = Text1.Text
ret = checkDate(s)
If ret Then
' tout va bien, la date est "valide"
Text1.Text = Format$(s, "dd/mm/yyyy")
Else
' probleme, date invalide
MsgBox "Date Invalide"
Text1.Text = ""
Cancel = True
End If

End Sub

Private Function checkDate(ByVal aDate As String) As Boolean

If CDate(aDate) > CDate(Now) Then
checkDate = False
Else
checkDate = True
End If
End Function

Et voila, ça marche et ça fait exactement ce que tu souhaites.

Qui plus est ce design est bon, car tu as écrit une fonction
booléeene CheckDate() qui fait uniquement ce qu'elle doit
faire, qui est réutilisable et *surtout* qui est indépendante
de l'interface (règle N°1 : pas de couplage fonction/interface).

Espérabt que cela t'aide,

Cordialement,


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;










Avatar
jean-marc
"Patrice Henrio" wrote in message
news:
Jean Marc ne crois-tu pas que l'écriture suivante permettrait une
affectation de cancel plus dans l'esprit du traitement ?

Private Sub Text1_Validate(Cancel As Boolean)
Dim s As String
'Dim ret As Boolean
s = Text1.Text
cancel = not(checkDate(s))
If cancel Then
' probleme, date invalide
MsgBox "Date Invalide"
Text1.Text = ""
Else
' tout va bien, la date est "valide"
Text1.Text = Format$(s, "dd/mm/yyyy")
End If




Hello Patrice,

Si, ca le ferait, et même très bien :-))

Je trouve ça moins lisible, mais c'est purement personnel :-)

Il faut dire que je suis conditionné à écrire du code
qui va être lu et potentiellement modifié par beaucoup
de personnes, ce qui fait que j'écris automatiquement du
code le plus lisible et facile à débugger possible.

Je n'hésite donc pas à multiplier les variables et à écrire
de façon vraiment séquentiel, afin que le code puisse être
auto-documenté. Je me dis aussi que c'est le boulot du
compilateur de faire ce genre d'optimisations :-)

A++

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;




Avatar
jerome
"Fred" wrote in message
news:
Dans : news:OHD$,
jerome disait :

> J'ai un message d'erreur sur le my_Validate (myField, cancel)
> "Erreur de compilation
> Attendu : ="

Oui, ça c'est parce que j'ai oublié qu'on ne met pas de parenthèses pour
un appel de procédure !!
Je vois la solution de Jean-Marc qui suggère à raison de découpler
interface et fonction.
Si j'ai bien compris ton problème, ta solution est un composé de nos
deux solutions. Tu mutualises ta procédure évènementielle comme je l'ai
écrit (mais sans les parenthèses :-) ). Et tu prends soin de décomposer
ton traitement pour ne pas mélanger les MsgBox avec des instructions de
vérification de la cohérence des données.




J'aurais préféré utiliser la procédure qu'une fonction car je n'aurais eu à
mettre qu'une ligne d'appel par zone à contrôler alors qu'avec la fonction
ça fait quand même un petit bloc par zone.

Mais, d'une part je n'arrive pas à faire fonctionner correctement l'appel à
la procédure (en fait le cancel ne fait rien) Je peux toujours réinitialiser
le champ dans la procédure mais je ne vois pas comment lui redonner le
focus.

Pour ce qui est de mélanger les MsgBox avec les instructions de
vérification, j'en ai besoin car selon l'erreur le message n'est pas le
même.

Merci à tous.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)



1 2