TAChart: Bei Panning wird rechter Rand verschoben

Rund um die LCL und andere Komponenten
Antworten
Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

TAChart: Bei Panning wird rechter Rand verschoben

Beitrag von Michl »

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
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;  

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

Re: TAChart: Bei Panning wird rechter Rand verschoben

Beitrag von wp_xyz »

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

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;
Aber vielleicht habe ich die Frage auch nicht richtig verstanden. Muss schauen, dass ich den FPC3 wieder zum Laufen kriege...

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

Re: TAChart: Bei Panning wird rechter Rand verschoben

Beitrag von wp_xyz »

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.

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: TAChart: Bei Panning wird rechter Rand verschoben

Beitrag von Michl »

wp_xyz hat geschrieben:Jetzt läuft fpc3 wieder.
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:Meinst du, dass der rechte Rand etwas zappelt, immer wenn ein label über Rand rausragt?
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 Vorgangsbeschreibung :)
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.
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:Übrigens: zusätzlich zu dem PanDragTool würde auch ein ChartScrollbar das horizontale Scrollen erleichtern.
Da hast du Recht!

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;  


Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: TAChart: Bei Panning wird rechter Rand verschoben

Beitrag von Michl »

wp_xyz hat geschrieben:http://wiki.lazarus.freepascal.org/TAChart_documentation
...sowas :oops:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten