begin process at 2012 02 11 11:25:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > GRAPH EN TEMPS RÉEL (MSCHART)

GRAPH EN TEMPS RÉEL (MSCHART)


 Information sur la source

Note :
6,5 / 10 - par 2 personnes
6,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Niveau :Initié Date de création :29/07/2004 Date de mise à jour :31/01/2005 21:48:15 Vu / téléchargé :11 380 / 1 928

Auteur : renardeau

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
après avoir vu un code ici
http://www.vbfrance.com/code.aspx?ID=16976
Je me suis dit que j'allais mettre aussi le mien

j'ai un appareil qui m'envois des données (via le port com - mais c'est pas l'objet ici) toutes les secondes. j'en fait un graphe (courbe) si la fenêtre est ouverte. et pas si elle est fermée (travail un peu comme un pop-up)


Créer une forme "capteur1" Dans lequel vous mettre un MSCHART que vous nommez "Graph"
Il doit avoir plusieurs propriété pour avoir de belles courbes mais vous trouverez au fur et a mesures de vos recherche (bouton droit sur l'objet MSChart -> propriété).

Je peux avoir 4 capteurs maximum (capteur1->capteur4)

Ayez une forme qui envois les données (fonction graph) et qui ouvre la forme du capteur pour voir le graphe.

Source

  • 'a mettre dans un module
  • '''''''''''''''''''''''''''''''''''''''''''''''''''''''
  • Dim YMax(4) As Double
  • Dim YMin(4) As Double
  • Dim XMax(4) As Long
  • Dim XMin(4) As Long
  • 'heure : l'heure de l'aquisition
  • 'data : la valeure de l'aquisition
  • 'capteur : le nom de la forme "capteur1"
  • 'NomCapteur : le nom pour le titre de la forme
  • Function Graph(Heure As String, data As Double, capteur As String, NomCapteur As String)
  • Dim NumCap As Integer
  • Dim f As Form
  • For Each f In Forms
  • If f.Name = capteur Then 'on recherche pour voir si la forme est active
  • NumCap = Int(Mid(capteur, 8, 1))
  • If f.Graph.Tag = "" Then
  • 'première édition
  • YMax(NumCap) = 0
  • YMin(NumCap) = Val(999999.9999) 'valeure max pour mes capteurs
  • f.Graph.Tag = "fin"
  • f.Graph.ColumnCount = 1 '1 seul capteur
  • f.Graph.RowCount = 0 'pas de données
  • f.Graph.Plot.Axis(2).AxisScale.Hide = True 'on cache les valeure numérique à droite
  • With f.Graph.Plot.Axis(VtChAxisIdY) 'on définit l'axe des Y
  • .CategoryScale.Auto = False
  • .CategoryScale.DivisionsPerLabel = 3
  • .CategoryScale.DivisionsPerTick = 3
  • .CategoryScale.LabelTick = True
  • .ValueScale.MinorDivision = 0
  • End With
  • 'Les noms des axes et du graphique
  • f.Graph.Plot.Axis(VtChAxisIdY).AxisTitle.Text = "HZ" 'je recois une frequence
  • f.Graph.Plot.Axis(VtChAxisIdX).AxisTitle.Text = "Heure" 'par rapport au temps
  • With f.Graph.Plot.Axis(VtChAxisIdX) 'on définit l'axe des Y
  • .CategoryScale.Auto = False
  • .CategoryScale.DivisionsPerLabel = 5
  • .CategoryScale.DivisionsPerTick = 5
  • .CategoryScale.LabelTick = True
  • .ValueScale.MinorDivision = 0
  • End With
  • XMin(NumCap) = Int(Mid(Heure, 1, 2) * 10000 + Mid(Heure, 4, 2) * 100 + Mid(Heure, 7, 2))
  • 'le nom de la forme... retiré du titre du graph car prend trop de place !
  • f.Caption = NomCapteur
  • End If
  • 'a tous les coups
  • f.Graph.Column = 1
  • 'On choisit le capteur 1
  • '
  • ' si le graphe a plus de 32 767 données il plante :(
  • ' 32767 est la donnée max pour un integer !
  • '
  • If f.Graph.RowCount >= 32767 Then
  • 'décalage de 1 donnée sur la gauche
  • 'on perd la donnée de gauche
  • For j = 2 To 32767
  • f.Graph.Row = j
  • TempHeure$ = f.Graph.RowLabel
  • TempData% = f.Graph.data
  • f.Graph.Row = j - 1
  • f.Graph.RowLabel = TempHeure$
  • f.Graph.data = TempData%
  • Next
  • f.Graph.Row = 32767
  • Else
  • 'on continue à compter
  • f.Graph.RowCount = f.Graph.RowCount + 1
  • End If
  • 'dernière donnée
  • f.Graph.Row = f.Graph.RowCount
  • f.Graph.RowLabel = Heure 'mettre l'heure sur le graphe
  • f.Graph.data = data 'mettre la donnée sur le graphe
  • If YMax(NumCap) < data Then YMax(NumCap) = data + (10 - (data Mod 10))
  • If YMin(NumCap) > data Then YMin(NumCap) = data - (data Mod 10)
  • 'axes des Y
  • If YMax(NumCap) - YMin(NumCap) < 11 Then
  • f.Graph.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = YMax(NumCap) - YMin(NumCap)
  • Else
  • f.Graph.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 10
  • End If
  • With f.Graph.Plot.Axis(VtChAxisIdY)
  • .ValueScale.Maximum = YMax(NumCap)
  • .ValueScale.Minimum = YMin(NumCap)
  • End With
  • 'Axes des X
  • If f.Graph.RowCount < 11 Then
  • f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerLabel = 1
  • f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerTick = 1
  • Else
  • f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerLabel = Int(f.Graph.RowCount / 10)
  • f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerTick = Int(f.Graph.RowCount / 10)
  • End If
  • End If
  • 'fin de la forme
  • Next
  • End Function
  • '''''''''''''''''''''''''''''''''''''''''''''''''''
  • '''''''''''''''''''''''''''''''''''''''''''''''''''
  • ''''''''''''''''''''''''''''''''''''''''''''''''''
  • ''' Dans votre forme Capteur1
  • '' où il y a 1 MSCHARt nommé graph
  • ''' mettez ce code
  • '''''''''''''''''''''''''''''''''''''''''''''''''''
  • Dim lar As Long, lng As Long
  • Private Sub Form_Load()
  • lng = Me.Width
  • lar = Me.Height
  • Graph.Top = 0
  • Graph.Left = 0
  • Graph.Width = lng
  • Graph.Height = lar - 200
  • Graph.Plot.SeriesCollection(1).Pen.VtColor.Blue = False
  • Graph.Plot.SeriesCollection(1).Pen.VtColor.Green = False
  • Graph.Plot.SeriesCollection(1).Pen.VtColor.Red = True
  • End Sub
  • Private Sub Form_Resize()
  • Dim ctl As Control
  • If (Me.WindowState = 1) Then Exit Sub
  • For Each ctl In Me.Controls
  • If TypeOf ctl Is ComboBox Then
  • ctl.Move ctl.Left * Me.Width / lng, ctl.Top * Me.Height / lar, ctl.Width * Me.Width / lng
  • Else
  • 'Les comboboxes ont leur propriété Height en lecture seule
  • ctl.Move ctl.Left * Me.Width / lng, ctl.Top * Me.Height / lar, _
  • ctl.Width * Me.Width / lng, ctl.Height * Me.Height / lar
  • End If
  • Next
  • lng = Me.Width
  • lar = Me.Height
  • End Sub
'a mettre dans un module
'''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim YMax(4) As Double
Dim YMin(4) As Double
Dim XMax(4) As Long
Dim XMin(4) As Long

'heure : l'heure de l'aquisition
'data : la valeure de l'aquisition
'capteur : le nom de la forme "capteur1"
'NomCapteur : le nom pour le titre de la forme

Function Graph(Heure As String, data As Double, capteur As String, NomCapteur As String)
Dim NumCap As Integer
Dim f As Form
For Each f In Forms
    If f.Name = capteur Then                    'on recherche pour voir si la forme est active
        NumCap = Int(Mid(capteur, 8, 1))
            
        If f.Graph.Tag = "" Then
'première édition
            YMax(NumCap) = 0
            YMin(NumCap) = Val(999999.9999) 'valeure max pour mes capteurs
            f.Graph.Tag = "fin"
            f.Graph.ColumnCount = 1         '1 seul capteur
            f.Graph.RowCount = 0            'pas de données
            f.Graph.Plot.Axis(2).AxisScale.Hide = True  'on cache les valeure numérique à droite
            With f.Graph.Plot.Axis(VtChAxisIdY) 'on définit l'axe des Y
                .CategoryScale.Auto = False
                .CategoryScale.DivisionsPerLabel = 3
                .CategoryScale.DivisionsPerTick = 3
                .CategoryScale.LabelTick = True
                .ValueScale.MinorDivision = 0
            End With
            'Les noms des axes et du graphique
            f.Graph.Plot.Axis(VtChAxisIdY).AxisTitle.Text = "HZ"      'je recois une frequence
            f.Graph.Plot.Axis(VtChAxisIdX).AxisTitle.Text = "Heure" 'par rapport au temps

            With f.Graph.Plot.Axis(VtChAxisIdX) 'on définit l'axe des Y
                .CategoryScale.Auto = False
                .CategoryScale.DivisionsPerLabel = 5
                .CategoryScale.DivisionsPerTick = 5
                .CategoryScale.LabelTick = True
                .ValueScale.MinorDivision = 0
            End With
            XMin(NumCap) = Int(Mid(Heure, 1, 2) * 10000 + Mid(Heure, 4, 2) * 100 + Mid(Heure, 7, 2))

            'le nom de la forme... retiré du titre du graph car prend trop de place !
            f.Caption = NomCapteur
        End If

        
        
'a tous les coups
    f.Graph.Column = 1
        'On choisit le capteur 1
        
        '
        '   si le graphe a plus de 32 767 données il plante :(
        '   32767 est la donnée max pour un integer !
        '
        If f.Graph.RowCount >= 32767 Then
          'décalage de 1 donnée sur la gauche
          'on perd la donnée de gauche
          For j = 2 To 32767
            f.Graph.Row = j
            TempHeure$ = f.Graph.RowLabel
            TempData% = f.Graph.data
            f.Graph.Row = j - 1
            f.Graph.RowLabel = TempHeure$
            f.Graph.data = TempData%
          Next
          f.Graph.Row = 32767
        Else
        'on continue à compter
          f.Graph.RowCount = f.Graph.RowCount + 1
        End If
        'dernière donnée
        f.Graph.Row = f.Graph.RowCount
        f.Graph.RowLabel = Heure        'mettre l'heure sur le graphe
        f.Graph.data = data             'mettre la donnée sur le graphe
        
        
        If YMax(NumCap) < data Then YMax(NumCap) = data + (10 - (data Mod 10))
        If YMin(NumCap) > data Then YMin(NumCap) = data - (data Mod 10)
'axes des Y
        If YMax(NumCap) - YMin(NumCap) < 11 Then
            f.Graph.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = YMax(NumCap) - YMin(NumCap)
        Else
            f.Graph.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 10
        End If
        
        With f.Graph.Plot.Axis(VtChAxisIdY)
            .ValueScale.Maximum = YMax(NumCap)
            .ValueScale.Minimum = YMin(NumCap)
        End With
'Axes des X
If f.Graph.RowCount < 11 Then
        f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerLabel = 1
        f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerTick = 1
Else
        f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerLabel = Int(f.Graph.RowCount / 10)
        f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerTick = Int(f.Graph.RowCount / 10)
End If

    End If
    'fin de la forme
Next
End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''



''''''''''''''''''''''''''''''''''''''''''''''''''
'''    Dans votre forme Capteur1
''     où il y a 1 MSCHARt nommé graph
'''   mettez ce code
'''''''''''''''''''''''''''''''''''''''''''''''''''

Dim lar As Long, lng As Long



Private Sub Form_Load()
    lng = Me.Width
    lar = Me.Height
    Graph.Top = 0
    Graph.Left = 0
    Graph.Width = lng
    Graph.Height = lar - 200
    Graph.Plot.SeriesCollection(1).Pen.VtColor.Blue = False
    Graph.Plot.SeriesCollection(1).Pen.VtColor.Green = False
    Graph.Plot.SeriesCollection(1).Pen.VtColor.Red = True
End Sub

Private Sub Form_Resize()
Dim ctl As Control
If (Me.WindowState = 1) Then Exit Sub

For Each ctl In Me.Controls
    If TypeOf ctl Is ComboBox Then
        ctl.Move ctl.Left * Me.Width / lng, ctl.Top * Me.Height / lar, ctl.Width * Me.Width / lng
    Else
        'Les comboboxes ont leur propriété Height en lecture seule
        ctl.Move ctl.Left * Me.Width / lng, ctl.Top * Me.Height / lar, _
           ctl.Width * Me.Width / lng, ctl.Height * Me.Height / lar
    End If
Next

lng = Me.Width
lar = Me.Height
End Sub





 Conclusion

'''''''''''''''''''''''''''''''
'' Vous appelez le tout de la sorte
'''''''''''''''''''''''''''''''

Graph(date( ), 123456.1234, "Capteur1", "Titre de mon graphe")

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

02 décembre 2004 16:37:47 :
ajout du Zip et une capture d'écran
02 décembre 2004 16:39:34 :
ajout du zip et capture ecran
31 janvier 2005 21:48:15 :
Ajout d'un répertoire mettant une autre solution !

 Sources du même auteur

MSCHART VERS BMP : LA SOLUTION

 Sources de la même categorie

Source avec une capture GRAPH PHP COURBE DE CHARGE par s.defaye
Source avec Zip Source avec une capture BOULE DE CRISTAL par BLUEBIBUBBLE
VB6 - DÉPLACEMENT D'UN CONTRÔLE SUR UN SEGMENT DE DROITE DÉL... par ucfoutu
Source avec Zip Source .NET (Dotnet) APPLICATION DE DESSIN par fsafsafsaf
Source avec Zip Source avec une capture Source .NET (Dotnet) MERGEIMAGES par Le Pivert

Commentaires et avis

Commentaire de renardeau le 29/07/2004 10:17:12

j'ai oublié de signaler, il faut 2 données pour que le graphe se dessine (ca me parrait logique il faut 2 point pour un trait) mais ce ne l'est peut)etre pas pour tout le monde

Commentaire de FroyGe le 30/07/2004 01:53:44

'a mettre dans un module
Biensur....c'est quoi ? :p

Commentaire de renardeau le 30/07/2004 10:13:38

rassues moi, tu rigoles ...


Si ce n'est pas le cas vas vite chercher un cours de VB sur le NET ;)

Commentaire de denis21 le 27/11/2004 17:14:08

je dois faire aussi un graphique temps reel, j'ai testé ta solution, j'ai peut-être bien loupé qlq chose.. mais à partir d'un moment, le graphique clignote aussi avec cette solution! Quand RowCount arrive à 1000, le clignotement devient sérieux...
et comme toi tu vas jusque 32 000, comment tu fais pr ne pas avoir de clignotement ??
Est-ce que tu pourrais mettre le zip stp..

D'avance merci.

Denis.

Commentaire de renardeau le 02/12/2004 16:43:13

voici mon exemple... Denis21


J'espère que cela pourra vous faire plaisir...

Pour moi le temps reel, c'est un minimum d'une seconde, jusque maximum une minute.

En réalité c'est le resultat d'un appareil de mesure : capteurs de température, pression, pluie, luminosité !

Commentaire de renardeau le 31/01/2005 21:50:08

Une nouvelle solution a été envisagée... elle paut encore etre perfectionnée...

le "clignottement" que certains me reprochaient est diminué par 10

Commentaire de jacko20 le 31/07/2005 14:21:21

Pas mal ta source Renardeau ;-)
(Un chef scout (Cornay 05))
:)

Commentaire de puje_fr le 19/07/2008 14:18:29 9/10

Bonjour,
Excellent ta source!
J'ai cependant un petit souci, je n'arrive pas à faire afficher les valeurs négatives...
Une idée?

Merci.

Commentaire de puje_fr le 19/07/2008 14:34:26

pff le boulet!
je n'avais pas vu que tu le forcais dans ton code...

Désolé, et encore bravo pour ta source.

Commentaire de shadowmosses le 23/11/2008 19:40:19

La, je dois bien dire que tu vas me venir en aide avec ton ZIP, je travail aussi avec des appareil de mesure et des capteurs mais mon logiciel n'est pas encore très au point :D .
Sur ceux, bonne continuation . et merci .

Commentaire de vbs6x le 14/04/2009 19:10:34

Bonsoir,

c'est vraiment génial cette source!

Est-il possible:
1) de faire défiler la courbe ?
2) toujours à la même échelle ?
(C'est à dire de la déplacer au fur et à mesure qu'elle se crée sans quelle se compresse et devienne illisible ?

Merci :)

Commentaire de renardeau le 05/12/2009 13:46:03

à vbs6x
regarde la partie 2 du source.
Il y a 2 répertoires avec 2 façons de voir le source différemment.

Je suis heureux que ce source vous aide.
J'avais pris du bonheur à le faire.

Depuis je ne travaille plus bcp en développement mais j'aimerais vraiment reprendre... Si il y en a qui ont des idées...

Commentaire de Tarelaque le 03/05/2011 11:48:29

Bon sa fait presque un an mais je demande quand même on verra si j'ai une réponse !!!

Voila ton code ne fonctionne pas avec moi (je travail sous visual studio 2008 version standard). Le problème c'est que j'ai fais comme tu as dit un module que j'ai appelé "Graphique" où dedans je met le début de ton code et dans ma forme principale je met un Chart  appelé Graph comme toi !!! Mais le seul soucis avec moi c'est que le code ne fonctionne pas. En effet dans le chart en rentrant ton bout de code cela me met plein d'erreurs donc je ne comprends pas si quelqu'un pouvait m'aider j'en serait ravi !!!

ps : je débute en VB (a peine 1 semaine) mais on me demande de réaliser une fonction graphique permettant de dessiner un axe graphique et que chaque trait de graduation soit espacé de 1cm a l'impression ET je ne sais pas du tout comment faire si on peux m'aider sa serait cool merci d'avance a ceux qui pourront m'aider

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,181 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales