[gelöst] Probleme mit TChart X Achsenbeschriftung

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
Bullykiffer
Beiträge: 17
Registriert: Fr 9. Aug 2024, 19:44
OS, Lazarus, FPC: Windows 10 (L 3.4.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit
Wohnort: Nordvorpommern

[gelöst] Probleme mit TChart X Achsenbeschriftung

Beitrag von Bullykiffer »

Hallo,liebe Lazarus-Gemeinde.

Ich hab ein Problemchen mit der TChart Komponente,über Tage viel Probiert,aber irgendwie laufe ich im Kreis.

Kurze Vorgeschichte:

Ich hab vor ca. 15 Jahren auf Delphi7 (Windows 2000) mal ein Tool geschrieben,welches mir die Gaspreise aus diversen
Internetseiten parst und mir aufbereitet in eine SQLite Datenbank schreibt. So weit so gut,lief auch viele Jahre ohne Probleme.
Wie es im Internet einmal so ist ändern sich URLs und vor allem der Aufbau von Internetseiten...
Da immer mehr "Quellen" nicht mehr funktionierten,musste ich das Tool zum Parsen der Daten neu schreiben. Ich habe mich für
Lazarus entschieden und angefangen nach über 10 Jahren "Programmierabstinenz" mich in die IDE etwas rein zu finden. Pro bin ich
natürlich nicht,aber ich habe das Abfragetool von Grund auf neu geschrieben und es läuft gut auf einem Server als Hintergrunddienst.
Für die Anzeige der Daten habe ich damals ein 2. Programm geschrieben - an diesem muss ich auch leider ran,da einige Quellen nicht mehr
existieren und dafür andere hinzugekommen sind. Es wäre auch die Gelegenheit endlich von dem alten 32 Bit Delphi Relikt auf etwas
aktuelleres 64 Bit umzusteigen und es mir für die Zukunft etwas Pflegeleichter zu gestalten ;)
Leider habe ich nur noch die "Unit1.pas" in meinen alten Archiven gefunden und keine Projektdateien oder ähnliches.
Da ich kein Delphi mehr nutze hätten mir die Projektdateien wohl auch nicht mehr viel geholfen...

Und nun gehen die Probleme los,da die TChart Komponente von Lazarus nicht mehr viel mit der TChart von Delphi7 gemein hat,
sondern für meinen Geschmack ziemlich aufgebläht und unübersichtlich ist.Vielleicht bin ich aber auch Alterstechnisch mit einer zu
langen Leitung gesegnet - jedenfalls werde ich mit TChart von Lazarus wohl nicht mehr warm.

Bei Delphi 7 habe ich die Series z.B.

Code: Alles auswählen

Series1.AddY(fdquery1.Fields[2].AsFloat,FDQuery1.Fields[5].asstring);
aufgefüllt.
Der erste Wert war der Gaspreis und der zweite Wert war ein String mit dem Datum im Format YYYY-MM-DD .
Im Delphi 7 Chart war dann eine Linie für die Preise und die X Achse hatte unten dann das Datum stehen,
wie im folgendem Bild:
altes Tool.png
altes Tool.png (57.83 KiB) 876 mal betrachtet
Und das bekomme ich mit Lazarus TChart einfach nicht hin. Egal was ich Probiert habe,es werden unten in der X Achse immer Zahlen
oder gar nichts angezeigt. Somit fehlt mir der Datumsbezug zum Preis - was die Sache recht sinnlos macht. Es bringt mir nicht wirklich
was,wenn ich bei 1900 Einträgen unten in der X Achse eine Beschriftung von 1 bis 1900 habe. Also wollte ich ganz schlau sein,und habe die
MARK Option genutzt,aber dann bleibt von der Kurve nichts mehr zu sehen,wie im folgendem Bild. Also auch keine Option...
neues Tool.png
neues Tool.png (49.4 KiB) 876 mal betrachtet
neues ToolmMarks.png
neues ToolmMarks.png (60.94 KiB) 876 mal betrachtet
Mittlerweile habe ich mich so festgefahren,das ich mich im Kreis drehe und keinerlei Erfolge mehr erreiche.
Finde ich irgendwie deprimierend...

Bei Lazarus kann ich die Werte wie früher bei Delphi mit

Code: Alles auswählen

Series1.AddY(SQLQuery1.Fields[0].AsFloat,SQLQuery1.Fields[3].asstring);
hinzufügen,
hab aber auch mit AddXY und AddX usw. umherprobiert,aber letztendlich immer das gleiche Problem: Kein Datum auf der unteren X Achsenbeschriftung.
In den Optionen für TChart und den TLineSeries hab ich vermutlich so viel umherprobiert,das ich es wohl "Kaputt Optimiert" habe.

Da ich jetzt unter Betriebsblindheit leide,die Frage an die Leute hier,welche mit TChart und Co. nicht auf Kriegsfuß stehen.

Muss ich die Daten der TLineSeries irgendwie anders zufügen,oder gibt es bei den Optionen von TChart oder TLineSeries irgendwelche Optionen,die unbedingt
beachtet werden müssen? Wenn ich bei Series1 z.B. smsLabel arbeite,zeigt er gar nichts an,obwohl ich ja mit dem Datum bei jedem Eintrag ein "Label" übergeben habe.

Ich möchte eigentlich kein Hexenwerk,mir reicht es völlig aus,wenn es genauso angezeigt wird,wie früher mit dem Delphi Programm.

Hat jemand hilfreiche Tipps für mich? Ich bedanke mich schon einmal im voraus...

Cya de Bullykiffer
Zuletzt geändert von Bullykiffer am Mo 12. Aug 2024, 19:54, insgesamt 1-mal geändert.

paweld
Beiträge: 85
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Probleme mit TChart X Achsenbeschriftung

Beitrag von paweld »

für "Bottom Axis" den Wert der Eigenschaft "Style" von "smsValue" in "smsLabel" ändern
Dateianhänge
2024-08-11 07_44_21-Chart.png
2024-08-11 07_44_21-Chart.png (47.37 KiB) 866 mal betrachtet
Grüße / Pozdrawiam
paweld

