IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Problème d'affichage de graphes !


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut Problème d'affichage de graphes !
    Bonjour,

    j'ai une application dans laquelle j'ai des graphes à l'intérieur d'un tabcontrol.
    Des données arrivent sur le port USB et j'affiche celles ci dans mes graphes.
    Les données peuvent venir de source différente (numéro de série différent) donc j'affiche ces données dans un graphe d'un onglet différent dans le tabcontrol.
    Ceci fonctionne bien mais j'aimerai que les onglets ne changent pas automatiquement : c'est à dire que lorsque l'utilisateur visualise les données d'une source dans un onglet, qu'il reste sur le même onglet.
    J'ai plus ou moins réussi à palier ce problème (je reste sur le même onglet) mais les données des graphes se mélangent !!!

    je vous met le bout de code correspondant pour que vous compreniez mieux mon soucis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    int index = FormClient->JvgTabControlFlotteurs->Tabs->IndexOf( NomSerie );
    	if(index == -1)
    	{
    		Step_x = 1;
    		FormClient->JvgTabControlFlotteurs->Tabs->Add( NomSerie );
    		n = FormClient->JvgTabControlFlotteurs->Tabs->Count-1;
     
     
    		// La série de ChartPH
    		Serie = new TFastLineSeries(FormClient);
    		FormClient->ChartPH->Axes->Left->Automatic = true;
    		FormClient->ChartPH->Axes->Bottom->Automatic = true;
    		FormClient->ChartPH->Legend->Visible = false;
    		Serie->LinePen->Width = 2;
    		Serie->Color = clBlue;
    		FormClient->ChartPH->AddSeries(Serie);
    		Serie->AddXY(Step_x, Y1, "", clBlue);
    		FormClient->EditPH->Text = FormatFloat("0.00", (Serie->YValues->Last()));
    		FormClient->EditMoyPH->Text = FormatFloat("0.00",((Serie->YValues->Total)/(Serie->YValues->Count)));
    		//FormClient->ChartPH->Refresh();
    		//Serie->Active = true;
     
    		// La série de ChartConductivite
    		Serie = new TFastLineSeries(FormClient);
    		FormClient->ChartConductivite->Axes->Left->Automatic = true;
    		FormClient->ChartConductivite->Axes->Bottom->Automatic = true;
    		FormClient->ChartConductivite->Legend->Visible = false;
    		Serie->LinePen->Width = 2;
    		Serie->Color = clGreen;
    		FormClient->ChartConductivite->AddSeries(Serie);
    		Serie->AddXY(Step_x, Y2, "", clGreen);
    		FormClient->EditConductivite->Text = FormatFloat("0.00", (Serie->YValues->Last()));
    		FormClient->EditMoyConductivite->Text = FormatFloat("0.00",((Serie->YValues->Total)/(Serie->YValues->Count)));
    		//FormClient->ChartConductivite->Refresh();
    		//Serie->Active = true;
     
    		// La série de ChartTemperature
    		Serie = new TFastLineSeries(FormClient);
    		FormClient->ChartTemperature->Axes->Left->Automatic = true;
    		FormClient->ChartTemperature->Axes->Bottom->Automatic = true;
    		FormClient->ChartTemperature->Legend->Visible = false;
    		Serie->LinePen->Width = 2;
    		Serie->Color = clRed;
    		FormClient->ChartTemperature->AddSeries(Serie);
    		Serie->AddXY(Step_x, Y3, "", clRed);
    		FormClient->EditTemperature->Text = FormatFloat("0.0", (Serie->YValues->Last()));
    		FormClient->EditMoyTemperature->Text = FormatFloat("0.0",((Serie->YValues->Total)/(Serie->YValues->Count)));
    		//FormClient->ChartTemperature->Refresh();
    		//Serie->Active = true;
     
     
     
    		FormClient->JvgTabControlFlotteurs->TabIndex = n;
     
    		Tableau[n].EditHeure = Heure.sprintf("%02d h %02d min", Time->tm_hour, Time->tm_min);
    		FormClient->EditHeure->Text = Tableau[n].EditHeure;
     
    		Tableau[n].EditDate = laDate.sprintf("%02d.%02d.%02d", Time->tm_mday, (Time->tm_mon+1) ,(Time->tm_year+1900));
    		FormClient->EditDate->Text = Tableau[n].EditDate;
     
    		FormClient->EditNom->Text = Tableau[n].EditNom;
     
     
     
    	}
    	else
    	{
    		Tableau[n].Tab = FormClient->JvgTabControlFlotteurs->TabIndex;
     
     
    		FormClient->JvgTabControlFlotteurs->TabIndex = index;
     
     
    		Step_x++;
    		// La série de ChartPH
    		Serie = (TFastLineSeries *)FormClient->ChartPH->Series[ index ];
    		Tableau[index].Serie = Serie;
    		Serie->AddXY(Step_x, Y1, "", clBlue);
    		FormClient->EditPH->Text = FormatFloat("0.00", (Serie->YValues->Last()));
    		FormClient->EditMoyPH->Text = FormatFloat("0.00",((Serie->YValues->Total)/(Serie->YValues->Count)));
    		//FormClient->ChartPH->Refresh();
    		Serie->Active = true;
     
     
    		// La série de ChartConductivite
    		Serie = (TFastLineSeries *)FormClient->ChartConductivite->Series[ index ];
    		Serie->AddXY(Step_x, Y2, "", clGreen);
    		FormClient->EditConductivite->Text = FormatFloat("0.00", (Serie->YValues->Last()));
    		FormClient->EditMoyConductivite->Text = FormatFloat("0.00",((Serie->YValues->Total)/(Serie->YValues->Count)));
    		//FormClient->ChartConductivite->Refresh();
    		Serie->Active = true;
     
    		// La série de ChartTemperature
    		Serie = (TFastLineSeries *)FormClient->ChartTemperature->Series[ index ];
    		Serie->AddXY(Step_x, Y3, "", clRed);
    		FormClient->EditTemperature->Text = FormatFloat("0.0", (Serie->YValues->Last()));
    		FormClient->EditMoyTemperature->Text = FormatFloat("0.0",((Serie->YValues->Total)/(Serie->YValues->Count)));
    		//FormClient->ChartTemperature->Refresh();
    		Serie->Active = true;
     
    		Tableau[n].EditHeure = Heure.sprintf("%02d h %02d min", Time->tm_hour, Time->tm_min);
    		FormClient->EditHeure->Text = Tableau[index].EditHeure;
     
    		Tableau[n].EditDate = laDate.sprintf("%02d.%02d.%02d", Time->tm_mday, (Time->tm_mon+1) ,(Time->tm_year+1900));
    		FormClient->EditDate->Text = Tableau[n].EditDate;
     
    		FormClient->EditNom->Text = Tableau[n].EditNom;
     
    		FormClient->JvgTabControlFlotteurs->TabIndex = Tableau[n].Tab;
     
    		//Serie->Active = true;
    		//Serie->RefreshSeries();
     
    	}
    Merci d'avance pour votre aide !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Bonjour,

    personne n'a l'air intéressé par mon problème !

    Please help me !


  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Une simple question : les trois courbes (PH, C et T°) sont-elles étroitement dépendantes (au niveau du phénomène mesuré) ?
    Si c'est le cas on a intérêt à objétiser pour retrouver facilement les trois courbes (pour un phénomène donné) !

    A plus !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Bonjour,

    ces 3 courbes (3 charts, 1 série par chart) sont liées dans le fait que lorsque les informations d'un matériel arrivent sur le port USB : une trame comprenant les infos de PH, température, ...
    Puis, une deuxième trame arrivent sur le port USB mais avec un numéro de série différent donc nouvel onglet dans le tabcontrol avec infos de PH,température, ...
    Nouvelle trame du premier matériel (numéro de série déjà connu : onglet 1), ca bascule sur le premier onglet et ainsi de suite.

    Ce que je voudrais, c'est que ca évite de basculer les onglets : quand je visualise les données dans un des onglets (donc d'un numéro de série), je voudrai rester sur celui ci et cela sans que les données des autres numéro de série se mélangent dans mes graphes (mélange dans le même graphe des infos de température de 2 numéros de série différent : ce que je ne souhaite pas).

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Il y a quelques mois j'ai participé à une discussion sur ce forum, au sujet d'un problème similaire (Tabs + TChart + séries).

    Tu dois avoir un problème d'indexation : deux niveaux d'indexation qui ne doivent jamais interférer et qui dans ton cas ...

    Sinon ... voici comment je ferais (plus exactement, comment je viens de tester) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class jMesures : public TComponent
    {
    protected :
        void __fastcall SetActive(bool Value);
    public :
    int x;
    TLineSeries *Capteurs[3];
        __fastcall jMesures(TComponent *AOwner,int Ph, int C, int T);
        __fastcall ~jMesures();
     
        void __fastcall AddValue(int Capteur, int Value);
        void __fastcall AddValues(int Ph, int C, int T);
     
    __property bool Active={write=SetActive};
     
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    TColor Colors[] = {clBlue, clRed, clYellow, clGreen};
     
    __fastcall jMesures::jMesures(TComponent *AOwner, int Ph, int C, int T)
        : TComponent(AOwner)
    {
    Capteurs[0] = new TLineSeries(this);
    Capteurs[0]->Stairs = true;
    Form1->ChartPh->AddSeries(Capteurs[0]);
    Capteurs[0]->AddXY(x, Ph, "", Colors[ 0 ]);
     
    Capteurs[1] = new TLineSeries(this);
    Capteurs[1]->Stairs = true;
    Form1->ChartC->AddSeries(Capteurs[1]);
    Capteurs[1]->AddXY(x, Ph, "", Colors[ 1 ]);
     
    Capteurs[2] = new TLineSeries(this);
    Capteurs[2]->Stairs = true;
    Form1->ChartT->AddSeries(Capteurs[2]);
    Capteurs[2]->AddXY(x, Ph, "", Colors[ 2 ]);
     
    Active = false; // << voir le setter de la propriété Active
    }
    //--
    __fastcall jMesures::~jMesures()
    {
    }
    //-- le setter de la propriété Active
    void __fastcall jMesures::SetActive(bool Value)
    {
    for(int j = 0; j < 3; j++) Capteurs[j]->Active = Value;
    }
    //-- A ce stade je n'ai pas testé...
    void __fastcall jMesures::AddValue(int Capteur, int Value)
    {
    Capteurs[Capteur]->AddXY(x, Value, "", Colors[ Capteur ]);
    }
    //-- Ce qui a été testé
    void __fastcall jMesures::AddValues(int Ph, int C, int T)
    {
    Capteurs[0]->AddXY(x, Ph, "", Colors[0]);
    Capteurs[1]->AddXY(x, C, "",  Colors[1]);
    Capteurs[2]->AddXY(x, T, "",  Colors[2]);
    x++;
    }

    Voici comment j'ai exploité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
        // mon tabcontrol
        TTabControl *TabControl1;
     
        // mes charts
        TChart *ChartPh;
        TChart *ChartC;
        TChart *ChartT;
     
        // 4 boutons pour donner vie
        TSpeedButton *Cap1;
        TSpeedButton *Cap2;
        TSpeedButton *Cap3;
        TSpeedButton *Cap4;
     
        // pour sélectionner un tab et les séries, il faut gérer avant et après
        void __fastcall TabControl1Changing(TObject *Sender, bool &AllowChange);
        void __fastcall TabControl1Change(TObject *Sender);
     
        // va donner vie pour le test
        void __fastcall Cap1Click(TObject *Sender);
     
    private:	// Déclarations de l'utilisateur
    public:		// Déclarations de l'utilisateur
        __fastcall TForm1(TComponent* Owner);
     
        // une méthode pour donner vie
        void __fastcall ToTabControl(AnsiString NomSerie, int Ph, int C, int T);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---- partagée par les 4 Speedbuttons 
    void __fastcall TForm1::Cap1Click(TObject *Sender)
    {
    // Un nom de série + 3 valeurs aléatoires (Ph, C et T)
    ToTabControl(((TSpeedButton*)Sender)->Caption,
                     random(100), // REM : #include <stdlib.h> // pour random
                     random(100),
                     random(100));
    }
    //----
    void __fastcall TForm1::ToTabControl(AnsiString NomSerie, int Ph, int C, int T)
    {
    int index = TabControl1->Tabs->IndexOf(NomSerie);
    if(index == -1)
        {
        // La série n'existe pas donc on la crée
        TabControl1->Tabs->AddObject(NomSerie, new jMesures(this, Ph, C, T));
        // si c'est la première, on active
        if(TabControl1->Tabs->Count == 1)
            {
            ((jMesures*)TabControl1->Tabs->Objects[0])->Active = true;
            }
        }
    else
        {
        // donc ici on passe les trois mesures à la série cible
        ((jMesures*)TabControl1->Tabs->Objects[index])->AddValues(Ph, C, T);
        }
    }
    //----
    void __fastcall TForm1::TabControl1Changing(TObject *Sender,
          bool &AllowChange)
    {
    // on gère avant le changement de tab
    int n = TabControl1->TabIndex;
    if(n != -1) ((jMesures*)TabControl1->Tabs->Objects[n])->Active = false;
    }
    //----
    void __fastcall TForm1::TabControl1Change(TObject *Sender)
    {
    // on gère après le changement de tab
    int n = TabControl1->TabIndex;
    if(n != -1) ((jMesures*)TabControl1->Tabs->Objects[n])->Active = true;
    }
    //----
    Sans doute qu'il y a deux ou trois petites choses à régler ...
    TChart n'est pas un composant que j'utilise tous les jours ... donc ... !
    Mais à ce stade, ça fonctionne bien !

    A plus !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    ok, merci henderson !

    Je ne comprend pas d'où viennent tes fichiers (ton code), comment les as tu créés ?

    Tu as créé un composant ?
    Peux tu m'expliquer ta démarche plus en détails s'il te plait ?

    Merci d'avance !

Discussions similaires

  1. [JpGraph] Problème d'affichage des graph
    Par D1@blo dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/03/2013, 16h31
  2. [JpGraph] probléme d'affichage des graphes
    Par farhaenis dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 06/07/2011, 12h30
  3. [JpGraph] JPGraphe:Probléme d'affichage de graphe et export pdf
    Par farhaenis dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 06/07/2011, 10h44
  4. [1.x] Probléme d'affichage de graphe et export pdf
    Par farhaenis dans le forum Symfony
    Réponses: 0
    Dernier message: 05/07/2011, 11h58
  5. Problème d'affichage des graphes avec Tomcat
    Par _Janu_ dans le forum BIRT
    Réponses: 11
    Dernier message: 20/09/2006, 15h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo