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.
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.