Benutzeravatar
Bullykiffer
Beiträge: 17
Registriert: Fr 9. Aug 2024, 19:44
OS, Lazarus, FPC: Windows 10 (L 3.4.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit
Wohnort: Nordvorpommern

Re: Probleme mit TChart X Achsenbeschriftung

Beitrag von Bullykiffer »

Hallo Paweld,
danke für deinen Tipp,das hatte ich allerdings schon in mehrfacher Form getestet.
Mit dieser Einstellung sieht es dann so aus:
Screenshot 2024-08-11 162559.png
Screenshot 2024-08-11 162559.png (45.75 KiB) 850 mal betrachtet
Wie man sieht,sieht man nichts :(

paweld
Beiträge: 85
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Probleme mit TChart X Achsenbeschriftung

Beitrag von paweld »

Ein einfaches Beispiel ist beigefügt
Dateianhänge
project1.zip
(2.88 KiB) 48-mal heruntergeladen
Przechwytywanie.PNG
Przechwytywanie.PNG (63.27 KiB) 833 mal betrachtet
Grüße / Pozdrawiam
paweld

Benutzeravatar
Bullykiffer
Beiträge: 17
Registriert: Fr 9. Aug 2024, 19:44
OS, Lazarus, FPC: Windows 10 (L 3.4.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit
Wohnort: Nordvorpommern

Re: Probleme mit TChart X Achsenbeschriftung

Beitrag von Bullykiffer »

Danke ;)

Ich werde es mir morgen Abend einmal ansehen,muss nacher gleich zur Nachtschicht...

Ich melde mich mit dem Ergebnis dann schnellstmöglich zurück.

Cya de Bullykiffer

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

Re: Probleme mit TChart X Achsenbeschriftung

Beitrag von wp_xyz »

Während in Delphi's TeeChart Funktionalität vor allem über die Properties des TChart zur Verfügung gestellt wird, sind die Entwickler von TAChart den anderen Weg des Baukastensystems gegangen, das heißt, man muss sich für bestimmte Funktionalitäten die entsprechende Komponenten aufs Formular klicken. Das ist sicher für den Einstieg etwas schwierig, aber immerhin gibt es eine sehr umfangreiche Dokumentation (https://wiki.lazarus.freepascal.org/TAC ... umentation) sowie mehrere Tutorials (z.B. https://wiki.lazarus.freepascal.org/TAC ... ng_started, andere sind dort verlinkt).

Zu deinem Problem mit der Zeitachse: Du fügst die Datenpunkte mit der Series-Methode AddY(ywert, label) ein, wobei label ein String mit dem Datumswert ist. Das finde ich unpraktisch und sogar problematisch. Denn bei AddY (oder Add) werden als x-Werte jedes Datenpunkts dessen Index verwendet. Dadurch werden alle Datenpunkte äquidistant, und du hast ein Problem wenn einmal ein Datumswert fehlt.

Besser wäre es, die Datenwerte mit x und y anzugeben, also mit AddXY(datum, y), wobei datum nun der TDateTime-Wert wäre, den du aus der Datenbank mit FDQuery1.Fields[5].AsDateTime erhältst. Das Label kannst du als optionalen dritten Parameter weglassen.

Nun sind die Datenpunkte nicht mehr äquidistant, sondern in richtigen Abständen. Es kommt dafür ein neues Problem: TChart weiß nicht, dass die x-Werte ein Datum darstellen und zeigt nur den numerischen Datumswert an, für heute wäre das die Zahl 45515.

Um die richtigen Datumswerte anzuzeigen, musst du eine TDateTimeIntervalChartSource auf das Formular setzen und es in der Eigenschaft Marks.Source der BottomAxis eintragen. Außerdem musst du Marks.Style der BottomAxis auf smsLabel setzen. Das war's schon. OK - nur im Prinzip, denn üblicherweise setzt die Achse diese Labels zu nahe aneinander, so dass sie überlappen. Du kannst sie - wie von paweld bezeigt - um 90° drehen (Chart.BottomAxis.Marks.LabelFont.Orientation = 900 (das sind Zehntel Grad). Oder du kannst den Parameter Params.MaxLength der DateTimeIntervalChartSource höher ansetzen, der Wert 100 oder 120 sieht oft gut aus. Hier musst du einfach ein bisschen herumspielen.

Falls du darauf bestehst, die Punkt-Indizes für die x-Werte zu verwenden, oder auch und falls du, nicht wie in Zvoni's Beispiel, ein anderes Label für die Datenpunkbeschriftung benötigst, kannst du auch einen Handler für das OnGetMarkText-Ereignis der BottomAxis schreiben, der in der Achsenbeschriftung den Index gegen einen Datumsstring ersetzt. Z.B. so:

Code: Alles auswählen

procedure TForm1.Chart1AxisList1GetMarkText(Sender:TObject;var AText:String;
  AMark:Double);
begin
  AText := FormatDateTime('yyyy-mm-dd', EncodeDate(2024,08,01) + Round(AMark));
end;  
AMark ist hier der Default-Beschriftungswert, also 0, 1, 2, etc. Und AText gibt den Text an, der als Beschriftung eingesetzt werden soll.

In Zvoni's Beispiel kannst du die ListChartSource weglassen und die Werte direkt in die interne ChartSource der Series schreiben; das OnGetMarkText-Ereignis sorgt dann für die richtige Achsenbeschriftung mit Datumswerten:

Code: Alles auswählen

procedure TForm1.PrepareChart;
var
  i: Integer;
begin
  //Chart1.BottomAxis.Marks.LabelFont.Orientation := 900;
  Chart1.BottomAxis.Intervals.MaxLength := 140;
  Chart1LineSeries1.Clear;
  for i := 1 to 30 do
    Chart1LineSeries1.AddY(Random(30) + 1);
end;
In diesem Code habe ich die Senkrechtstellung der x-Achsenlabels auskommentiert. Nun überlappen die Labels wieder gehörig, aber mit Chart.BottomAxis.Intervals.MaxLength kann man erlauben, dass sie weiter voneinander entfernt sind.

Benutzeravatar
Bullykiffer
Beiträge: 17
Registriert: Fr 9. Aug 2024, 19:44
OS, Lazarus, FPC: Windows 10 (L 3.4.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit
Wohnort: Nordvorpommern

Re: [gelöst] Probleme mit TChart X Achsenbeschriftung

Beitrag von Bullykiffer »

Danke ihr beiden, jetzt läuft es ;)

Die Version von paweld mit der zusätzlichen Komponente hat tadellos funktioniert,
ich habe aber auch den Rat von wp_xyz befolgt und weise die Werte mit .AddXY() zu und habe für die X-Achse
noch die Komponente TDateTimeIntervalChartSource eingebunden. Wunderbar,mein Tag ist gerettet,also noch
einmal Herzlichen Dank an euch Retter ;)

Beide Varianten arbeiten wie gewünscht.

Cya de Bullykiffer

Antworten