[USERCONTROL] CALCULATRICE EN LIGNE DE CODE AVEC SCRIPTCONTROL (TECHNIQUE "INÉDI

MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 - 21 juin 2006 à 00:38
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 - 28 juin 2006 à 17:20
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
28 juin 2006 à 17:20
Asimengo>>Oui j'avais bien compris l'histoire des objets mais à la place du label. On peut bien arriver à faire un Dim toto as object
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
28 juin 2006 à 13:18
Asimengo > Oui j'ai compris ou c'est que tu pensais que mon code utilisait des objets dépendant de mon application. Mais par contre si tu veux poster la version DLL fait le ça pourrait peut etre servir à pas mal de monde, y'a aucun problème en tout cas, c'est pas sur une source petite comme ça qu'on peut apposer son "copyright" lol.
Bonne prog a+
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
28 juin 2006 à 10:49
Je viens de relire la mise à jour de MADM@TT j'ai fait une mauvaise interpretation il n'utilise pas les objets dépendants de l'application, cette mise à jour est plus cool.

Bonne Prog
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
28 juin 2006 à 10:35
@bouv: c'est clair et c'est évident qu'un simple module suffirait mais je répète encore ce code est dépendant des objets de votre application, le control Label Sortie par exemple. En fait MADM@TT utilise la méthode AddObject pour passer en paramètre un contrôle de son appli pour la recup du résultat, ce qu'il ne pourrait faire si son appli ne contenait que des modules et pas de form. Le seul intérêt d'une DLL est le fait d'évaluer l'expression par l'appel d'une simple fonction.

@MADM@TT: Avec ton accord je publirais la verson DLL que j'ai réalisé qui permet d'évaluer les expressions en utilisant même des fonctions personnalisées. Je rappelle que le fond se trouve dans ta publication, c'est pour éviter d'être traité de plagieur.

A+
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
28 juin 2006 à 01:56
pfiou en plus je devais vraiment être fatigué quand j'ai écrit ce code, j'avais plein de variables en trop ça fait peur, je les ai supprimé. Et j'ai au passage rajouté le Err.Clear que j'avait oublié merci ;)
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
28 juin 2006 à 01:49
Ahh autant pour moi, et effectivement en y repensant pourquoi avoir fait 2 propriétés.
Je vais changer ça, ton code est mieux à mon gout.
Merci !
++
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
28 juin 2006 à 00:04
Autant pour moi, je n'avais pas revu ton code quand j'ai écrit mon commentaire. Effectivement on peut placer le résultat où on veut.

Sinon pour la commande Run. Je l'ai simplement appelée comme ça car c'est le nom que tu a utilisé dans ton Control Utilisateur.

Sinon pour simplifié le control utilisateur tu peux écrire :

Public Function Run(ByRef strCode As String)
Dim str As String
If (InStr(1, strCode, ":") 0) And (InStr(1, strCode, vbCrLf) 0) Then
str = "function Main(): sortie.caption=" + strCode + ": end function"
SC.Reset
On Error Resume Next
SC.AddObject "Sortie", lbl
SC.AddCode (str)
If Err.Number <> 0 Then
Run = "<Error>"
Err.Clear '<= Ne pas oublié
Else
SC.Run "Main"
Run = strResult
End If
Else
Run = "<Error>"
End If
End Function

Tu te passe ainsi du Property Let et Get

Bonne prog
++
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
27 juin 2006 à 21:56
Tiens je connaissais pas du tout la commande Run, c'est excellent, c'est clair plus besoin d'un usercontrol ou quoi que ce soit.
Je vais ajouter une fonction dans un module avec ça dès que j'ai le temps, merci bouv !

Par contre j'ai pas trop compris quand tu dis :
"L'inconvénient que je trouve à ton code MadM@tt c'est que tu ne lance pas le choix du control qui va récuperer le résultat. Imagine que je veuille placer ce résultat dans un label, une FlexGrid..."
Ici avec la ligne Resultat = Calc.Run, on récupère le résultat du calcul, et si on veut mettre ça dans un label :
label.caption = resultat
Enfin j'ai pas du comprendre ?

Mais merci pour la commande run je ne connaissais pas beaucoup, effectivement ça sera beaucoup mieux avec ça (je mettrais 2 versions différentes : un avec run, une avec scriptcontrol pour bien montrer le principe du truc).
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
27 juin 2006 à 18:27
Salut,
Perso, je préfère la version de MadM@tt. Mais c'est une question de choix.

Cela dit, si je peux apporter ma pierre à l'édifice, je dirai qu'une simple fonction dans un module ferai très bien l'affaire.
En effet, ni de control utilisateur, ni de DLL. Une simple fonction à appeler.
MonResultat = Run(MaChaine)

L'inconvénient que je trouve à ton code MadM@tt c'est que tu ne lance pas le choix du control qui va récuperer le résultat. Imagine que je veuille placer ce résultat dans un label, une FlexGrid...

Enfin, ce qui me semble important dans cette source, ce n'est pas tant la forme, mais le fond. A savoir ce que l'on peut faire avec le ScriptControl.

Bonne prog
++
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
27 juin 2006 à 14:07
Je te rassure toute suite je ne connaissais rien sur ce control je l'ai appri par toi, à toi l'honneur.

Juste que je trouvais qu'il ne s'agisait pas d'un control mais d'un évaluateur d'expression, je pensais qu'une DLL serait plus appropriée. Moi je l'ai reécrit sur le principe que j'expose plus haut car j'ai crois avoir compris que l'abiguité ici c'est de récupérer une valeur ou une variable à l'intérieur des modules objets ajoutés au scripcontrol. La version que j'utiliserai car j'en avais besoin est une DLL avec possiblité de rajout de procédure et récupération des variables de la procédure, c'est alors que l'utilisation d'une collection devient très intéressante. Le tien en OCX marche impecc j'ai testé et retesté, la version en DLL aussi et je trouve que l'exemple que je fourni plus haut est très interessant car désormais en 2 lignes ou 3 lignes on pourra faire des calcls direcetements dans un control.

Je te remercie encore de cette publication qui me fait entrevoir bine des choses.

A+
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
26 juin 2006 à 23:15
je sais pas si cette méthode est plus simple, car il y a pas mal de ligne de code à écrire pour appeler la classe, alors que moi il y a juste besoin de 2 lignes (et ajouter l'ocx).
Après je ne vois pas quel problème pose d'ajouter un ocx dans un prog ?
Sinon j'ai pas tout compris dans ton code, ça fait vachement compliqué juste pour appeler un controle et ses fonctions.

Enfin le but de ma source était d'etre accessible par tout le monde et le plus pratique possible, je pense que ça l'est non ?
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
26 juin 2006 à 16:41
Super, ça ma permis d'apprendre sur ce fameux "ScriptControl".

Voici à mon avis une amélioration de ton code: 2 classes (class1 et class2)

Class2:
-------
Option Explicit
Public vItem As Variant

Class1:
--------
Option Explicit
Private SC As Object
Private Col As Collection


Private Sub Class_Initialize()
Dim ObjMember As Class2

'Creation de l'objet ScriptControl
Set SC = CreateObject("ScriptControl")
SC.Language = "VBScript" 'Préciser le language de script (obligatoire)

'Création de la collection pour le partage de résultat de calcul
'Il s'agira d'une collection à un seul item
Set Col = New Collection
Set ObjMember = New Class2
ObjMember.vItem = Null 'Initialiser la valeur à Null c'est mon choix
Col.Add ObjMember, "x"
Set ObjMember = Nothing
End Sub

Private Sub Class_Terminate()
Set SC = Nothing
Set Col = Nothing
End Sub

Public Function Eval(sExpression As String) As Variant
On Error GoTo Err_Eval

With SC
.Reset 'Annule tous les objets et codes de script
.addobject "Colx", Col 'Ajoute l'objet hôte qui sera exposé lors de l'exécution
'Ajoute une fonction qui fera le calcul. La mienne se nomme EvalueExpression
.AddCode "Option Explicit"
.AddCode "Function EvalueExpression()" & vbCrLf & _
" colx(1).vItem=" & sExpression & vbCrLf & _
"End Function"
.Run ("EvalueExpression") 'Commande l'exécution de la fonction EvalueExpression
End With
Eval = Col(1).vItem 'Retourne une valeur non vide si l'expression est correcte

Exit_Eval:
Exit Function

Err_Eval:
MsgBox "Impossible d'évaluer l'expression '" & sExpression & "'"
Resume Exit_Eval
End Function

<<<<<< Comment utiliser cette méthode. >>>>>>>>>>>>>>
Créer un form qui a un contrôle textbox de nom text1. coller le code ci-dessous dans le form.

Option Explicit
Private cl As Class1

Private Sub Form_Load()
Set cl = New Class1
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set cl = Nothing
End Sub

Private Sub Text1_Validate(Cancel As Boolean)
Dim x As Variant

'L'évaluation est automatique si l'expression commence par le signe "="
If Left$([Text1].Text, 1) = "=" Then
x = cl.Eval(Mid$([Text1].Text, 2))
If IsEmpty(x) Then
'Expression impossible à évaluer, garder le focus sur le contrôle
Cancel = True
Else
'Expression correctement évaluable, remplacer par le résultat.
[Text1] = x
End If
End If
End Sub

Avantage de cette méthode.
-------------------------
Vous n'avez pas besoin d'ajouter de composant OCX. Le calcul de n'importe quelle expression est simple, juste la méthode Eval.

Par contre le mieux est d'avoir cette méthode en DLL.

A+
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
22 juin 2006 à 22:56
Ben je pense parce que le vbscript c'est vieux non ? et je pense que dès que y'a du vbscript à executer windows fait appel à un ScriptControl donc bon...
Menfin c'est que des suppositions ;)
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
22 juin 2006 à 17:14
J'adore ^^
Simple et efficace.
Je comptais me lancer dans le code d'un truc dans ce genre...
Plus besoins :-)

10/10

Simple question : le ScriptControl est il compatible avec les anciens Windows (95,98,Me,2000)
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
21 juin 2006 à 01:40
Oui c'est clair c'est vraiment du "comment pas se faire chier", mais ça a beaucoup d'avantages je trouve.
Enfin même si je programmais entièrement une calculatrice qui ferai la même chose, je préfererai utiliser celle la mais bon c'est un choix perso ;-)

Sinon j'en profite pour préciser que j'ai mis "inédit" dans le titre pour préciser que c'est une méthode que je n'ai pas trouvé sur codes sources auparavant, c'est pas pour faire un effet du style "ouah grande révolution" lol

Merci pour le commentaire à ++
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
21 juin 2006 à 00:57
Salut,

j'avais fais presque la meme chose a mes debuts, tout simplement parceque je savais pas faire autrement lol...

Je pense que c'est une bonne alternative, meme si c'est pas ce qu'il y a de plus elegant.

Bonne prog a tous
++
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
21 juin 2006 à 00:38
Je vous en prie, je vous en supplie même lol, LISEZ LA PRESENTATION DU CODE.
Ca m'évitera de m'en prendre plein la figure : "encore une calculatrice" lol

A votre service sinon, et si vous avez des idées d'améliorations ;)
Rejoignez-nous