Einzelnen Beitrag anzeigen

Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#1

Listenindex überschreitet Maximum bei TChart-Komponente

  Alt 15. Mär 2006, 19:09
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
Andreas
  Mit Zitat antworten Zitat