Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Listenindex überschreitet Maximum bei TChart-Komponente (https://www.delphipraxis.net/65364-listenindex-ueberschreitet-maximum-bei-tchart-komponente.html)

Poolspieler 15. Mär 2006 18:09


Listenindex überschreitet Maximum bei TChart-Komponente
 
Hi,
ich benutze die TChart-Komponente um sehr viele Kurven auf dem Bildschirm sichtbar zu machen (es ist so eine Art Oszilloskop...)

Mein Problem:
Wenn ich auf dem Chart clicke, kommt es manchmal vor, dass folgende Meldung erscheint:

Zitat:

Listenindex überschreitet das Maximum (734)
Ich habe schon sehr viel herumprobiert:
- Zoom ausgeschaltet
- Scrollen ausgeschaltet
- Für X und Y-Achsen Automatic ausgeschaltet und feste Werte verwendet
- 3D ausgeschaltet
- Wände im Chart ausgeschaltet
- Legende Ausgeschaltet
--> kein Erfolg, der Fehler tritt immer wieder sporadisch auf

Ich habe es zumindest geschaft, den Fehler in einem kurzen Programm zu reproduzieren:
(Es befinden sich lediglich ein Start und ein Stop-Button plus eine TChart-Komponente auf der Form)
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Chart1: TChart;
    Series1: TFastLineSeries;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    machen: boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  ChartSeries_tmp: TChartSeries;
  linie_tmp: TFastLineSeries;
  linie1: TFastLineSeries;
  i, akt_index: integer;
  faktor: extended;
begin
  machen := true;

  // Linien für Chart erzeugen
  // Eventuell vorhandene Reihen im Chart löschen UND freigeben
  While Chart1.SeriesList.Count>0 do begin
    ChartSeries_tmp := Chart1.Series[0];
    Chart1.RemoveSeries(Chart1.Series[0]);
    ChartSeries_tmp.Free;
  end;

  // Reihen des Charts erzeugen, aber noch nicht anzeigen (weil clear...)
  Chart1.RemoveAllSeries();
  for i := 1 to 50 do begin
    linie_tmp := TFastLineSeries.Create(Chart1);
    linie_tmp.SeriesColor := clGray;
    Chart1.AddSeries(linie_tmp);
    linie_tmp.Clear;
  end;

  linie1 := TFastLineSeries.Create(Chart1);
  faktor := 1;

  akt_index := 0;
  while machen do begin
    if faktor >= 10 then faktor := 1;
   
    // Dummy-Werte erzeugen
    linie1.Clear;
    for I := 1 to 500 + Random(500) do begin
      linie1.AddXY(i, i*0.5*faktor);
    end;
    faktor := faktor + 0.01;

    // Im Chart Werte ausgeben
    if akt_index = 50 then akt_index := 0;  
    chart1.Series[akt_index].AssignValues(linie1);
    Application.ProcessMessages;
    inc(akt_index);
  end;

  linie1.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  machen := false;
end;

end.
Wenn man auf den Button1 klickt, werden solange Linien ausgegeben bis der Button2 gedrückt wurde.
Die Linien haben zwischen 500 und 1000 Werten.
Klickt man einfach auf dem Chart "herum" während die Linien ausgegeben werden, so kommt irgendwann obiger Fehler.
--> Der Fehler tritt NICHT auf, wenn die Anzahlt der Werte der Linien GLEICH ist (wenn also das RANDOM fehlt...)!!!

Das ist zwar eine tolle Erkenntnis, doch wie kann ich das Problem nun beheben / gibts einen Workaround???

Schon mal danke für eure Antworten,
Poolspieler

cruiser 16. Mär 2006 00:08

Re: Listenindex überschreitet Maximum bei TChart-Komponente
 
Problem ist die variable Länge im To-Argument

Delphi-Quellcode:
    // Dummy-Werte erzeugen
    linie1.Clear;
    max := 500 + Random(500);
    for I := 1 to max do begin
      linie1.AddXY(i, i*0.5*faktor);
    end;
Sollte das ganze lösen.

so ist auch sicher, dass die schleife mal endet ;)

Poolspieler 16. Mär 2006 11:11

Re: Listenindex überschreitet Maximum bei TChart-Komponente
 
Hallo Cruiser,
danke für Deine Antwort, aber meine Anwendung stellt nun mal viele Kurven mit unterschiedlicher Punktzahl dar.
In dem obigen Beispiel habe ich mit dem Random das Problem einfach simuliert und es ist schon gewollt, dass jede Kurve zwischen 500 und 1000 Punkten hat. Es steht ja nirgendwo, dass ALLE Kurven in dem Chart die gleiche Punktanzahl haben müssen - oder???

Ich werde wohl in den sauren Apfel beissen und mit die Version 7 von TChart kaufen - bzw. die Demoversion mal ausprobieren. Vielleicht ist das Problem ja damit behoben...

Gruß,
Poolspieler

cruiser 16. Mär 2006 13:48

Re: Listenindex überschreitet Maximum bei TChart-Komponente
 
[Edit:] völliger Blödsinn. Hab das mal nachgestellt und bekomm ebenfalls Index-Fehler... allerdings nur, wenn ich wie ein Bekloppter auf dem Chart herumklicke. Mal sehn... ich versuch mal Click und Double-Click zu deaktivieren down und up brauchst du ja sicher für den Zoom

Poolspieler 16. Mär 2006 14:49

Re: Listenindex überschreitet Maximum bei TChart-Komponente
 
Hi Cruiser,
nochmals danke für Deine Antwort.
Dein Einwand ist berechtigt --> Mann sollte vor der for-Schleife das Maximum berechnen.
Der Fehler liegt aber leider nicht an dem Random bzw. dieser Schleife --> Dieses Programm ist ja nur eine Reproduktion des Fehlers. In dem tatsächlichem Projekt gebe ich natürlich sinnvolle Werte und Kurven aus - und keine Zufallswerte.

Zur Info:
Ich habe mir die Evaluation Version von TeeChart Version 7 besorgt. Das Problem scheint damit behoben zu sein (sogar wenn ich die "falsche" For-Schleife benutze :wink: )
Allerdings kostet der Spaß knapp 150€ :|

Vielleicht hilft dieser Hinweis ja noch jemand anderen...

Gruß,

Poolspieler

cruiser 16. Mär 2006 15:08

Re: Listenindex überschreitet Maximum bei TChart-Komponente
 
Das passiert ausschliesslich, wenn du eine Series erwischt... hum... mal schaun, was man da machen kann.

cruiser 16. Mär 2006 16:48

Re: Listenindex überschreitet Maximum bei TChart-Komponente
 
Nicht schön, aber wirkungsvoll:

Ich hab mal zusätzlich ein Image aufgezogen, dass die selbe Grösse des Charts hat.
Im TChart.OnAfterDraw kopier ich den ganzen Schmö dann auf das Canvas vom Image:

Delphi-Quellcode:
{...}

procedure TForm1.Chart1AfterDraw(Sender: TObject);
begin
  with Chart1.Canvas do begin
    Image1.Canvas.CopyRect (
      ReferenceCanvas.ClipRect,
      ReferenceCanvas,
      ReferenceCanvas.ClipRect
    );
  end;
end;

{...}
Clicks könnte man widerum rückwärts holen, indem man auf onClick oder onMouseDown auf dem Image den Punkt am Chart abfragt. Der Zoom ist ein wenig umfangreicher, aber auch noch rekonstruierbar. Ebenso das panning. Ich hoffe das hilft (und spart die 150 €) ;)

Poolspieler 16. Mär 2006 16:54

Re: Listenindex überschreitet Maximum bei TChart-Komponente
 
Hi Cruiser,
das ist eine wirklich geniale Idee, aber ich benötige leider den kompletten Funktionsumfang der TChart-Komponente (vor allem Scrolling und Zooming). Ausserdem würde es sicherlich Performanceprobleme geben.

Ich werde mir zu 99,99% die Chartkomponente kaufen... Ich habe jetzt schon mal damit rumgespielt - und es sind wirklich ein paar tolle neue Features enthalten - ich kann das Teil bis jetzt nur empfehlen!!!

Für alle anderen: Auf www.steema.com gibts ein Update für TChart für die Unterstützung von Quick Reports - wer weiß, vielleicht sind da ja auch die einen oder anderen Bugfixes versteckt...???

Gruß,
Poolspieler

cruiser 16. Mär 2006 16:57

Re: Listenindex überschreitet Maximum bei TChart-Komponente
 
Noch mal editiert (siehe oben) aber hast dich ja entschieden ;) Performancetechnisch ist der unterschied mit dem Blossen Auge nicht zu sehn. Selbst auf meiner Altersschwachen Mühle ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz