TLineSeries zur Laufzeit mit UserDefinesChartSource erstelle

Für Fragen von Einsteigern und Programmieranfängern...
ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von ErnstVolker »

Hhmm. Wer lesen kann ist klar im Vorteil. Ich Trottel!!! Wenn man schon kopiert, dann wenigstens richtig.

Für Dein Beispiel trifft das auch vollumfänglich zu. Bei mir noch nicht ganz. Die Kurve folgt zwar jetzt der Maus, schiebt aber immer nur kleine Stückchen und irgendwann ist die Maus von der Kurve so weit weg, dass die Kurve stehen bleibt.

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von ErnstVolker »

Ich habe gerade noch was bei mir festgestellt. Und zwar hat es den Anschein, dass sich nicht die Kurve über das Chart schiebt sondern die Achsen wandern.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von wp_xyz »

Weil bei der Veränderung der Werte in der List-Source die Achsengrenzen neu berechnet werden, habe ich in dem Demo-Projekt die Achsengrenzen eingefroren (Chart.Extent - siehe Ende von FormCreate, nachdem die unverschobenen Daten in der Series sind). Wenn der grobe Rahmen der Achsengrenzen feststeht und du "schöne" Werte an den Achsengrenzen haben willst, kannst du den Extent auch im Objektinspektor setzen.

Wenn sich die Maus von der Kurve löst, ist wahrscheinlich der GrabRadius des CurveMoverTool zu klein. Ich musste auf einen Wert von 100 gehen, damit es zuverlässig läuft. Man kann auch noch weiter nach oben gehen, es hätte den Seiteneffekt (auch schon bei 100), dass keine Sicherheit mehr gegeben ist, welche Kurve beim Anklicken gewählt wird, aber nachdem du die Kurve über die Listbox auswählst und die Auswahl über AffectedSeries steuerst, macht das nicht aus. Allerdings kann man bei zu heftigen Mausbewegungen die Kurve aus dem Viewport "schubsen" - und wenn sie nicht mehr zu sehen ist, kriegt man sie auch nicht mehr rein; als Abhilfe könnte evtl. helfen, wenn MouseInsideOnly auf true gesetzt wird, so dass das Verschieben stoppt, wenn die Maus den Viewport verlässt.

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von ErnstVolker »

Aahh jetzt ja!

Hab' vielen Dank. Jetzt funzt es wie es soll. Das mit dem automatischen Berechnen der Achsen beim Schieben ist ja ganz schön, z.B. wenn man in den negativen Zeitbereich geht, aber es schiebt nicht gut. Ich hatte sowieso vor, die Achsenskalierung des Charts zur Laufzeit über SpinEdit oder FloatSpinEdit vor zu geben. Hab' ich bei Python und NSP auch so gemacht.

Vielen Dank nochmal und viele Grüße

Volker

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von ErnstVolker »

Kann man das Einfrieren der Achsengrenzen ("Chart.Extent.FixTo()") auch wieder aufheben, damit sich beim Hinzufügen einer weiteren Kurve im Diagramm die Achsengrenzen neu berechnen können?

Danke!

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von wp_xyz »

Zum Chart.Extent gehört auch "Use*"-Eigenschaften, also wenn du diese auf false setzt, passt sich das entsprechende Achsen-Ende wieder den Daten an:

Code: Alles auswählen

var
  ext: TDoubleRect;
...
  Chart1.Extent.UseYMin := false// Minimum der y-Achse lösen
  Chart1.Extent.UseYMax := false// dto für Maximum
  Chart1.AddSeries(<neue Series>);
  ext := Chart1.GetFullExtent;     // neuen Wertebereich abfragen
  Chart1.Extent.FixTo(ext);        // und wieder den Chart.Extent einfrieren
 
// oder, falls die x-Achse beibehalten werden soll, statt FixTo
  Chart1.Extent.YMax := ext.b.y;
  Chart1.Extent.YMin := ext.a.y;
  Chart1.Extent.UseYMax := true;
  Chart1.Extent.UseYMin := true;

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von ErnstVolker »

Hallo Guten Abend,

ich bin dabei einen Text an einem Datenpunkt darzustellen. Hierzu verweise ich nochmal auf den Quellcode Eingangs:

Code: Alles auswählen

function TFrm_GUI.ErzeugeSerie(AChart: TAGraph.TChart): TASeries.TLineSeries;
begin
  Result := TLineSeries.Create(AChart.Owner);
  with TLineSeries(Result) do
  begin
    Title := tb_Titel.Text;
    ShowPoints := True;
    ShowLines := True;
    LinePen.Style := psSolid;
    SeriesColor := btn_Farbe.ButtonColor;
    Pointer.Brush.Color := SeriesColor;
    Pointer.Pen.Color := SeriesColor;
    OnCustomDrawPointer := @MeineKurvePointerHandler;
    Source := @Frm_WZ.MeineChartQuelleGetChartDataItem;
  end;
  AChart.AddSeries(Result);
end;


und hänge noch einen Auszug aus der Prozedur MeineKurvePointerHandler an:

Code: Alles auswählen

procedure TFrm_GUI.MeineKurvePointerHandler(ASender: TChartSeries;
  ADrawer: IChartDrawer; AIndex: Integer; ACenter: TPoint);
const
  dx = 8;
  dy = 8;
var
  kurve: TLineSeries;
  rx, ry: Integer;
  pen: TPen;
  vMark: Array of Integer;
begin
  kurve := TLineSeries(ASender);
  rx := kurve.Pointer.HorizSize;
  ry := kurve.Pointer.VertSize;
  ADrawer.Brush := kurve.Pointer.Brush;
  ADrawer.Pen := kurve.Pointer.Pen;
  ADrawer.SetBrushColor(kurve.SeriesColor);
 
  if (AIndex = 200) then begin // Ende der Reaktionsphase (0,8 s)
     ADrawer.Ellipse(ACenter.X-rx, ACenter.Y-ry, ACenter.X+rx, ACenter.Y+ry);
     kurve.ListSource.Item[AIndex]^.Text:='Ein Wert';
  end;


Ich möchte jetzt an den markierten Datenpunkt am Index 200 noch den Beispieltext 'Ein Text' anhängen, aber der Text wird nicht angezeigt. Auch nicht nach einer kurzen Pan-Verschiebeung.
In einem Beispiel von wp_xyz kann ich den Text anfügen, er wird aber erst angezeigt nachdem man die Kurve gezoomt oder per Pan verschoben hat. Auszug Beispiel:

Code: Alles auswählen

procedure TForm1.Chart1LineSeries1CustomDrawPointer(ASender: TChartSeries;
  ADrawer: IChartDrawer; AIndex: Integer; ACenter: TPoint);
const
  dx = 8;
  dy = 8;
var
  rx, ry: Integer;
  pen: TPen;
begin
  // Hervorgehobener Datenpunkt bei s = 70
  if InRange(TLineSeries(ASender).ListSource.Item[AIndex]^.X, 69.98, 70.02) then begin
    rx := TLineSeries(ASender).Pointer.HorizSize;
    ry := TLineSeries(ASender).Pointer.VertSize;
    ADrawer.Brush := TLineSeries(ASender).Pointer.Brush;
    ADrawer.Pen := TLineSeries(ASender).Pointer.Pen;
    ADrawer.Polygon([
      Point(ACenter.X, ACenter.Y-ry),
      Point(ACenter.X+rx, ACenter.Y),
      Point(ACenter.X, ACenter.Y+ry),
      Point(ACenter.X-rx, ACenter.Y),
      Point(ACenter.X, ACenter.Y-ry)
    ], 0, 5);
    TLineSeries(ASender).ListSource.Item[AIndex]^.Text := 'Hase';
  end;


Hier wird der "Hase" ;-) am Datenpunkt angezeigt.

Auch wenn ich "kurve.Marks.Visible:=True;" noch anfüge tut sich nix.

Hat jemand eine Idee? DANKE!

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von wp_xyz »

Du musst die Datenpunkt-Labels schon beim Erzeugen der Daten für die Series festlegen, nicht erst während der Ausgabe, da ist es zu spät und wird nicht mehr berücksichtigt. Wenn du zu Beginn die x,y-Werte der Series per AddXY hinzufügst, dann gib den Text einfach als dritten Parameter an. Wenn dann LineSeries.Marks.Style auf smsLabel gesetzt ist, wird das Label automatisch ohne weiteren Code angezeigt, wobei man unter Marks noch weitere Parameter zur Formatierung findet.

Code: Alles auswählen

if LineSeries.Count = 200 then 
  LineSeries.AddXY(x, y, 'Mein Text')
else
  LineSeries.AddXY(x, y);

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von ErnstVolker »

Guten Morgen,

....Marks.Style:=smsLabel macht's schon möglich.

Code: Alles auswählen

if (AIndex = 200) then begin // Ende der Reaktionsphase (0,8 s)
     ADrawer.Ellipse(ACenter.X-rx, ACenter.Y-ry, ACenter.X+rx, ACenter.Y+ry);
     kurve.Marks.Style := smsLabel; //-->Das lässt den Textmarker erscheinen.
     kurve.ListSource.Item[AIndex]^.Text := 'Ein Wert';
     kurve.Marks.Visible := True;
  end;


Durch "OnCustomDrawPointer := @MeineKurvePointerHandler;" in "ErzeugeSerie" wird doch das Aussehen der Kurve schon beim Erzeugen beeinflusst dachte ich.

Vielen Dank für den Tipp!

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von wp_xyz »

Ich halte diesen Code für riskant. OnCustomDrawPointer wird während der Paint-Routine aufgerufen und ist dafür gedacht, lediglich das Datenpunkt-Symbol in einer Art zu zeichnen, wie es der Benutzer will. Du änderst dort jedoch auch die anzuzeigenden Daten, indem du dem Datenpunkt einen Labeltext zuweist. Das kann eine erneute Layout-Berechnung triggern - und damit eine erneute Ausgabe. Wodurch OnCustomDrawPointer erneut aufgerufen wird. Das kann gut gehen, kann aber nach künftigen Änderungen an TAChart auch anders sein.

Was spricht dagegen, den LabelText außerhalb der Paint-Methode beim Zuweisen der Daten festzulegen, so wie oben beschrieben?

Hinweis:
Der Code "kurve.ListSource.Item[Aindex]^.AText := 'Ein Wert' allein sendet noch keine Nachricht an den Chart, weshalb der neue Text erst bei der nächsten Ausgabe (z.B. nach Zoomen, Größenveränderung des Chart usw.) berücksichtigt wird. Das ist im Gegensatz zu "kurve.ListSource.SetText(AIndex, 'Ein Wert')", dessen Code am Ende ein "Notify" aufruft und damit die erneute Layout-Berechnung triggern kann.

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von ErnstVolker »

Hallo und guten Morgen,

Entschuldigung für die späte Rückmeldung. Ich hatte einiges am Projekt umgebaut und mehr Fehler als vorher ;-) Die mussten erstmal weg.

Du hast Recht. Es funktioniert auf Deine Weise zuverlässiger. Die markierten Punkte sitzen dann auch an der richtigen Stelle, bzw. werden im Chart entsprechend "an richtiger Stelle" dargestellt.

Aber der "OnCustomDrawPointer" ist noch nicht wirklich mein Freund ;-) Wie soll ich das erklären: Er bezieht sich auf alle Punkte einer Kurve und nicht nur auf den zu markierenden Punkt. Und er wirkt auf ALLE Kurven im TChart, so meine Feststellung.

Insgesamt habe ich drei unterschiedliche Marker. Den Kreis, das Polygon und den Kringel mit Kreuz. Bei einer Kurve lasse ich beim Erstellen einige Punkte entsprechend markieren. Erzeuge ich eine zweite Kurve, die Keine Markierungen enthalten soll, oder nur Kreis und Polygon, dann sind die Marker mit Kringel und Kreuz an der ersten Kurve auch wieder weg.

Es gelingt mir nicht eine Kurve zu erzeugen, die unabhängig von den anderen Kurven ihre Marker behält, so wie beim erstellen der Kurve festgelegt. Als nächster Schritt soll nämlich über eine Checkbox oder ähnlich an in der Legende ausgewählten Kurve die Marker ein- bzw. ausgeschaltet werden können.

Danke und viele Grüße

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von wp_xyz »

ErnstVolker hat geschrieben:Aber der "OnCustomDrawPointer" ist noch nicht wirklich mein Freund ;-) Wie soll ich das erklären: Er bezieht sich auf alle Punkte einer Kurve und nicht nur auf den zu markierenden Punkt. Und er wirkt auf ALLE Kurven im TChart, so meine Feststellung.

Wieso denn? Das Event kriegt den Punkt-Index mit, für den der neue Pointer gelten soll. Du musst halt nur abfragen, ob gerade der betreffende Punkt dran ist. Ein Nachteil ist, dass das Event auch die Ausgabe der anderen Punkte übernimmt - du musst also alle Punkte selbst zeichnen, auch wenn sie das Standard-Symbol haben. Wenn du nur das Standardsymbol für den betreffenden Punkt austauschen willst, ist evtl das Ereignis OnGetPointerStyle besser geeignet.

