vbnino
Messages postés218Date d'inscriptionjeudi 13 juillet 2006StatutMembreDernière intervention11 juillet 2010 23 mai 2007 à 20:11
Salut!
-Pour quoi il est long?
vbnino
Messages postés218Date d'inscriptionjeudi 13 juillet 2006StatutMembreDernière intervention11 juillet 2010 23 mai 2007 à 14:26
Merci
Cacophrene
Messages postés251Date d'inscriptionlundi 29 mars 2004StatutMembreDernière intervention 4 mars 20081 23 mai 2007 à 10:06
Salut !
D'abord désolé de prendre la discussion en cours... Pour ma part voici ce que je dirais :
Text1 : Renommer txtExpr (expression)
Text2 : Supprimer
Text3 : Renommer txtIncr (pas du tracé)
Text4 : Renommer txtEval (évaluation)
p : Renommer picArea (la zone de dessin)
p2 : Renommer picData (les données pour le tracé)
Command1 : Renommer cmdFast (tracé rapide)
Command2 : Renommer cmdSlow (tracé lent)
ça c'est pour y voir un peu plus clair. Conventions dans les noms : un préfixe qui indique le type de contrôle (txt : TextBox ; cmd : CommandButton) suivi d'un mot ou d'une abréviation qui s'efforce d'être claire (pour celui qui a codé comme pour ceux qui regardent le code plus tard).
Ensuite, on va réorganiser l'ensemble.
a) D'abord supprimer "Dim a, c, d" qui ne sert à rien, et écrire Option Explicit tout en haut. Déclarer hors procédure :
Dim MyScript As ScriptControl
Dim StrFonction As String
Dim Result
b) Créer une procédure destinée à tracer le repère (le code correspondant est réécrit 5 fois dans ton code !) :
Private Sub DrawAxes()
picArea.Line (picArea.ScaleLeft, 0)-(picArea.ScaleWidth, 0), vbBlue
picArea.Line (0, picArea.ScaleTop)-(0, picArea.ScaleHeight), vbBlue
End Sub
On remplace RGB(0, 0, 255) par vbBlue parce que c'est la même chose. Il y a des constantes prédéfinies, autant les utiliser.
c) Créer une procédure DrawFunction pour tracer la fonction et éviter la répétition du code dans cmdSlow_Click et cmdFast_Click. Par exemple :
Private Sub DrawFunction(Step As Double)
'Si un tracé a déjà eu lieu auparavant, alors :
If CDbl(txtIncr.Text) > 10 Then
picArea.Cls 'Effacer la zone de dessin.
Call DrawAxes 'Retracer le repère.
txtIncr.Text = "-10" 'Remettre le compteur à sa valeur de départ.
End If
'Tracer les points avec un pas de 0.1
Dim i As Integer
For i = 0 To (20 * 1 / Step)
'La zone d'évaluation reçoit l'équation.
txtEval.Text = txtExpr.Text
'On incrémente.
txtIncr.Text = CStr(CDbl(txtIncr.Text) + Step)
'On trace le point.
Call RunScript
Next
End Sub
Plus tu pourras réduire les répétitions et éviter le copier-coller de code, plus il y a de chances que le résultat soit lisible et fasse ce que tu souhaites.
d) Créer une procédure RunScript qui crée puis exécute le VBS, puis dessine le point sur la zone de dessin. Par exemple :
Public Sub RunScript()
On Error Resume Next
'On remplace la variable (notée ici x) par sa valeur.
txtEval.Text = Replace(txtEval, "x", txtIncr)
'On remplace les virgules par des points.
txtEval.Text = Replace(txtEval, ",", ".")
'On définit la fonction du script.
StrFonction = "Function Calcul(Fin): Fin=" & txtEval.Text & ":End Function"
'On exécute le script pour calculer le résultat.
Set MyScript = New ScriptControl
With MyScript
.Language = "VBScript"
Call .Reset
Call .AddCode(StrFonction)
Call .Run("Calcul", Result)
End With
Set MyScript = Nothing
'Enfin, on dessine le point à l'emplacement voulu.
picArea.PaintPicture picData.Picture, txtIncr, -2 * CSng(Result), 0.11, 0.11
DoEvents
End Sub
e) Pour les événements Click et Load il ne reste plus qu'à écrire :
Private Sub Form_Load()
Call DrawAxes
End Sub
Private Sub cmdFast_Click()
Call DrawFunction(0.1)
End Sub
Private Sub cmdSlow_Click()
Call DrawFunction(0.01)
End Sub
Voilà tout ! Tu pourrais ensuite placer les fonctions DrawAxes, DrawFunction et RunScript dans un module. Tu aurais ainsi les fonctions de calcul d'un côté, et les événéments propres à la feuille de l'autre.
On pourrait alors envisager des améliorations :
1. Permettre à l'utilisateur d'indiquer le nom de sa variable (x ? n ?)
2. Ajouter du texte pour guider l'utilisateur : que doit-il taper ? Où ?
3. Choisir l'intervalle du tracé. Ce qui est intéressant ne se passe pas toujours entre -10 et 10.
4. etc...
Mais ceci ne peut pas se faire sans que le fond du programme soit assaini.
Bonne continuation,
Cacophrène
vbnino
Messages postés218Date d'inscriptionjeudi 13 juillet 2006StatutMembreDernière intervention11 juillet 2010 22 mai 2007 à 20:24
Salut!
-Alors vous comprenez mon probléme?
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 22 mai 2007 à 19:20
Salut,
je ne suis pas là pour être méchant, mais juste apporter des conseils !
Pourquoi poster une source comme celle-ci, sans avoir apporter les modifications qui t'ont été énuméré dans ton Topic :
http://www.vbfrance.com/infomsg_PROBLEME_946493.aspx (pis ils t'ont tous répondu, tu les as laissé en plan !)
Conversion de de type String (controle Texte) vers Double ou Long (Text1 + 0.1 n'est pas conventionnel)
Ajouter 0 à une valeur est strictement inutile, t'es pas en C, le compilo va additionner bah zéro
Et ta fameuse boucle For i qui sert absolument à rien, d'autant que i n'est pas utilisé. (rencarde toi sur Step 0.1, pour utiliser i à la place...)
23 mai 2007 à 20:11
-Pour quoi il est long?
23 mai 2007 à 14:26
23 mai 2007 à 10:06
D'abord désolé de prendre la discussion en cours... Pour ma part voici ce que je dirais :
Text1 : Renommer txtExpr (expression)
Text2 : Supprimer
Text3 : Renommer txtIncr (pas du tracé)
Text4 : Renommer txtEval (évaluation)
p : Renommer picArea (la zone de dessin)
p2 : Renommer picData (les données pour le tracé)
Command1 : Renommer cmdFast (tracé rapide)
Command2 : Renommer cmdSlow (tracé lent)
ça c'est pour y voir un peu plus clair. Conventions dans les noms : un préfixe qui indique le type de contrôle (txt : TextBox ; cmd : CommandButton) suivi d'un mot ou d'une abréviation qui s'efforce d'être claire (pour celui qui a codé comme pour ceux qui regardent le code plus tard).
Ensuite, on va réorganiser l'ensemble.
a) D'abord supprimer "Dim a, c, d" qui ne sert à rien, et écrire Option Explicit tout en haut. Déclarer hors procédure :
Dim MyScript As ScriptControl
Dim StrFonction As String
Dim Result
b) Créer une procédure destinée à tracer le repère (le code correspondant est réécrit 5 fois dans ton code !) :
Private Sub DrawAxes()
picArea.Line (picArea.ScaleLeft, 0)-(picArea.ScaleWidth, 0), vbBlue
picArea.Line (0, picArea.ScaleTop)-(0, picArea.ScaleHeight), vbBlue
End Sub
On remplace RGB(0, 0, 255) par vbBlue parce que c'est la même chose. Il y a des constantes prédéfinies, autant les utiliser.
c) Créer une procédure DrawFunction pour tracer la fonction et éviter la répétition du code dans cmdSlow_Click et cmdFast_Click. Par exemple :
Private Sub DrawFunction(Step As Double)
'Si un tracé a déjà eu lieu auparavant, alors :
If CDbl(txtIncr.Text) > 10 Then
picArea.Cls 'Effacer la zone de dessin.
Call DrawAxes 'Retracer le repère.
txtIncr.Text = "-10" 'Remettre le compteur à sa valeur de départ.
End If
'Tracer les points avec un pas de 0.1
Dim i As Integer
For i = 0 To (20 * 1 / Step)
'La zone d'évaluation reçoit l'équation.
txtEval.Text = txtExpr.Text
'On incrémente.
txtIncr.Text = CStr(CDbl(txtIncr.Text) + Step)
'On trace le point.
Call RunScript
Next
End Sub
Plus tu pourras réduire les répétitions et éviter le copier-coller de code, plus il y a de chances que le résultat soit lisible et fasse ce que tu souhaites.
d) Créer une procédure RunScript qui crée puis exécute le VBS, puis dessine le point sur la zone de dessin. Par exemple :
Public Sub RunScript()
On Error Resume Next
'On remplace la variable (notée ici x) par sa valeur.
txtEval.Text = Replace(txtEval, "x", txtIncr)
'On remplace les virgules par des points.
txtEval.Text = Replace(txtEval, ",", ".")
'On définit la fonction du script.
StrFonction = "Function Calcul(Fin): Fin=" & txtEval.Text & ":End Function"
'On exécute le script pour calculer le résultat.
Set MyScript = New ScriptControl
With MyScript
.Language = "VBScript"
Call .Reset
Call .AddCode(StrFonction)
Call .Run("Calcul", Result)
End With
Set MyScript = Nothing
'Enfin, on dessine le point à l'emplacement voulu.
picArea.PaintPicture picData.Picture, txtIncr, -2 * CSng(Result), 0.11, 0.11
DoEvents
End Sub
e) Pour les événements Click et Load il ne reste plus qu'à écrire :
Private Sub Form_Load()
Call DrawAxes
End Sub
Private Sub cmdFast_Click()
Call DrawFunction(0.1)
End Sub
Private Sub cmdSlow_Click()
Call DrawFunction(0.01)
End Sub
Voilà tout ! Tu pourrais ensuite placer les fonctions DrawAxes, DrawFunction et RunScript dans un module. Tu aurais ainsi les fonctions de calcul d'un côté, et les événéments propres à la feuille de l'autre.
On pourrait alors envisager des améliorations :
1. Permettre à l'utilisateur d'indiquer le nom de sa variable (x ? n ?)
2. Ajouter du texte pour guider l'utilisateur : que doit-il taper ? Où ?
3. Choisir l'intervalle du tracé. Ce qui est intéressant ne se passe pas toujours entre -10 et 10.
4. etc...
Mais ceci ne peut pas se faire sans que le fond du programme soit assaini.
Bonne continuation,
Cacophrène
22 mai 2007 à 20:24
-Alors vous comprenez mon probléme?
22 mai 2007 à 19:20
je ne suis pas là pour être méchant, mais juste apporter des conseils !
Pourquoi poster une source comme celle-ci, sans avoir apporter les modifications qui t'ont été énuméré dans ton Topic :
http://www.vbfrance.com/infomsg_PROBLEME_946493.aspx
(pis ils t'ont tous répondu, tu les as laissé en plan !)
Conversion de de type String (controle Texte) vers Double ou Long (Text1 + 0.1 n'est pas conventionnel)
Ajouter 0 à une valeur est strictement inutile, t'es pas en C, le compilo va additionner bah zéro
Et ta fameuse boucle For i qui sert absolument à rien, d'autant que i n'est pas utilisé. (rencarde toi sur Step 0.1, pour utiliser i à la place...)
++
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.