UN USERCONTROL POUR LES DIAGRAMMES, COURBES ET AUTRES, AVEC POSSIBILITÉ DE FAIRE

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 11 déc. 2008 à 21:48
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 - 7 août 2009 à 15:42
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/48691-un-usercontrol-pour-les-diagrammes-courbes-et-autres-avec-possibilite-de-faire-des-courbes-de-tendance

Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
7 août 2009 à 15:42
oups correction (c'est vraiment ennuyeux de ne pas pouvoir éditer ses messages -_-')

Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
Dim s As GraphControl.TGraphSerie 'TGraphAxe
Dim d As GraphControl.TGraphDonnee

Dim i As Double
Dim j As Integer
For j = 1 To 5
s = New GraphControl.TGraphSerie
s.nom = "Test " + CStr(j)
For i = 0 To 2 Step 0.1
d = New GraphControl.TGraphDonnee
d.x = i
d.y = 1 + i + i ^ (j + 1)
s.AddPoint(d) 'AddPoint(d)
Next
AxKGraphControl1.AddSerie(s)
Next
AxKGraphControl1.GraphActif.TypeGraphique = GraphControl.EGraphTypeGraphique.Courbe
AxKGraphControl1.AxeX.Max = 2
AxKGraphControl1.AxeX.Min = 0
AxKGraphControl1.AxeX.Pas = 0.5
AxKGraphControl1.AxeY.Max = 30
AxKGraphControl1.AxeY.Min = 0
AxKGraphControl1.MajGlobale()

AxKGraphControl1.Titre = "test"
End Sub

Voila ça marche bien mieux comme ça :p
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
7 août 2009 à 15:32
Salut, tout d'abord BRAVO ! 10/10. (surtout le petit menu du haut et l'export en CSV est une pur merveille !
Pour ce CSV, je le trouve un peu étrange, une colonne 5X, à coté une 5Y plein de valeur, puis un copié/collé sur toute les autres colonne ! peu tu expliquer le format que tu utilises dans l'export CSV ?
Pour info :
Voici l'adaptation de ton code en .Net pour que cela marche, commente le si j'ai écris des bétises :p
------------------------------

Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
Dim s As GraphControl.TGraphSerie 'TGraphAxe
s = New GraphControl.TGraphSerie

Dim d As GraphControl.TGraphDonnee
s = New GraphControl.TGraphSerie
Dim i As Double
Dim j As Integer
For j = 1 To 5

s.nom = "Test " + CStr(j)
For i = 0 To 2 Step 0.1
d = New GraphControl.TGraphDonnee
d.x = i
d.y = 1 + i + i ^ (j + 1)
s.AddPoint(d) 'AddPoint(d)
Next
AxKGraphControl1.AddSerie(s)
Next
AxKGraphControl1.GraphActif.TypeGraphique = GraphControl.EGraphTypeGraphique.Courbe
AxKGraphControl1.AxeX.Max = 2
AxKGraphControl1.AxeX.Min = 0
AxKGraphControl1.AxeX.Pas = 0.5
AxKGraphControl1.AxeY.Max = 30
AxKGraphControl1.AxeY.Min = 0
AxKGraphControl1.MajGlobale()

AxKGraphControl1.Titre = "test"
End Sub

------------------------------
Sinon voila ce que j'ai à la fermeture ou parfois de façon intempestive, si un pro à une idée... Je prends, cela placerai ton OCX parmis mes favoris pour faire des graphs !
------------------------------
Tentative d'exécution managée dans le verrou du chargeur du système d'exploitation (OS). N'essayez pas d'exécuter du code managé dans une fonction d'initialisation d'image ou DllMain, car cela risque d'entraîner un blocage de l'application.
------------------------------
Merci encore pour cette source :!:
ranngalon Messages postés 13 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 13 octobre 2009
29 déc. 2008 à 13:10
Pour MCD2:
A chaque fois que tu as une nouvelle mesure, il faut qut tu l'ajoutes à la série correspondante.

