Transférer des données d'un TChart vers une fichier texte (urgent si possible)

frenchseiya Messages postés 4 Date d'inscription mardi 11 mai 2004 Statut Membre Dernière intervention 1 juin 2004 - 26 mai 2004 à 10:56
frenchseiya Messages postés 4 Date d'inscription mardi 11 mai 2004 Statut Membre Dernière intervention 1 juin 2004 - 1 juin 2004 à 09:01
Bonjour a tous
On m'a parachuté devant delphi 6.0 pro alors que je n'avais que des notions de programmation en VB et je dois faire un programme dans lequel je dois sauvegarder dans un fichier texte des données qui se trouvent dans un TChart et je dois avouer que je suis totalement bloqué.
Si vous pouviez m'aider ca serait sympa :)
Merci d'avance

Frenchseiya

7 réponses

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
26 mai 2004 à 14:34
Hello voici comment creer et ecrire dans un fichier texte :

procedure WriteFile;
var
F : TextFile;

begin

Try
AssignFile(F,'c:\FichierTest.txt'); //Initialisation du fichier
ReWrite(F); //Creation du fichier
Writeln(F,'Essai ligne 2'); //Ecriture d'une ligne
Writeln(F,'Essai ligne 2');
Finally
CloseFile(F);
end;
end;

Si tu veux plus d'aide n'hesite pas.

Bonne prog,
JMP.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
26 mai 2004 à 18:26
Il y a un truc que je ne comprends pas : les données contenues dans les séries du TChart proviennent bien de quelque part, non ?
Alors, pourquoi ne pas les sauvegarder avant d'en faire une représentation graphique ?

Le nombre de valeurs dans les séries est-il important ?

Sinon, voici un algorithme :
1- ecrire le nombre de séries du graphique
2- pour chaque série :
- écrire le nombre de valeurs
- écrire les valeurs
Quand tu parles de fichier texte, un format est-il imposé ? (CSV ou SDF)

Sans davantage de précisions nous ne pourrons pas t'apporter de solution concrète.
May Delphi be with you
0
frenchseiya Messages postés 4 Date d'inscription mardi 11 mai 2004 Statut Membre Dernière intervention 1 juin 2004
26 mai 2004 à 19:18
Pour le fait que les données du TChart viennent de quelque part c'est bien le cas elle sont issues d'une boucle for ... to.
Par contre le nombre de valeur dans la série considéré est proche des 10000. Pour ce qui est du format texte rien ne m'est impose pour le moment.
le seul hic c'est que je dois séparer la visualisation de ma courbe de valeurs et la sauvegarde par deux boutons différents et vu ke je suis plus ke noob en matiere de programmation j'avoue que je suis totalement perdu et il est certainement dur pour vous qui etes plus inities de comprendre ce ke je veux dire vu ke vous vous attendez a des precisions ki ne me viennent pas a l'esprit.
Merci pour votre aide
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
27 mai 2004 à 00:48
Bon, on va te dépanner avec une solution minimaliste mais avec laquelle le fichier de données pourra être relu avec le bloc-notes sans problème 8-) .

Primo : sauvegarder les données du graphique

procedure SaveChartDataToTextFile(Chart: TChart;
  FileName: TFileName =  'Chart.txt');
var
  F: TextFile;
  i, j: integer;
begin
  AssignFile(F, FileName);
  try
    Rewrite(F);
    //Nombre de séries
    WriteLn(F, IntToStr(Chart.SeriesList.Count));
    //Pour chaque série
    for i := 0 to Chart.SeriesList.Count - 1 do
    begin
      //Nom de la série
      WriteLn(F, Chart.Series[i].Title);
      //Type de la série
      WriteLn(F, Chart.Series[i].ClassName);
      //Nombre de valeurs de la série
      WriteLn(F, IntToStr(Chart.Series[i].Count));
      for j := 0 to Chart.Series[i].Count - 1 do
      begin
        //Valeur de l'abcisse
        WriteLn(F, Chart.Series[i].XLabel[j]);
        //Valeur de l'ordonnée correspondante
        WriteLn(F, FloatToStr(Chart.Series[i].YValues[j]));
      end;
    end;
  finally
    CloseFile(F);
  end;
end;

Pour utiliser cette procédure en cliquant sur un bouton, par exemple en utilisant le nom de fichier par défaut :
procedure TChartDemoMainForm.btnSaveSeriesDataClick(Sender: TObject);
begin
  SaveChartDataToTextFile(Chart1);
end;


Deuxio : recharger le graphique
C'est un peu plus complexe car on doit tenir compte du type de chaque série avant d'en créer une instance.
procedure LoadChartDataFromTextFile(Chart: TChart;
  FileName: TFileName  = 'Chart.txt');
var
  F: TextFile;
  //variables de boucle
  i, j: integer;
  //nombre de séries
  SerieCountStr: string;
  SerieCount: integer;
  //Titre de la série à créer
  SerieTitle: string;
  //Type de la série à créer
  SerieType: string;
  //Nombre de valeurs de la série
  SerieNbValues: string;
  //Etiquette des abcisses
  SerieXLabel: string;
  //Valeur des ordonnées
  SerieYValue: string;
  //Série de type générique
  ChartSeries: TChartSeries;
  //Référence de classe sur un type de graphique
  ChartClass: TPersistentClass;
begin
  if not FileExists(FileName) then
    exit;

  AssignFile(F, FileName);
  try
    Reset(F);
    { Supprimer les séries éventuellement
    existantes du graphique }
    Chart.SeriesList.Clear;
    { est-ce un bug ? le composant ne se redessine
    pas en supprimant les séries }
    Chart.Invalidate;
    //Lire le nombre de séries
    ReadLn(F, SerieCountStr);
    SerieCount := StrToInt(SerieCountStr);
    for i := 0 to SerieCount - 1 do
    begin
      //Nom de la série
      ReadLn(F, SerieTitle);
      ReadLn(F, SerieType);

      //Déterminer la classe du type de série à créer
      ChartClass := GetClass(SerieType);

      //Création de la nouvelle série
      ChartSeries := TChartSeriesClass(ChartClass).Create(Chart);

      //INDISPENSABLE !
      ChartSeries.ParentChart := Chart;

      //Affectation du titre à la série
      ChartSeries.Title := SerieTitle;

      //Nombre de valeurs de la série
      ReadLn(F, SerieNbValues);
      for j := 0 to StrToInt(SerieNbValues) - 1 do
      begin
        //Lecture des valeurs
        ReadLn(F, SerieXLabel);
        ReadLn(F, SerieYValue);
        //Ajout des valeurs à la série
        ChartSeries.Add(StrToFloat(SerieYValue), SerieXLabel);
      end;
    end;
  finally
    CloseFile(F);
  end;
end;

En revanche, son usage est tout aussi simple que pour la sauvegarde (ouf ! :big) ). Ici aussi, on utilise le nom de fichier par défaut.
procedure TChartDemoMainForm.btnLoadSeriesClick(Sender: TObject);
begin
  LoadChartDataFromTextFile(Chart1);
end;


En résumé :
Comme tu n'as pas précisé le type de graphique à sauvegarder, j'ai tenu compte des contraintes minimum :
- nombre de séries
- nom des séries
- type de courbe de la série
- nombre de valeurs de chaque série, valeurs des abcisses et des ordonnées.
enfin, et surtout, pouvoir recharger les données dans le graphique pour vérification !

Pour que tu puisses utiliser un jeu de test, voici les données à sauvegarder dans un fichier texte du nom de chart.txt :

4
1:blé
TLineSeries
4
2001
41
2002
91
2003
52
2004
56
2:avoine
TLineSeries
4
2001
59
2002
49
2003
62
2004
65
3:blé
TLineSeries
4
2001
68
2002
44
2003
90
2004
43
4:orge
TLineSeries
4
2001
95
2002
62
2003
86
2004
59


Comme tu peux le constater, le contenu est lisible, même pour de pauvres humanoïdes comme nous :approve) .
Bonne chance pour la suite de ton projet.
May Delphi be with you
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
frenchseiya Messages postés 4 Date d'inscription mardi 11 mai 2004 Statut Membre Dernière intervention 1 juin 2004
27 mai 2004 à 08:58
Merci pour tout Delphiprog vous m'avez été d'un très grand secours car je ne voyais absolument pas comment faire. Je peux enfin fournir ce qu'on m'avait demandé.
Cordialement
May Delphi be with you Exe Master ;)
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
27 mai 2004 à 12:04
J'espère que les explications et les commentaires dans le code t'aideront à comprendre et à pouvoir expliquer à ton boss ta démarche.
Bonne continuation. ;)
May Delphi be with you
0
frenchseiya Messages postés 4 Date d'inscription mardi 11 mai 2004 Statut Membre Dernière intervention 1 juin 2004
1 juin 2004 à 09:01
C'est parfait tout est on ne peut plus clair.
Merci encore et bonne continuation à vous aussi.
0
Rejoignez-nous