TRACEUR DE COURBE

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 22 mai 2007 à 19:20
vbnino Messages postés 218 Date d'inscription jeudi 13 juillet 2006 Statut Membre Dernière intervention 11 juillet 2010 - 23 mai 2007 à 20:11
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42793-traceur-de-courbe

vbnino Messages postés 218 Date d'inscription jeudi 13 juillet 2006 Statut Membre Dernière intervention 11 juillet 2010
23 mai 2007 à 20:11
Salut!

-Pour quoi il est long?
vbnino Messages postés 218 Date d'inscription jeudi 13 juillet 2006 Statut Membre Dernière intervention 11 juillet 2010
23 mai 2007 à 14:26
Merci
Cacophrene Messages postés 251 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 mars 2008 1
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és 218 Date d'inscription jeudi 13 juillet 2006 Statut Membre Dernière intervention 11 juillet 2010
22 mai 2007 à 20:24
Salut!

-Alors vous comprenez mon probléme?
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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...)

++