[ERLEDIGT]TChart - Formatierungsthemen

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
Zvoni
Beiträge: 651
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

[ERLEDIGT]TChart - Formatierungsthemen

Beitrag von Zvoni »

Mahlzeit

und weiter gehts mit von mir noch nie benutzten Komponenten:

Ich hab ein TChart, in welches ich erfolgreich auch Werte einfügen konnte.
Jetzt fehlen noch die letzten "Kosmetika" (Siehe Screenshot)
1) Das rot gekringelte: Wie kann ich am Datenpunkt selbst den Y-Wert anzeigen?
2) Gelb markiert: Die X-Achsen-Beschriftung fehlt ganz. Sind bei mir Strings (Format: "1 - 2026-04-15" --> Laufende Zahl mit eine ISO-Datum)

Ich schiele schon die ganze Zeit Richtung TDbChartSource, bekomme es aber nicht hin (Falls es überhaupt der richtige Weg ist)

Falls wichtig: Hier die Schleife, wie ich die Daten zum Chart hinzufüge

Code: Alles auswählen

procedure TFormChart.DrawChart;
Var
  x:Integer;
  i:Integer;
  d:Double;
  n:String;
begin
  srcBuffer.DataSet.First;
  chtReport.ClearSeries;
  chtReport.AxisList[1].Intervals.Count:=srcBuffer.DataSet.Fields.Count-1;  //horiz. Axis
  SetLength(chtSeries, CountCategories);  //Set Length of Dynamic Array holding the individual LineSeries
  For i:=0 To CountCategories-1 Do
    Begin
      chtSeries[i]:=TLineSeries.Create(chtReport);      
      chtSeries[i].LinePen.Width:=2;
      chtSeries[i].ShowPoints:=True;
      chtSeries[i].SeriesColor:=SeriesColor[i];  
      chtReport.AddSeries(chtSeries[i]);
      For x:=0 To srcBuffer.DataSet.Fields.Count-1 Do
        Begin
          d:=srcBuffer.DataSet.Fields[x].AsFloat;
          n:=srcBuffer.DataSet.Fields[x].FieldName;
          chtSeries[i].AddXY(x,d,n);
        End;
      srcBuffer.DataSet.Next;
    end;
end;    
chart.PNG
chart.PNG (16.45 KiB) 271 mal betrachtet


Hier auch mal von Hand "so in etwa" nachgestellt in Excel
chart 2.PNG
chart 2.PNG (34.44 KiB) 256 mal betrachtet
Zuletzt geändert von Zvoni am Do 16. Apr 2026, 09:35, insgesamt 2-mal geändert.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 651
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: TChart - Formatierungsthemen

Beitrag von Zvoni »

Nachtrag zu Punkt 1: OK, scheint der Style in den Marks der Series selbst zu sein --> smsValue
Sieht aber doof aus. Muss ich noch rumspielen.....


Nachtrag zu meinem Punkt 2 oben:
ich habs jetzt immerhin schon hinbekommen, dass ich das "x" aus der Schleife als Label auf der unteren Achse bekomme
Style =smsLabelValue
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 651
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: TChart - Formatierungsthemen

Beitrag von Zvoni »

HAHA!!

FORTSCHRITT!

Und grosser Dank gebührt wp, weil ich diesen Thread gefunden hatte:
https://forum.lazarus.freepascal.org/in ... #msg453674

Und der Hinweis auf die TListChartSource war genau der richtige (Die DataPoints-TStrings manuell zu füllen)

Das einzige was jetzt noch fehlt sind zwei "Leer"-Einträge links und rechts, damit der der erste und der letzte Datenpunkt nicht auf der Kante sitzen.
Interval auf "plus 2"
und mit Series.AddNull(''); probiert, klappt aber noch nicht richtig
chart.PNG
chart.PNG (15.32 KiB) 240 mal betrachtet
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: TChart - Formatierungsthemen

Beitrag von wp_xyz »

Datenpunkt-Labels:
Für die Formatierung selbst ist die Marks-Property der Series zuständig. Series.Marks.Style gibt an, welches Datenpunkt-"Attribut" angezeigt werden soll (x-Wert, y-Wert, Custom-Labeltext, den man bei AddXY angeben kann). Man kann mehrere Elemente kombinieren (Marks.Format - siehe dazu https://wiki.lazarus.freepascal.org/TAC ... ark_labels).

Achsenbeschriftung:
Wenn du spezielle Wünsche für die Achsenbeschriftung hast, kannst du eine ChartSource dafür verwenden. In der ChartSource werden (u.a.) die X bzw. Y-Werte sowie der anzuzeigende Text gespeichert. (z.B. ChartSource.Add(x, y, labeltext)). Da du in deinem Code den Ausdruck "Series.AddXY(x, y, labeltext)" verwendest, hast du die Achsenbeschriftung quasi schon in einer Chartsource, nämlich der eingebauten ListChartSoure. Du musst nur die Eigenschaft Marks.Source der x-Achse mit der ListSource der Series verbinden (Chart1.BottomAxis.Marks.Source := chtSeries[0].ListSource) und Marks.Style auf smsLabel setzen, damit labeltext verwendet wird (Chart1.BottomAxis.Marks.Style := smsLabel). Setzt natürlich voraus, dass alle Series dieselbe x-Werte verwenden.

Nebeibei: Wenn mehrere Series dieselben x-Werte haben, kann man auch anstelle mehrerer Series eine einzige Series mit mehreren y-Werten verwenden:
- series.YCount := n (n = Anzahl der Kurven)
- Werte hinzufügen mit series.AddXYList(x, [y1, y2, y3, ..., yn], labeltext)
- Eine ChartStyles-Komponente aufs Formular setzen und mit Series.Styles verbinden.
- Doppeklick auf ChartStyles und pro y-Werte einen ChartStyle definieren; dabei kann die Farbe der Linien (Pen) und Datenpunkte (Brush) Series definiert werden. Unter "Text" den Legendeneintrag festlegen
- Series.Legend.Multiplicity auf lmStyle setzen, damit Legendeneintrag des Style in der Legende angezeigt wird.
- Wenn Series.Marks angezeigt werden sollen, unter YIndex den Wert -1 eintragen, damit jede Kurve die Marks erhält (sieht im allgemeinen "bescheuert" aus... - besser: ChartTools verwenden, so dass die Datenpunktinfo nur beim Mouse-Over kommen)
- Ich hoffe, ich habe nichts vergessen...

Platz am linken/rechten Rand:
Chart.Margins.Left/.Right vergrößern

Benutzeravatar
Zvoni
Beiträge: 651
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: TChart - Formatierungsthemen

Beitrag von Zvoni »

Hallo wp,

vielen, vielen Dank für die Hilfe.

Dieser hier:
Du musst nur die Eigenschaft Marks.Source der x-Achse mit der ListSource der Series verbinden (Chart1.BottomAxis.Marks.Source := chtSeries[0].ListSource) und Marks.Style auf smsLabel setzen, damit labeltext verwendet wird (Chart1.BottomAxis.Marks.Style := smsLabel). Setzt natürlich voraus, dass alle Series dieselbe x-Werte verwenden.
der hat mir gefehlt!

Ob ich das jetzt nochmal umbaue auf eine ChartSeries statt der 5 habe ich mich noch nicht entschieden.

Und auch Danke für die "Margins"

EDIT: Jepp. Ich konnte sogar mein BufDataset eliminieren, da ich das separate ListSource-Objekt nicht mehr brauche.
Jetzt gehts auf die Jagd nach den Chart-Tools, weil es sieht wirklich bescheuert aus mit den Datapoint-Marks
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 651
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: TChart - Formatierungsthemen

Beitrag von Zvoni »

ChartTools verwenden, so dass die Datenpunktinfo nur beim Mouse-Over kommen
OK, ChartTool-Komponente drauf, DataPointHint-Tool genommen, den OnHint-Handler geschrieben.
Hints kommen beim Mouse-Over

Nur die Position des Hints wird durch die Spitze des Mauszeigers verdeckt.

Kann man die Position des Hint-Fensters irgendwie beeinflussen?
am besten "oberhalb" der Mausspitze

EDIT: Aha. Was seh ich denn da?
zwei Events:
OnHintLocation
OnHintPosition
Hmmm.........

EDIT2:
und auch erledigt.
OnHintLocation stumpf 20 von APoint.Y abgezogen
Und fangt mir jetzt nicht mit so Schweinereien wie "DPI", "Welche Auflösung hat der User?" usw. an....
Mir egal. Basta :D

Jetzt muss ich noch herausfinden, wie ich das ganze Ding in ein PDF bekomme.
PowerPDF?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: TChart - Formatierungsthemen

Beitrag von wp_xyz »

Zvoni hat geschrieben: Do 16. Apr 2026, 09:28 EDIT: Aha. Was seh ich denn da?
zwei Events:
OnHintLocation
OnHintPosition
Hmmm.........
OnHintLocation hat einen Parameter für die Größe des Hint, so dass man nicht raten muss, wie weit das Hint-Fenster verschoben werden muss. Ursprünglich gab es aber nur OnHintPosition ohne diesen Parameter. Leider kann man in der Praxis nicht die Signatur eines Events verändern, ohne Code bei Usern zu brechen, daher wurde das erweiterte Event unter neuem Namen eingefügt. Eigentlich sollte das alte als "deprecated" markiert sein - ich weiß nicht mehr, warum das zurückgenommen wurde.
Zvoni hat geschrieben: Do 16. Apr 2026, 09:28 Jetzt muss ich noch herausfinden, wie ich das ganze Ding in ein PDF bekomme.
PowerPDF?
Ich hatte vor einiger Zeit gegonnen, einen PDFDrawer für TAChart zu schreiben, hätte mich aber dafür in die Tiefen von FpPDF einarbeiten müssen. Dieses Bündel wollte ich mir nicht aufladen, daher ist das noch unvollendet.

Du kannst natürlich in ein Bitmap (png, jpg) oder auch in ein svg zeichnen (siehe dazu Beispielprojekt "components/tachart/demo/save") und dieses ins PDF einfügen.

Benutzeravatar
Zvoni
Beiträge: 651
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: TChart - Formatierungsthemen

Beitrag von Zvoni »

wp_xyz hat geschrieben: Do 16. Apr 2026, 13:04
Zvoni hat geschrieben: Do 16. Apr 2026, 09:28 Jetzt muss ich noch herausfinden, wie ich das ganze Ding in ein PDF bekomme.
PowerPDF?
Ich hatte vor einiger Zeit gegonnen, einen PDFDrawer für TAChart zu schreiben, hätte mich aber dafür in die Tiefen von FpPDF einarbeiten müssen. Dieses Bündel wollte ich mir nicht aufladen, daher ist das noch unvollendet.

Du kannst natürlich in ein Bitmap (png, jpg) oder auch in ein svg zeichnen (siehe dazu Beispielprojekt "components/tachart/demo/save") und dieses ins PDF einfügen.
OK, Danke.... weiss ich zumindest schonmal in welche Richtung ich suchen muss.
Hab auch schon Lazreport ins Auge gefasst (weil da gibts anscheinend nen PDF-Exporter)
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7276
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: [ERLEDIGT]TChart - Formatierungsthemen

Beitrag von af0815 »

Fpreport hat auch einen PDF exporter. Geht auch headless, ist bei Datenbanken aber nicht so stark.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 651
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: [ERLEDIGT]TChart - Formatierungsthemen

Beitrag von Zvoni »

af0815 hat geschrieben: Do 16. Apr 2026, 17:16 Fpreport hat auch einen PDF exporter. Geht auch headless, ist bei Datenbanken aber nicht so stark.
Ich hatte eher mit dem Gedanken gespielt, den Canvas vom Chart direkt 1:1 ins PDF zu zeichnen (mit welchem Tool am Ende auch immer),
oder eben den Chart als Bitmap rüber zu ballern
Wobei mir da sicher noch die Skalierung reingrätschen wird, da der Plan DIN A4 quer ist, und ich das "Blatt" voll ausnutzen möchte
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten