TAChart: Bei Panning wird rechter Rand verschoben
TAChart: Bei Panning wird rechter Rand verschoben
Zur späten Stunde noch eine Frage an wp und an alle, die sich mit TACharts beschäftigen,
ich habe mal mein aktuelles TestProjekt angefügt, was soweit funktioniert. Einen Makel habe ich noch entdeckt. Wenn man mit der rechten Maustaste den sichtbaren Bereich verschiebt, dann wird der rechte Rand, je näher eine Markierung der unteren Achse an den Rand rückt nach links verschoben. Es hat wahrscheinlich etwas damit zu tun, dass zuerst die BottomAxis gezeichnet bzw. in der Größe berechnet wird (mit Beschriftung) und diese gibt die Position des rechten Randes vom Chart-Fenster vor. Kann man dieses Verhalten irgendwie abschalten/umgehen?
Danke und ein geruhsamen Abend/Morgen
Michael
ich habe mal mein aktuelles TestProjekt angefügt, was soweit funktioniert. Einen Makel habe ich noch entdeckt. Wenn man mit der rechten Maustaste den sichtbaren Bereich verschiebt, dann wird der rechte Rand, je näher eine Markierung der unteren Achse an den Rand rückt nach links verschoben. Es hat wahrscheinlich etwas damit zu tun, dass zuerst die BottomAxis gezeichnet bzw. in der Größe berechnet wird (mit Beschriftung) und diese gibt die Position des rechten Randes vom Chart-Fenster vor. Kann man dieses Verhalten irgendwie abschalten/umgehen?
Danke und ein geruhsamen Abend/Morgen
Michael
- Dateianhänge
-
TestChart.zip- (6.94 KiB) 62-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection; Re: TAChart: Bei Panning wird rechter Rand verschoben
Kann's nicht testen, weil der FPC 2.6.4 mit dem TypeHelper in deiner Demo nicht klarkommt und ich gerade keinen lauffähigen FPC3 habe.
Bei einem PanDrag-Tool könnte die Eigenschaft LimitToExtent helfen (pdLeft und pdRight setzen).
Ganz allgemein würde ich ins Chart-Ereignis OnExtentChanged oder OnExtentChanging reingehen und dort den Fall, dass der gezoomte Extent (Chart.LogicalExtent) über den ungezoomten Extent (Chart.GetFullExtent) rausragt, abfangen, also etwa so
Aber vielleicht habe ich die Frage auch nicht richtig verstanden. Muss schauen, dass ich den FPC3 wieder zum Laufen kriege...
Bei einem PanDrag-Tool könnte die Eigenschaft LimitToExtent helfen (pdLeft und pdRight setzen).
Ganz allgemein würde ich ins Chart-Ereignis OnExtentChanged oder OnExtentChanging reingehen und dort den Fall, dass der gezoomte Extent (Chart.LogicalExtent) über den ungezoomten Extent (Chart.GetFullExtent) rausragt, abfangen, also etwa so
Code: Alles auswählen
var
exl, exf: TDoubleRect;
w: Double;
begin
exl := Chart1.LogicalExtent;
exf := Chart1.GetFullExtent;
w := exl.b.x - exl.a.x;
if exl.a.x < exf.a.x then begin
exl.a.x := exf.a.x;
exl.b.x := exl.a.x + w;
end;
if ex.l.b.x > exf.b.x then begin
exl.b.x := exf.b.x;
exl.a.x := exl.b.x - w;
end;
Chart1.LogicalExtent := exl;
end;Re: TAChart: Bei Panning wird rechter Rand verschoben
Jetzt läuft fpc3 wieder.
Meinst du, dass der rechte Rand etwas zappelt, immer wenn ein label über Rand rausragt? Dazu fällt mir jetzt nur ein, dass du eine rechte y-Achse hinzufügen könntest, so dass der Label nicht mehr ins Leere ragt. (Rechtsklick auf "AxisList", "Add Item", "Alignment = calRight"). Wenn dich die Wiederholung der linken Achse stört, kannst du im Event OnMarkToText der rechten Achse "AText" auf einige Spaces setzen und so die Labels verbergen, ohne dass ihr Platzbedarf verloren geht; die Ticks kriegst du mit "TickLength"=0 weg. Jetzt stört noch, dass die rechte Achse zu Beginn vom Chart übermalt wird. Dagegen hilft - warum auch immer - den rechten Margin des Chart auf 1 zu setzen. Und hier habe ich einen Fehler in deinem Programm gefunden: jetzt läift das rechte Ende der Achse automatisch weg! Ursache ist, dass du in Chart.OnAfterPaint den "CurrentExtent" des Chart auswertest. Ich weiß nicht, wie das im Detail in dem Programm eingeht (wahrscheinlich weil SetChartFrom/SetChartTo wieder auf den Chart-Extent zurückwirken), aber verwende stattdessen den "LogicalExtent", dann ist Ruhe. Der Unterschied: LogicalExtent ist der von den Daten eingeschlossene Achsenbereich, CurrentExtent berücksichtigt auch noch die Margins.
Übrigens: zusätzlich zu dem PanDragTool würde auch ein ChartScrollbar das horizontale Scrollen erleichtern.
Meinst du, dass der rechte Rand etwas zappelt, immer wenn ein label über Rand rausragt? Dazu fällt mir jetzt nur ein, dass du eine rechte y-Achse hinzufügen könntest, so dass der Label nicht mehr ins Leere ragt. (Rechtsklick auf "AxisList", "Add Item", "Alignment = calRight"). Wenn dich die Wiederholung der linken Achse stört, kannst du im Event OnMarkToText der rechten Achse "AText" auf einige Spaces setzen und so die Labels verbergen, ohne dass ihr Platzbedarf verloren geht; die Ticks kriegst du mit "TickLength"=0 weg. Jetzt stört noch, dass die rechte Achse zu Beginn vom Chart übermalt wird. Dagegen hilft - warum auch immer - den rechten Margin des Chart auf 1 zu setzen. Und hier habe ich einen Fehler in deinem Programm gefunden: jetzt läift das rechte Ende der Achse automatisch weg! Ursache ist, dass du in Chart.OnAfterPaint den "CurrentExtent" des Chart auswertest. Ich weiß nicht, wie das im Detail in dem Programm eingeht (wahrscheinlich weil SetChartFrom/SetChartTo wieder auf den Chart-Extent zurückwirken), aber verwende stattdessen den "LogicalExtent", dann ist Ruhe. Der Unterschied: LogicalExtent ist der von den Daten eingeschlossene Achsenbereich, CurrentExtent berücksichtigt auch noch die Margins.
Übrigens: zusätzlich zu dem PanDragTool würde auch ein ChartScrollbar das horizontale Scrollen erleichtern.
Re: TAChart: Bei Panning wird rechter Rand verschoben
Das ist gut! Ich hatte zwar eben noch die Daten von einem Array of eine TFPGList umgestellt, brauch es aber nun ja nicht mehr hochladen.wp_xyz hat geschrieben:Jetzt läuft fpc3 wieder.
Ja, das finde ich störend, werde mal schauen, ob das mit zusätzlichem Platz bzw. einer zusätzlichen Achse optisch besser ist. Danke für die Vorgangsbeschreibungwp_xyz hat geschrieben:Meinst du, dass der rechte Rand etwas zappelt, immer wenn ein label über Rand rausragt?
Das ist notwendig, um nach einem Zoom oder Panning die aktuellen Grenzen in den TFloatSpinEdits anzuzeigen. Allerdings werte ich deren OnChange-Events aus, um eine Änderung dieser (vom Nutzer) wieder zurück auf die Chart-Anzeige wirken zu lassen (evtl. müsste ich noch eine boolische Variable einfügen, damit dies keine Endlosschleife wird). Danke für den Hinweis mit dem LogicalExtent!wp_xyz hat geschrieben:Und hier habe ich einen Fehler in deinem Programm gefunden: jetzt läift das rechte Ende der Achse automatisch weg! Ursache ist, dass du in Chart.OnAfterPaint den "CurrentExtent" des Chart auswertest. Ich weiß nicht, wie das im Detail in dem Programm eingeht (wahrscheinlich weil SetChartFrom/SetChartTo wieder auf den Chart-Extent zurückwirken), aber verwende stattdessen den "LogicalExtent", dann ist Ruhe. Der Unterschied: LogicalExtent ist der von den Daten eingeschlossene Achsenbereich, CurrentExtent berücksichtigt auch noch die Margins.
Da hast du Recht!wp_xyz hat geschrieben:Übrigens: zusätzlich zu dem PanDragTool würde auch ein ChartScrollbar das horizontale Scrollen erleichtern.
Weisst du eigentlich, ob es für TAChart eine Dokumentation gibt (ich würde mich da wahrscheinlich um einiges leichter tun, wenn ich nicht immer Bezeichner raten oder per Suchmaschine mögliche Lösungen testen müsste)?
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection; Re: TAChart: Bei Panning wird rechter Rand verschoben
...sowaswp_xyz hat geschrieben:http://wiki.lazarus.freepascal.org/TAChart_documentation
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;