Si tu as une fréquence de mesure faible, tu as la fonction MajGlobale qui permet de forcer le rafraichissement.
Si tu as une fréquence de mesure importante ( plus de 20 par secondes ), il faudrait plutôt réflaîchir à ajouter un timer forçant la mise à jour des graphs.
J'vais voir pour ajouter le timer pour le temps réel...
mcd2 Messages postés 4 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 23 décembre 2008
23 déc. 2008 à 00:05
Comment puisse utiliser votre ocx pour qu'il agisse de telle maniere qu'il soit rafraichi en temps reel.
Par exemple tracer une courbe à partir d'une mesure analogique qui changerer tout les secondes ( forme de graph défilent)

Merci
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
15 déc. 2008 à 16:19
Ouawh, quelle réactivité!
En effet, avec ton projet TestGraphControl.vbp, j'arrive à avoir un graphique correct.
Deux remarques cependant:
* çà manque d'aide pour utiliser ton programme selon les besoins (je me répète...)
* si on applique ton nouveau code sub Form_Load, on retombe sur des bugs avec KGraphControl1.AxeX.Max = 2
et la suite (les propriétés n'existent pas pour le contrôle, il n'y a de dispo dans le genre que "AxeActif" et "Maj")
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 déc. 2008 à 16:02
enregistrement obligatoire puisque le CLSID n'a pas été généré sur nos postes.
normal que tu n'aies pas cette erreur ranngalon.

bien (aussi) pour çà que la démarche que j'avais indiqué concerne la version non compilée, un groupe de projets...
(datait d'avant ta MAJ avec ton ocx compilé)
ranngalon Messages postés 13 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 13 octobre 2009
15 déc. 2008 à 15:52
MimiZanzan:
Pour les registres, c'est surprenant. Sur mes deux postes ( XP et W2K ), pas besoin d'aller dans les registres...
Pour les deux bugs, le code a évolué, je corrige...
Pour tester, je te conseille de prendre le "TestGraphControl.vbp" que j'ai mis dans le zip...
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
15 déc. 2008 à 15:49
RANNGALON,
Merci pour ta réponse.
J'ai opéré comme tu le décris, mais il faut aussi enregistrer le contrôle dans le registre pour qu'il soit dispo pour une form dans un projet VB6.
D'autre part, il y a 2 bugs quand on utilise le code que tu donnes pour la sub Form_Load. Après mon analyse de ton code complet, il faut faire ceci:
* "KGraphControl1.ColSeries.Add s" doit être remplacé par "KGraphControl1.AddSerie s"
* "KGraphControl1.TypeGraphique = Barre" doit être remplacé par:
"KGraphControl1.GraphActif.TypeGraphique = Barre"
Toutefois, même après tout ceci, je n'arrive qu'à une form contenant un minuscule graphique inutilisable...
Peux-tu encore m'aider?
Merci d'avance
aceF5 Messages postés 5 Date d'inscription vendredi 7 septembre 2007 Statut Membre Dernière intervention 15 décembre 2008
15 déc. 2008 à 15:08
Pour RANNGALON:
Merci de me répondre assidument.

Je n'ai pas été suffisamment clair.

Concernant les paramètres à passer au graphique, je souhaite procéder via ma programmation afin de présenter à l'utilisateur un graphique bien configuré. Ainsi, je ne souhaite pas laisser à l'utilisateur le soin d'organiser le graphique en modifiant les axes, mais plutôt régler ces paramètres en fonctions des données à afficher, ajuster les paramètres du graphique puis finalement l'afficher. Selon le titre sélectionné par l'utilisateur, le programme recherche les données et à ce moment configure le graphique et l'affiche correctement, en fonction de la plage de données, sans intervention de l'utilisateur. Cette opération doit être possible à chaque appel du graphique avec des jeux de données différents.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 déc. 2008 à 15:02
non pas exactement...

un timer sera accepté parce que lui n'utilise que les API et n'est pas lié au container (invisible at runtime).
donc si ton usercontrol contient un timer, le timer va aussi fonctionner sous VBA.

par contre si tu poses une picturebox (qui n'existe pas en VBA, c'est IMAGE uniquement, et qui contient hDC et hWnd, pas non plus dispo en VBA), ton ocx risque de ne plus être compatible

de même si tu fais référence à des objets comme la form (form en VB6 uniquement, userform en vba uniquement), tu brides aussi ton contrôle

ton usercontrol peut faire référence à son propre handle, mais tu ne peux pas "travailler" avec celui de son parent, qui n'existera pas en vba.
ou alors en trichant, c'est à dire pour cet exemple, en récupérant le handle par API (getfocus, getforegroudwindow, etc...) et non sur .parent

il y a donc des cas de figure où il est tout bonnement impossible de faire un ocx compatible vba
ranngalon Messages postés 13 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 13 octobre 2009
15 déc. 2008 à 14:27
Pour ACEF5:
Tout l'affichage d'un graphique est modifiable. Tu peux faire un peu ce que tu veux avec les axes par exemple, modifier le Max et le Min, les graduations... Il suffit de double-cliquer dessus.

Pour PCPT:
Donc en gros, dès que je mets un timer, un hwnd, un event et autres subtilités de ce genre, j'interdis mon control au VBA. C'est bien ça?
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 déc. 2008 à 13:13
ranngalon -> ton control ne fait pas référence à des spécificités qui pourraient ne pas exeister...
les collections existent en vba et vb6, tu dessines directement dans l'UC donc c'est compatible.

si tu voulais juste mettre en titre de ton graphique "usercontrol.parent.hwnd", çà devrait suffir à ce que VBA le refuse...
encore que

ou si par exemple tu mettais une variable "withevents x as form", que tu instanciais en référence au parent. ce genre de différences....
aceF5 Messages postés 5 Date d'inscription vendredi 7 septembre 2007 Statut Membre Dernière intervention 15 décembre 2008
15 déc. 2008 à 13:10
RANNGALON
Merci pour l'info. J'en comprends que l'ocx est complet et serait utilisable «tel quel» en VB. Quant à son utilisation en VBA,`žca semble problématique. Je vais quand même essayer...

Autre question: je présume qu'il serait possible de passer, par programmation, différentes valeurs au graphique, permettant ainsi à l'utilisateur de générer des courbes différentes selon son choix (Ex: le prix de l'action d'un titre); la même zone graphique pourrait afficher la courbe du prix de l'action X ou de l'action Y sans autre intervention de la part de l'utilisateur que le choix du titre (X ou Y), étant entendu que les valeurs à insérer au graphique sont disponibles.

Aussi, je présume qu'il est possible de varier, par programmation, les valeurs des échelles (Ex: la valeur de l'action X peut varier de 10$ à 30$ alors que la valeur de l'action Y peut varier de `35$ à 70$. De même, l'utilisateur pourrait vouloir le graphique de la valeur de l'action pour A) 1 mois, B) 1 an, C) 3 ans auquel cas, l'axe des x doit être ajustée)
ranngalon Messages postés 13 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 13 octobre 2009
15 déc. 2008 à 12:54
Il y a un OCX dans le lot (GraphControl.OCX).

Tous les OCX que je sors sont inutilisables en VBA, et je suis bien incapable de dire pourquoi. Si quelqu'un sait...
aceF5 Messages postés 5 Date d'inscription vendredi 7 septembre 2007 Statut Membre Dernière intervention 15 décembre 2008
15 déc. 2008 à 12:48
Je recherche ce genre de fonctionnalité depuis longtemps.

Malheureusement, je ne suis pas un expert en VB, je développe plutôt en VBA (Access).

Croyez-vous que cet OCX pourrait être utilisé «comme tel» dans une application VBA? Je sais comment ajouter une référence (comme un OCX) à un projet VBA, mais habituellement, ces références sont constituées d'un fichier unique. Dans cet exemple-ci, existe-t-il un fichier unique (.ocx) que je peux sauvegarder quelque part puis sutiliser directement dans mon application ?

J'aimerais beaucoup pouvoir intégrer cette fonctionnalité à une application de comptabilité de transactions boursières et à cette fin, j'apprécierais grandement si quelqu'un pouvait m'aider.

Bonne journée.
mcd2 Messages postés 4 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 23 décembre 2008
15 déc. 2008 à 11:17
merci beaucoup
ranngalon Messages postés 13 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 13 octobre 2009
15 déc. 2008 à 11:09
Après réflexion, je pense qu'il faudrait créer un control à part pour un oscillo, car le comportement est trop éloigné de l'aspect courbe de stats...
Pour ce qui est de supprimer les premiers points, je le mettrai dans la prochaine version...
mcd2 Messages postés 4 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 23 décembre 2008
15 déc. 2008 à 10:48
pour l'activation et desactivation de la maj du graphique, cela peut aussi effacé les premiers point senregistrés dans le graph.

