Tracer des graphiques

Description

Déjà tenté de tracer un graphe?

Que le contrôle Microsoft Chart est compliqué. Non seulement c'est un
OCX -avec les problèmes de distribution induits qui ont poussé MS à
s'impliquer dans la technologie .NET- mais son utilisation et surtout
sa présentation pourraient être mieux.

D'ou l'idée de gérer ses propres graphes. A cet effet,
primo: définir un format de fichier pour stocker le graphe.
secundo: écrire une fonction qui lit le fichier, charge dynamiquement
quelques contrôles ou trace quelques lignes selon le type de tracé désiré.

Pour le format de fichier, j'ai adopté l' idée de lire le fichier
une seule fois, ligne par ligne, pour remplir un tableau interne au programme.
Le fichier est divisé en deux sections:
la première comprend diverses infos qui seront affichées pour décrire le graphe.

La deuxième section contient les valeurs proprement dites, à savoir les paires description/valeur. Le séparateur est le caractère "|".

{INFOS}
0|PIB des pays européens
1|Chiffres bidon
2|juste pour tester
3|de grandes valeurs
4|Millions d'Euros

{VALEURS}
Allemagne|833558
France|852564
Italie|525854
Slovénie|65685

Ce type de fichier pourrait être stocké en binaire. Mais l' ASCII présente des
facilités pour l' édition, ainsi que pour la création: le programmeur
peut rapidement créer ce type de fichier à partir de n' importe quelle source.

Pour la fonction, voici le code intégral. Note importante pour les calculs: le ScaleMode du formulaire est en pixels,
pas en twips.

Source / Exemple :


Option Explicit
Private DESC(100) As String 'Description
Private VALS(100) As Single 'Valeur
Dim Compteur As Integer 'index du contrôle chargé, nombre de contrôle chargés
Dim idMAX As Byte ' index de celui qui a valeur maximale du tableau de valeurs

Private Sub Cmd1_Click()
   Charger_Graphe App.Path & "\cartes video.graph"
End Sub

Private Sub Charger_Graphe(Chemin_Fichier As String)
    Dim t() As String, str As String, c As String
    Dim flagINFO As Boolean, flagDATA As Boolean, n As Byte
    idMAX = 0

    If Compteur > 0 Then EffacerTout 'Efface le graphe courant d'abord
    Open Chemin_Fichier For Input As #1
     Do Until EOF(1)
     Line Input #1, str
        If str <> "" Then ' si la ligne est pas vide,
            c = Left(str, 1) 'regarde le 1er caractère de la ligne
            If c = "{" Then ' c'est un titre?
                flagINFO = IIf(str = "{INFOS}", True, False)
            Else            ' c'est une valeur
                t = Split(str, "|") ' instr() est + rapide; mais split() + pratique
                If flagINFO Then
                    LblDESCRIPTION(CByte(t(0))).Caption = t(1)
                Else
                    DESC(Compteur) = t(0)
                    VALS(Compteur) = CSng(Replace(t(1), ".", ",")) 'VB préfère les virgules
                    If VALS(Compteur) > VALS(idMAX) Then idMAX = Compteur 'leMAX = VALS(Compteur):idmax
                    Compteur = Compteur + 1
                End If
            End If
        End If
     Loop
    Close #1

    'récupère le max pour affichage
    LblMax.Caption = "Maximum: " & DESC(idMAX) & " (" & VALS(idMAX) & " " & LblDESCRIPTION(4).Caption & ")"
    'A ce stade, les deux tableaux sont pleins,ils contiennent
    ' n = Compteur items à charger, et on connait la plus grande valeur, par idMAX.
    ' Reste à choisir le type de graphe, parcourir les tableaux pour charger
    ' les contrôles et ajuster la taille de l' image grâce au taux.
    TracerType1
End Sub

Private Sub TracerType1()
    Dim RougeOuVert As Boolean 'flag qui détermine le fond: rouge ou vert
    Dim n As Byte, Taux As Single
    'Calcule le taux pour faire rentrer n' importe quelle valeur (comme
    '10 pommes ou 32554854 francs) dans 225 pixels, avec un produit en croix:
    Taux = 225 / VALS(idMAX)
    'MsgBox "1 unité (cad 1 " & LblDESCRIPTION(4).Caption & ") fait " & Taux & " pixels"

    For n = 0 To Compteur - 1
        Load Lbl(n + 1) 'DESCRIPTION
             Lbl(n + 1).Left = Lbl(0).Left
             Lbl(n + 1).Top = Lbl(0).Top + (n * 12) 'Top dépend du rang
             Lbl(n + 1).Caption = DESC(n)
             Lbl(n + 1).Visible = True
        Load Img(n + 1) 'IMAGE
             Img(n + 1).Left = Img(0).Left
             Img(n + 1).Top = Lbl(n + 1).Top + 2
             Img(n + 1).Width = VALS(n) * Taux
             Img(n + 1).Picture = IIf(RougeOuVert, ImgVERT.Picture, ImgROUGE.Picture)
             RougeOuVert = Not RougeOuVert
             Img(n + 1).Visible = True
             Img(n + 1).ToolTipText = VALS(n)
        Load lblVAL(n + 1) 'VALEUR
             lblVAL(n + 1).Left = lblVAL(0).Left
             lblVAL(n + 1).Top = Lbl(n + 1).Top
             lblVAL(n + 1).Caption = VALS(n)
             lblVAL(n + 1).Visible = True
    Next n
    'Dispose les derniers contrôles
        Ligne(0).Y2 = lblVAL(n).Top + 15
        Ligne(1).Y2 = Ligne(0).Y2
        Ligne(2).Y2 = Ligne(0).Y2
        Ligne(3).Y1 = Ligne(0).Y2
        Ligne(3).Y2 = Ligne(0).Y2
        Ligne(4).Y2 = Ligne(0).Y2
        Ligne(5).Y2 = Ligne(0).Y2
        LblDESCRIPTION(4).Top = Ligne(0).Y2 + 10
End Sub

Private Sub EffacerTout()
    Dim n As Byte
    For n = 1 To Compteur
        Unload Lbl(n)
        Unload Img(n)
        Unload lblVAL(n)
        DESC(n - 1) = ""
        VALS(n - 1) = 0
    Next n
        Compteur = 0
    LblDESCRIPTION(0).Caption = "-"
    LblDESCRIPTION(1).Caption = "-"
    LblDESCRIPTION(2).Caption = "-"
    LblDESCRIPTION(3).Caption = "-"
    LblDESCRIPTION(4).Caption = "-"
End Sub

Conclusion :


Bientôt j' ajoute deux nouveaux types de tracé, sans chargement dynamique de contrôle mais avec la méthode Line() : ligne brisée et escalier.

Codes Sources

A voir également

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.