TLineSeries zur Laufzeit mit UserDefinesChartSource erstelle

Für Fragen von Einsteigern und Programmieranfängern...

Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

Beitragvon ErnstVolker » 12. Feb 2019, 18:25 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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: 212
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon ErnstVolker » 12. Feb 2019, 18:49 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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.
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 12. Feb 2019, 19:08 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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.
wp_xyz
 
Beiträge: 2915
Registriert: 8. Apr 2011, 08:01

Beitragvon ErnstVolker » 12. Feb 2019, 21:30 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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: 212
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon ErnstVolker » 21. Feb 2019, 09:18 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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!
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 21. Feb 2019, 16:19 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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;
wp_xyz
 
Beiträge: 2915
Registriert: 8. Apr 2011, 08:01

Beitragvon ErnstVolker » 11. Mär 2019, 20:09 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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!
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 11. Mär 2019, 22:14 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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);
wp_xyz
 
Beiträge: 2915
Registriert: 8. Apr 2011, 08:01

Beitragvon ErnstVolker » 12. Mär 2019, 06:36 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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!
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 12. Mär 2019, 10:24 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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.
wp_xyz
 
Beiträge: 2915
Registriert: 8. Apr 2011, 08:01

Beitragvon ErnstVolker » 20. Mär 2019, 08:09 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 20. Mär 2019, 10:45 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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.
wp_xyz
 
Beiträge: 2915
Registriert: 8. Apr 2011, 08:01

Beitragvon ErnstVolker » 20. Mär 2019, 21:35 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 20. Mär 2019, 22:38 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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
wp_xyz
 
Beiträge: 2915
Registriert: 8. Apr 2011, 08:01

Beitragvon ErnstVolker » 21. Mär 2019, 06:52 Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

• Themenende •
Vorherige

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried