Chart point manquant???

Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
-
Bonjour,
J'ai encore et toujours le même problème :-/
Lorsque je souhaite afficher des points représentant des données d'un stringgrid, la plus haute valeur de lea série n'est jamais affichée?!?
Les axes du chart sont sur auto et j'ai déjà testé bcp de variantes sans meilleur résultat :-(
voici un exemple rudimentaire qui illustre le problème:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VCLTee.TeEngine, VCLTee.Series,
  Vcl.ExtCtrls, VCLTee.TeeProcs, VCLTee.Chart, Vcl.Grids, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    Chart1: TChart;
    Series1: TLineSeries;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
Series1.Add(0);// facultatif
for I := 1 to 10 do
begin
if (stringGrid1.Cells[0,i]<>'')AND(stringGrid1.Cells[1,i]<>'')AND(stringGrid1.Cells[2,i]<>'') then
Series1.AddXY(StrtoFloat(stringGrid1.Cells[1,i]),StrtoFloat(stringGrid1.Cells[2,i]));
end;
series1.Active:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
stringGrid1.Cells[0,1]:='1';
stringGrid1.Cells[0,2]:='2';
stringGrid1.Cells[0,3]:='3';
stringGrid1.Cells[0,4]:='4';
stringGrid1.Cells[0,5]:='5';
stringGrid1.Cells[0,6]:='6';
stringGrid1.Cells[0,7]:='7';
stringGrid1.Cells[0,8]:='8';
stringGrid1.Cells[0,9]:='9';
stringGrid1.Cells[0,10]:='10';

stringGrid1.Cells[1,1]:='1';
stringGrid1.Cells[1,2]:='2';
stringGrid1.Cells[1,3]:='3';
stringGrid1.Cells[1,4]:='9';
stringGrid1.Cells[1,5]:='5';
stringGrid1.Cells[1,6]:='3.5';
stringGrid1.Cells[1,7]:='7';
stringGrid1.Cells[1,8]:='8';
stringGrid1.Cells[1,9]:='10.1'; //X, dans ce cas, ce point n'est pas affiché???
stringGrid1.Cells[1,10]:='9';

stringGrid1.Cells[2,1]:='1';
stringGrid1.Cells[2,2]:='2';
stringGrid1.Cells[2,3]:='3';
stringGrid1.Cells[2,4]:='8';
stringGrid1.Cells[2,5]:='5';
stringGrid1.Cells[2,6]:='3';
stringGrid1.Cells[2,7]:='7';
stringGrid1.Cells[2,8]:='8';
stringGrid1.Cells[2,9]:='10'; //dont Y
stringGrid1.Cells[2,10]:='9.5';
end;

end.

Merci pour vos idées!!!
PhilLu
Afficher la suite 

8 réponses

Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
Bonjour,

l'inconvénient de coder en dur, tu le vois maintenant...

voici un exemple d'une série de points (x,y) générés de manière aléatoire dans un StringGrid que j'affiche dans un TeeChart.

lorsque tu cliqueras sur le bouton, tu noteras que tous les points sont affichés :


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, ExtCtrls, TeeProcs, TeEngine, Chart, Series, StdCtrls;

type
TForm1 = class(TForm)
Chart1: TChart;
Comparaisongrid: TStringGrid;
Series1: TPointSeries;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);

private
procedure DisplayTeechart;
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm1;
TCoord: array of array of integer;

const

// hypothèses de départ
startcol = 1;
endcol = 4;
totalrow = 18;
nbcoord = 2;
CoordMax = 30;

implementation

{$R *.dfm}

procedure TForm1.DisplayTeechart;
var
i: integer;
begin
with series1 do
begin
Clear;
for i := 0 to Comparaisongrid.RowCount - 1 do
if (Comparaisongrid.Cells[startcol, i] <> '') and (Comparaisongrid.Cells[(endcol - 1), i] <> '') then
Series1.AddXY(StrtoFloat(Comparaisongrid.Cells[startcol, i]), StrtoFloat(Comparaisongrid.Cells[(endcol - 1), i]));
series1.Active := True;
end;
end;

procedure stocoorg;
var
i, j: integer;
begin
Setlength(TCoord, totalrow, nbcoord);
for i := 0 to (totalrow - 1) do
begin
randomize;
for j := 0 to (nbcoord - 1) do
TCoord[i, j] := Random(CoordMax);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
stocoorg;

