TLineSeries zur Laufzeit mit UserDefinesChartSource erstelle
-
- Beiträge: 351
- 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
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.
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.
-
- Beiträge: 351
- 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
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.
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.
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.
-
- Beiträge: 351
- 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
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
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
-
- Beiträge: 351
- 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
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!
Danke!
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;
-
- Beiträge: 351
- 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
Hallo Guten Abend,
ich bin dabei einen Text an einem Datenpunkt darzustellen. Hierzu verweise ich nochmal auf den Quellcode Eingangs:
und hänge noch einen Auszug aus der Prozedur MeineKurvePointerHandler an:
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:
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!
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;
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;
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;

Auch wenn ich "kurve.Marks.Visible:=True;" noch anfüge tut sich nix.
Hat jemand eine Idee? DANKE!
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);
-
- Beiträge: 351
- 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
Guten Morgen,
....Marks.Style:=smsLabel macht's schon möglich.
Durch "OnCustomDrawPointer := @MeineKurvePointerHandler;" in "ErzeugeSerie" wird doch das Aussehen der Kurve schon beim Erzeugen beeinflusst dachte ich.
Vielen Dank für den Tipp!
....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;
Vielen Dank für den Tipp!
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.
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.
-
- Beiträge: 351
- 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
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
Entschuldigung für die späte Rückmeldung. Ich hatte einiges am Projekt umgebaut und mehr Fehler als vorher

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

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
Re: TLineSeries zur Laufzeit mit UserDefinesChartSource erst
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:Aber der "OnCustomDrawPointer" ist noch nicht wirklich mein FreundWie 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.
Bitte erstelle ein Demo-Projekt mit Dummy-Daten, sonst muss ich zuviel raten, was du konkret vorhast.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.
-
- Beiträge: 351
- 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
Ich habe zwar kein Demo-Modell aber meinen "Problem-Code". Mit der folgenden Prozedur erzeuge ich die Serie/Kurve:
Und hier ist der OnCustomDrawPointer dazu:
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:
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;
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;
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.
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)+' 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
-
- Beiträge: 351
- 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
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.
vielen Dank für die Hilfe!!
pos('km/h', kurve.ListSource[AIndex]^.Text) <> 0
Damit funktioniert es wie's soll. Siehe Bild im Anhang.