ErnstVolker hat geschrieben:Es gelingt mir nicht eine Kurve zu erzeugen, die unabhängig von den anderen Kurven ihre Marker behält, so wie beim erstellen der Kurve festgelegt. Als nächster Schritt soll nämlich über eine Checkbox oder ähnlich an in der Legende ausgewählten Kurve die Marker ein- bzw. ausgeschaltet werden können.

Bitte erstelle ein Demo-Projekt mit Dummy-Daten, sonst muss ich zuviel raten, was du konkret vorhast.

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von ErnstVolker »

Ich habe zwar kein Demo-Modell aber meinen "Problem-Code". Mit der folgenden Prozedur erzeuge ich die Serie/Kurve:

Code: Alles auswählen

procedure TFrm_GUI.ErzeugeSerie(AChart: TAGraph.TChart; Daten: Ausgabe; Berechnungsart: String; Sender: TObject);
var Kurve: TLineSeries;
   Weg, Zeit, Geschw: TVektor;
   i, j, k: Integer;
   MarkTxt: String;
begin
  if (Daten.Weg=nil) or (Daten.Zeit=nil) or (Daten.Geschwindigkeit=nil) then exit; //Absturz verhindern, wenn bei Beschleunigung  die "Daten" leer sind.
  Weg := Daten.Weg;
  Zeit := Daten.Zeit;
  Geschw := Daten.Geschwindigkeit;
  Kurve := TLineSeries.Create(AChart.Owner);
 
  if Berechnungsart='Bremsen' then
    begin
      Ind_tR := FindInd_tRtS(StrToFloat(tb_tR.Text),Zeit);
      Ind_tS := FindInd_tRtS(StrToFloat(tb_tS.Text)+StrToFloat(tb_tR.Text),Zeit); //Indexe für Reaktions- und Schwellzeit bestimmen
    end
  else begin
    Ind_tR := 0;
    Ind_tS := 0;
  end;
 
  with Kurve do
  begin
    if (Sender=btn_DarstLinks) and ((Berechnungsart='Bremsen') or (Berechnungsart='Beschleunigen')) then begin
      vMark := vKollMark(tb_vkoll.Text);
      Ind_vMark := FindeIndexVMark(vMark, Geschw);
      for i:=Low(Weg) to High(Weg) do begin
       for j:=0 to High(Ind_vMark) do begin
         if (i=Ind_vMark[j]) then begin
            MarkTxt := IntToStr(vMark[j]) + ' km/h';
            AddXY(Weg[i] - maxvalue(Weg), -Zeit[i] + maxvalue(Zeit), MarkTxt);
         end;
       end;
       if (i=Ind_tR) and (Ind_tS<>0) then begin
         AddXY(Weg[i] - maxvalue(Weg), -Zeit[i] + maxvalue(Zeit), 'tR');
       end;
       if (i=Ind_tS) and (Ind_tS<>0) then begin
         AddXY(Weg[i] - maxvalue(Weg), -Zeit[i] + maxvalue(Zeit), 'tS');
       end;
       AddXY(Weg[i] - maxvalue(Weg), -Zeit[i] + maxvalue(Zeit));
       end;
    end;
 
    if (Sender=btn_DarstLinks) and (Berechnungsart='v_const') then
      begin
        for i:=Low(Weg) to High(Weg) do begin
         Kurve.AddXY(Weg[i] - maxvalue(Weg), -Zeit[i] + maxvalue(Zeit));
        end;
      end;
// Hier muß dann obiger Quelltext für den Button Rechts hin
    Title := tb_Titel.Text;
    ShowPoints := True;
    ShowLines := True;
    LinePen.Style := psSolid;
    SeriesColor := btn_Farbe.ButtonColor;
    Pointer.Brush.Color := SeriesColor;
    Pointer.Pen.Color := SeriesColor;
    OnCustomDrawPointer := @MeineKurvePointerHandler;
    Marks.Visible := True;
    Marks.Style :=  smsLabel;
  end;
  Frm_WZ.Chart1.AddSeries(Kurve);
 end;


Und hier ist der OnCustomDrawPointer dazu:

Code: Alles auswählen

procedure TFrm_GUI.MeineKurvePointerHandler(ASender: TChartSeries;
  ADrawer: IChartDrawer; AIndex: Integer; ACenter: TPoint);
const
  dx = 8;
  dy = 8;
var
  kurve: TLineSeries;
  rx, ry, i: Integer;
  pen: TPen;
 
begin
  kurve := TLineSeries(ASender);
  rx := kurve.Pointer.HorizSize;
  ry := kurve.Pointer.VertSize;
  ADrawer.Brush := kurve.Pointer.Brush;
  ADrawer.Pen := kurve.Pointer.Pen;
  ADrawer.SetBrushColor(kurve.SeriesColor);
 
for i:=Low(vMark) to High(vMark) do begin
  if (TLineSeries(ASender).ListSource.Item[AIndex]^.Text=IntToStr(vMark[i])+' km/h') then begin // Markierung für vKoll
    pen := TPen.Create; // Wenn man den Kringel dicker zeichnen will muss ein Pen generiert werden weil man beim Pen von ADrawer kein width einstellen kann.
    //try
      pen.Assign(kurve.Pointer.Pen);
      pen.Width := 1;
      pen.Color := kurve.SeriesColor;
      ADrawer.SetBrushParams(bsClear, clNone);
      ADrawer.Pen := Pen;
      ADrawer.Ellipse(ACenter.X - dx, ACenter.Y - dy, ACenter.X + dx, ACenter.Y + dy);
    {finally
      pen.Free;
    end;
    ADrawer.Pen := kurve.Pointer.Pen;}

    rx := 3 * dx div 4;
    ry := 3 * dy div 4;
    ADrawer.Line(ACenter.X-rx, ACenter.Y, ACenter.X+rx, ACenter.Y);
    ADrawer.Line(ACenter.X, ACenter.Y-ry, ACenter.X, ACenter.Y+ry);
    pen.Free;
  end;
end;
 
if (TLineSeries(ASender).ListSource.Item[AIndex]^.Text='tS')then ADrawer.Ellipse(ACenter.X-rx, ACenter.Y-ry, ACenter.X+rx, ACenter.Y+ry);
 
if (TLineSeries(ASender).ListSource.Item[AIndex]^.Text='tR') then begin
  ADrawer.Polygon([
    Point(ACenter.X, ACenter.Y-ry),
    Point(ACenter.X+rx, ACenter.Y),
    Point(ACenter.X, ACenter.Y+ry),
    Point(ACenter.X-rx, ACenter.Y),
    Point(ACenter.X, ACenter.Y-ry)], 0, 5);
end;
end;


Cool wäre, wenn man beim Erzeugen der Kurve mit AddXY(x-Wert, y-Wert,'Text',psCircle) vorgeben könnte. Dann wäre für genau dieses x-y-Wertepaar der Text und der Marker festgelegt.

Ich erzeuge erst den Kurvenpunkt mit dem Text dazu und schaue dann in "MeineKurvePointerHandler" ob am Punkt "tR", "tS", bzw. die vMark-Markierung vorhanden ist und passe dann den Marker an.

Auf dem Bild sieht man was passiert: Zuerst habe ich die rote Beschleunigungskurve erzeugt und mit Geschwindigkeitsmarkern versehen. Danach die blaue Bremskurve. Dadurch wurden an der roten Kurve die Marker bei 5 km/h und 15 km/h weggenommen.

Das meinte ich mit:
Es gelingt mir nicht eine Kurve zu erzeugen, die unabhängig von den anderen Kurven ihre Marker behält.
Dateianhänge
Bildschirmfoto 2019-03-20 um 21.34.22.png

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von wp_xyz »

Im Prinzip, denke ich, stimmt das schon. Allerdings fallen mir folgende Punkte auf:
  • Du führst die Variable "kurve" ein, um die Schreibarbeit für "TLineSeries(Sender)" zu sparen, aber genau das machst du weiter unten.
  • In der Schleife "for i:=Low(vMark) to High(vMark)" fehlt die Behandlung des Falles, dass die Bedingung "ListSource.Item[AIndex]^.Text=IntToStr(vMark[i])+' km/h'" NICHT erfüllt ist - in diesem Fall wird dann nämlich kein Pointer-Symbol gezeichnet.
  • Wenn alle Punkte mit einem "km/h"-Label einen Kringel erhalten sollen, dann solltest du die Schleife sparen und nur auf "pos('km/h', kurve.ListSource[AIndex]^.Text) <> 0" testen

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitrag von ErnstVolker »

Guten Morgen,

vielen Dank für die Hilfe!!

pos('km/h', kurve.ListSource[AIndex]^.Text) <> 0

Damit funktioniert es wie's soll. Siehe Bild im Anhang.
Dateianhänge
Bildschirmfoto 2019-03-21 um 06.47.35.png

Antworten