Chart point manquant???

PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021 - Modifié par PhilLu le 21/11/2013 à 15:43
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021 - 17 déc. 2013 à 20:58
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

8 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
22 nov. 2013 à 15:13
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..
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
22 nov. 2013 à 15:28
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!!!
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 nov. 2013 à 10:09
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
?
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
26 nov. 2013 à 22:01
...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 :-(
0

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

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 nov. 2013 à 14:34
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..
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
29 nov. 2013 à 11:23
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;
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 nov. 2013 à 13:56
quelles sont le valeurs saisies dans le Grid au moment du test ?
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
17 déc. 2013 à 20:58
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
0
Rejoignez-nous