[gelöst] Zeitachse mit TChart

Rund um die LCL und andere Komponenten
Antworten
Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

[gelöst] Zeitachse mit TChart

Beitrag von Linkat »

Hallo,
ich möchte Messwerte mit der TChart-Komponente auf einer Zeitachse darstellen.
Sollte ungefähr so aussehen:

x-Achse: 18:00 20:00 22:00 00:00 02:00 04:00 ......

Ich weiß, es gibt die TDateTimeIntervalChartSource-Komponente. Aber trotz Wiki http://wiki.freepascal.org/TAChart_docu ... val_source und Beispiel (C:\lazarus\components\tachart\demo\axis\axisdemo) gelingt es mir nicht die Achse entsprechend einzustellen.

Kann mir vielleicht jemand eine kurze Erklärung geben oder ein "primitiv" Beispiel programmieren?

Vielen Dank,
Gruß Linkat
Zuletzt geändert von Linkat am Mo 25. Mär 2013, 11:43, insgesamt 1-mal geändert.
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

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

Re: Zeitachse mit TChart

Beitrag von wp_xyz »

Um eine Zeitachse hinzukriegen nimmt man üblicherweise eine DateTimeIntervalChartSource, die man im Objekt-Inspektor ins Feld Marks.Source derjenigen Achse einträgt, die die Zeitwerte zeigen soll. Außerdem muss man Marks.style auf smsLabel setzen, andernfalls werden die Ticks nicht als Zeit formatiert, sondern bleiben als normale Zahlen sichtbar.

Leider ist DateTimeIntervalChartSource recht eigenwillig, so dass man spezielle Wünsche (bei dir: Markierungen auf ganzen Stunden und im 2-Stunden-Abstand) meist nicht richtig hinkriegt. Falls du nicht zoomen willst, würde ich empfehlen, statt DateTimeIntervalSource eine normale ListChartSource zu verwenden. In diese ChartSource werden die Beschriftungswere eingetragen, etwa so:

Code: Alles auswählen

 
procedure TForm1.PopulateTimeSource(ASource: TListChartSource; AStartTime, AEndTime, ADelta: TTime);
var
  t: TTime;
begin
  ASource.Clear;
  t := AStartTime;
  while t <= AEndTime do begin
    ASource.Add(t, t, FormatDateTime('hh:nn', t));  // der 3.Parameter bestimmt wie die Zeiten dargestellt werden
    t := t + ADelta;
  end;
end;
 
Diese Prozedur wird aufgerufen, wenn die Daten geladen sind und der Wertebereich feststeht. Schau dir einfach mal beigefügtes Beispiel an, in dem man zwischen DateTimeIntervalChartSource und ListChartSource umschalten kann.
Dateianhänge
demo.zip
(2.83 KiB) 153-mal heruntergeladen

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Zeitachse mit TChart

Beitrag von Linkat »

Hallo wp_xyz,
vielen Dank für Deine Mühen. Ich konnte Dein Beispiel gut nachvollziehen. Ich kam allerdings bisher noch nicht dazu das Beispiel in mein Programm zu übertragen. Ich werde meine Version gelegentlich hier vorstellen, bzw. weitere Fragen stellen.


Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Zeitachse mit TChart

Beitrag von Linkat »

So, ich habe das Besispiel von wp_xyz auf das nötigste heruntergebrochen, um meine Zeitachse zu gestalten:

eine TChart und eine TDateTimeIntervalChartSource-Komponente auf die Form ziehen.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  DateTimeIntervalChartSource1.DateTimeFormat:='hh:mm';
  with Chart1.BottomAxis do begin     {BottomAxis und AxisList[1] ist das Gleiche}
  //with Chart1.AxisList[1] do begin
    Marks.Source:=DateTimeIntervalChartSource1;
  //Marks.Style.smsLabel;  {diese Zeile erzeugt einen "Error: Illegal Expression",}
    Range.Min:=0;          {deshalb im Objektinspektor Marks.Style auf smsLabel setzen}
    Range.Max:=1;          {0 bis 1 entspricht ein Tag}
    Range.UseMin:=True;
    Range.UseMax:=True;
  end;
end;
 


Man erhält jetzt eine Zeitachse von 0:00 1:00 ...... 24:00

Vielen Dank noch mal an wp_xz.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

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

Re: [gelöst] Zeitachse mit TChart

Beitrag von wp_xyz »

Ich hab's gerade nochmals getestet: Style smsLabel ist nötig, um die Uhrzeiten zu sehen, mit der Standardeinstellung wird nur der numerische Wert der Zeit gezeigt (z.B. 0.25 für 6:00), und das Umschalten der Style-Eigenschaft erzeugt keinen Fehler.

Mein Testprogramm (unter Laz 1.1, aber auch Laz 1.08) verwendet lediglich folgende Komponenten: TChart, TLineSeries, TRandomChartSource und TDateTimeIntervalChartSource, die ohne weiteren Code miteinander verbunden sind. Ich würde daher behaupten, dass das von dir beschriebene Verhalten aus dem Umfeld deines Programms kommen muss. Kannst du das Verhalten in einer kleinen Demo reproduzieren? Dann sollte man das näher untersuchen.

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: [gelöst] Zeitachse mit TChart

Beitrag von Linkat »

Hallo wp_xyz,
ich hänge hier mal den Container zu dem abgespecktem Zeitachsen-Programm an.
Wie gesagt ich verstehe nicht, warum bei:

Code: Alles auswählen

Marks.Style.smsLabel;
"ein Error: Illegal Expression"
erzeugt wird. Aber im Objektinspektor kann man die Property setzen.

Aber vielleicht kannst du eine Ungereimtheit von mir oder einen Bug finden.

Gruß, Linkat
ps: Ich nutze für dieses Projekt Win7 64 bit mit Lazarus 1.08 32 bit und FPC: 2.6.2
Dateianhänge
Zeitachse.zip
(337.68 KiB) 124-mal heruntergeladen
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

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

Re: [gelöst] Zeitachse mit TChart

Beitrag von wp_xyz »

1. Die markierte Zeile in

Code: Alles auswählen

 
    Marks.Style.smsLabel;
 
ist natürlich ein ungültiger Ausdruck: smsLabel ist eine Konstante, es fehlt der Zuweisungsoperator. Richtig wäre

Code: Alles auswählen

 
  Marks.Style := smsLabel
 
Das schluckt der Compiler allerdings nicht auf Anhieb, weil er "smsLabel" nicht findet - du musst noch TAChartUtils in die uses-Liste aufnehmen.

2. Da du somit zur Laufzeit den Marks.Style nicht geändert hast, kommt der zur Designzeit zugewiesene Wert zum Tragen. Da finde ich im Object Inspector den Wert smsLegend. Das bewirkt offenbar ebenfalls die Zeit-Formatierung der Werte. Setze ich auf den Defaultwert smsValue zurück, werden wie bei mir die numerischen Werte der Uhrzeiten angezeigt.

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: [gelöst] Zeitachse mit TChart

Beitrag von Linkat »

So, habe jetzt noch die

Code: Alles auswählen

uses TAChartUtils
ergänzt. Und schon funktioniert die Zeitachse.

Mal sehen was noch in der TAChartUtils enthalten ist.

Vielen Dank wp_xyz, jetzt ist der Thread "ganz" gelöst.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Antworten