Comparaisongrid.ColCount := endcol;
Comparaisongrid.RowCount := totalrow;
for i := 0 to totalrow - 1 do
begin
Comparaisongrid.Cells[startcol, i] := IntToStr(TCoord[i, 0]);
Comparaisongrid.Cells[(endcol - 1), i] := IntToStr(TCoord[i, 1]);
end;

DisplayTeechart;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FormCreate(Sender);
end;

end.



et tu peux modifier la ligne
TCoord[i, j] := Random(CoordMax);

par

TCoord[i, j] := Random(CoordMax) + 0.5;
et passer quelques variables en double

et tout marche bien..
Commenter la réponse de cs_cantador
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
0
Merci
Bien sûr les données étaient en dur juste pour l'exemple...

Je ne comprends toujours pas où est l'erreur dans ce code???

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
Series1.Add(0);// facultatif
for I := 1 to 10 do
begin
if (stringGrid1.Cells[0,i]<>'') AND (stringGrid1.Cells[1,i]<>'') AND (stringGrid1.Cells[2,i]<>'') then
Series1.AddXY(StrtoFloat(stringGrid1.Cells[1,i]),StrtoFloat(stringGrid1.Cells[2,i]));
end;
series1.Active:=True;
end;

Mystère!!!
Commenter la réponse de PhilLu
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
ce code fonctionne même s'il n'est pas bien écrit.
il répète indéfiniment la même séquence d'affichage d'un point se déplaçant horizontalement.

cé zoli..
mais un peu lassant..

mais comme on ne sait pas ce que tu veux obtenir
?
Commenter la réponse de cs_cantador
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
0
Merci
...en fait la droite est bien dessinée, les points y sont bien présents, sauf le dernier à droite (10.1;10)
la droite entre la valeur précédente (9;9.5) et le dernier point (10.1;10) est affichée mais pas le point (10.1;10) lui-même!?!

@cantador ce code n'a aucun intérêt sinon d'illustrer mon problème, puisque je n'ai pas la possibilité d'ajouter une copie d'écran :-(
Commenter la réponse de PhilLu
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
oui, mais ton code est bizarre..
tu mets comme condition que les cellules des trois premières colonnes ne soient pas vides..
et en plus entre la 1ère et la 10 ème rangée ?

for I := 1 to 10 do
if (stringGrid1.Cells[0, i] <> '') and
(stringGrid1.Cells[1, i] <> '') and
(stringGrid1.Cells[2, i] <> '') then

et ton grid n'est pas dimensionné ??

je sais peut-être que tout est sous entendu dans ton raisonnement mais en pratiquant de la sorte on avance pas car chaque singularité déclenche son lot d'erreurs..

il faut mettre au point le code ligne par ligne sinon les anomalies s'accumulent et on finit par ne plus rien y comprendre..
Commenter la réponse de cs_cantador
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
0
Merci
Après modification du code tjrs le même problème!
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
series1.Clear;
for i := 1 to 10 do //données lignes 1 à 10
begin
Series1.AddXY(StrtoFloat(stringGrid1.Cells[1,i]),StrtoFloat(stringGrid1.Cells[2,i]));
end;
series1.Active:=True;
end;
Commenter la réponse de PhilLu
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
quelles sont le valeurs saisies dans le Grid au moment du test ?
Commenter la réponse de cs_cantador
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
0
Merci
Bonsoir à tous!
En fait j'ai trouvé une solution:
Je répète le chargement une seconde fois et c'est ok!?!
Mais pourquoi??? aucune idée???
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
series1.Clear;
for I := 1 to 10 do
begin
if (stringGrid1.Cells[3,i]<>'x'){AND(stringGrid1.Cells[1,i]<>'')AND(stringGrid1.Cells[2,i]<>'')} then
Series1.AddXY(StrtoFloat(stringGrid1.Cells[1,i]),StrtoFloat(stringGrid1.Cells[2,i]));
if (stringGrid1.Cells[3,i]<>'x') then
Series1.AddXY(StrtoFloat(stringGrid1.Cells[1,i]),StrtoFloat(stringGrid1.Cells[2,i]));
end;
series1.Active:=True;
end;
Une idée???
Merci pour vos lumières!!!
PhilLu
Commenter la réponse de PhilLu