[gelöst] Zeitachse mit TChart
-
- 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
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
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
Re: Zeitachse mit TChart
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:
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.
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;
- Dateianhänge
-
demo.zip
- (2.83 KiB) 153-mal heruntergeladen
-
- 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
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
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
-
- 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
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.
Man erhält jetzt eine Zeitachse von 0:00 1:00 ...... 24:00
Vielen Dank noch mal an wp_xz.
Gruß, Linkat
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
Re: [gelöst] Zeitachse mit TChart
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.
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.
-
- 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
Hallo wp_xyz,
ich hänge hier mal den Container zu dem abgespecktem Zeitachsen-Programm an.
Wie gesagt ich verstehe nicht, warum bei:
"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
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;
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) 125-mal heruntergeladen
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS
Re: [gelöst] Zeitachse mit TChart
1. Die markierte Zeile in
ist natürlich ein ungültiger Ausdruck: smsLabel ist eine Konstante, es fehlt der Zuweisungsoperator. Richtig wäre
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.
Code: Alles auswählen
Marks.Style.smsLabel;
Code: Alles auswählen
Marks.Style := smsLabel
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.
-
- 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
So, habe jetzt noch die
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
Code: Alles auswählen
uses TAChartUtils
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