Merci
ranngalon Messages postés 13 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 13 octobre 2009
15 déc. 2008 à 09:56
Bonjour,

Pour MimiZanzan:
Il faut que tu poses l'ocx quelque part ( genre dans c:\temp ).
Ensuite tu crées un nouveau projet, avec juste une forme.
Tans la toolbox, tu fais click-droit => Components. Tu cliques sur "Parcourir", et tu vas chercher l'ocx que tu viens de coller dans c:\temp
=> Le control est maintenant dispo pour ta form.
Tu instancies le control dans ta forme, sans modifier son nom. Plus qu'à coller le code fourni plus haut, et ça doit fonctionner.

Pour MCD2:
Pour l'instant, pas vraiment. Mais il suffit de pas grand chose: juste un ptit timer à activer/désactiver, qui met à jour les graphiques. Pas bien sorcier...

Merci pour les commentaires...
mcd2 Messages postés 4 Date d'inscription mercredi 14 mai 2003 Statut Membre Dernière intervention 23 décembre 2008
15 déc. 2008 à 09:47
Bonjour ,
ce code est tres intéressent et tres utile.
A t'on la possibilite de faire évoluer les courbes en temps reel ? pour faire un genre d'oscilloscope.
Merci
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
15 déc. 2008 à 00:05
Merci beaucoup à PCPT pour ces infos.
J'arrive en effet à utiliser le projet OCX comme tu me l'as indiqué, à condition de rendre public les modules de classe (ou bien d'ajouter simplement la form1 dans le sein du projet OCX, et de démarrer le projet avec une procédure publique Main).
Cependant, j'arrive tj à une feuille type HTML, avec une toute petite zone graphique que je ne sais pas utiliser. Comment par ex tracer une courbe avec ce code?
Je pense qd même que ranngalon devrait faire un fichier d'aide pour utiliser son code. Il y a un tout petit menu incompréhensible pour moi...
C'est dommage, car le code semble très intéressant, mais qq commentaires y seraient les bienvenus, (il y en a malheureusement aucuns), et tout le monde (dont moi) n'est pas "expert".
Merci d'avance
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 déc. 2008 à 20:27
mimiZanzan -> c'est une OCX donc un projet OCX, pas standard

comme indiqué :
*ajoute un projet (fichier > ajouter un projet), lui évidemment standard.
*pose ensuite l'uc (que tu nommes 'KGraphControl1') sur ta form1
*copie le code présenté par ranngalon (rapidement d'ailleurs, merci pour ta réactivité)
*plus qu'à sélectionner ton projet ajouté (explorateur de projets, F4 si pas présent), click droit sur TON projet > projet de démarrage
*puis enfin F5

je n'ai néanmoins pas testé, juste survolé le code avant mon premier commentaire. la manip reste classique donc pas de souci ;)
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
14 déc. 2008 à 18:58
PCPT, merci pour ton aide, mais je n'y arrive tj pas...
Je procède ainsi:
*je lance le projet VB GraphControlOCX
*j'ajoute une form dans ce projet
*j'ajoute le contrôle KGraphControl sur la form (il est présent dans la boite à outils)
*je copie le code ci-dessus dans la sub Form_Load
Et puis, qd je fais F5, rien ne se passe...si ce n'est l'ouverture d'une page style HTML!
Merci d'avance pour tes éclaircissements.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 déc. 2008 à 18:40
mimiZanzan -> ajouter un projet, pose une instance du ctl, le code est fourni ci-dessus
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
14 déc. 2008 à 17:00
Est-ce que tu pourrais expliquer comment on se sert de ton code?
Je l'ai ouvert, et je n'y comprends rien, il n'y a même pas une form...
Et puis en effet, un exemple serait bienvenu.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
11 déc. 2008 à 21:48
salut,

un petit projet exemple pourrait nous aider à voir le fonctionnement de l'ocx...

pis une capture pour avoir une idée du résultat?
Rejoignez-nous