Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TChart Raster individuell anpassen (https://www.delphipraxis.net/192280-tchart-raster-individuell-anpassen.html)

Friday 5. Apr 2017 11:03

TChart Raster individuell anpassen
 
Hallo,
bei einem TChart (Standard von XE3) habe ich ein Raster für die X-Achsen-Werte 1, 2, 3, 4 etc.
Nun möchte ich ab einem bestimmten Wert das Raster auf z.B. <x>.2 ändern: Also 1, 2, 3, 4, 5.2, 6.2, 7.2 etc.
Ist sowas möchlich und wenn ja wie?
Das einzige was mir momentan einfällt, ist das Raster komplett zu deaktivieren und alles manuell im AfterDraw zu zeichnen. Schöner wäre es natürlich die Funktionalität der Komponente in Anspruch zu nehmen.

danke

Der schöne Günther 5. Apr 2017 15:29

AW: TChart Raster individuell anpassen
 
Der Chart hat ein
Delphi-Quellcode:
OnGetAxisLabel
-Event. Das kannst du füllen.

Friday 6. Apr 2017 12:21

AW: TChart Raster individuell anpassen
 
Danke, aber was hilft mir dieses Event? Selbst zeichnen müsste ich das Raster ja dann doch, warum dann nicht im
Delphi-Quellcode:
OnAfterDraw
Event?
Sprich was habe ich für Vorteile mit dem OnGetAxisLabel Event?

Ich hatte ja gehofft dass TChart das zeichnen des Rasters weiterhin übernehmen kann und ich nur eine Verschiebung des Rasters ab einerm gewissen X-Achsen-Wert definiere.

Der schöne Günther 6. Apr 2017 16:37

AW: TChart Raster individuell anpassen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, ich habe nicht ordentlich gelesen und dachte du wolltest nur die Achsenbeschriftung, nicht die tatsächlichen Positionen der Achsenmarkierungen anpassen. :oops:

Man scheint das einmal mit dem
Delphi-Quellcode:
OnGetNextAxisLabel
-Event machen zu können, ich durchschaue das aber ehrlich gesagt selbst nicht so wirklich.

Die andere Möglichkeit wäre, einfach alle
Delphi-Quellcode:
Items
deiner Achse zu nehmen die größer als dein Schwellwert sind und die weiter nach rechts zu rücken:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
   shiftAfterPosition = 4.0;
   shiftByValue = 0.2;
var
   axis: TChartAxis;
   itemIndex: Integer;
   itemValue: Double;
begin
   axis := Chart1.Axes.Bottom;

   for itemIndex := Pred(axis.Items.Count) downto 0 do
      if (axis.Items[itemIndex].Value > shiftAfterPosition) then begin
         itemValue := axis.Items[itemIndex].Value;
         axis.Items.Remove( axis.Items[itemIndex] );

         itemValue := itemValue + shiftByValue;
         axis.Items.Add( itemValue, axis.LabelValue(itemValue) );
      end;
end;

Friday 8. Apr 2017 20:00

AW: TChart Raster individuell anpassen
 
danke schöner Günther, das funktioniert wunderbar :thumb:

Friday 10. Apr 2017 18:31

AW: TChart Raster individuell anpassen
 
Liste der Anhänge anzeigen (Anzahl: 1)
nun habe ich doch noch eine Folge-Frage: Durch das Verschieben des Rasters habe ich an einer Stelle (bzw. sogar an zwei Stellen wegen eines Zusatz-Axen-Item) sehr eng aufeinanderfolgende Raster und damit noch viel eng aufeinanderfolgendere Minor-Ticks. Kann ich diese nicht für einen (bzw. 2) Raster-Schritt einzeln deaktivieren?

Der schöne Günther 10. Apr 2017 18:39

AW: TChart Raster individuell anpassen
 
Spontan: Nicht dass ich wüsste.

Mir fehlt ehrlich gesagt aber auch völlig die konkrete Vorstellung was du versuchst darzustellen. Vielleicht gibt es eine bessere Möglichkeit als die Achsen so durch den Wolf zu drehen...

mensch72 10. Apr 2017 19:19

AW: TChart Raster individuell anpassen
 
wenn du erklären würdest, ob es dir neben den (definierten) Werten auch um eine lineare Achse geht, oder du wie bei log. Achsen auch mit unterschiedlichen Wertedelta je geometrischer Einheit leben kannst...

Ich löse d()ein Abbildungs-Problem(zwar meist mit TMS Chart, aber habe auch eine TChartPro Variante) mit voll benutzerdefinierter Scalenpunkt-Bestimmung, also sowas wie "hScalePoint:=GetHScalePointFromValue(xValue)" und "vScalePoint:=GetVScalePointFromValue(yValue)" ... und beim "OnGetText" der Scalen, dann rückwärts "hViewValue:=GetHViewValueFromPoint(hScalePoin t)" und "vViewValue:=GetVViewValueFromPoint(vScalePoin t)".
Damit bekomme ich universell jeden beliebigen Raster(Scalen)Wert mit beliebigen korrespondierenden Realwerten hin. Ich verwende die für log, semi log und doppel log scalierte Charts, was per Default ohne etwas Handarbeit so kein Charttool kann(Y teilweise, aber keines kann z.B. quasi mathematisch reliniarisiert doppel log auf X und Y).

-> such dir Beispiele für Charts mit log. X-Achsen... da siehst du wie man eigendefiniert beliebige "optische/geometrische" Raster auf beliebige Wertebereiche vorwärts wie Rückwärts abbilden kann. Mathematisch sind log. Scalen zu berechnen, man könnte aber auch per Tabellen/Ranges manuell kummuliert abbilden... deiner Fantasie sind keine Grenzen gesetzt:)

Friday 10. Apr 2017 19:38

AW: TChart Raster individuell anpassen
 
die Achse ist an sich linear (Weg in mm), soll aber einen Umkehrpunkt haben und ab da wieder zurück auf 0 gehn. Wo dieser Umkehrpunkt genau ist, hängt von der Messung ab. In dem Beispielbild von meinem letzten Post ist der Umkehrpunkt bei 27,107 mm.
Über die Sinnhaftigkeit den gleichen Weg in umgekehrter Richtung rechts dran zu hängen statt die Messungen wieder nach links laufen zu lassen, kann man streiten. Beides hat sein für und wieder, was für meine Lösung spricht ist eine bessere Übersicht wenn viele Messungen angezeigt werden und auch noch stark streuen, da man sonst die Messungen der beiden Richtungen nicht mehr auseinander halten könnte.

Ich werde wohl dazu über gehen die Minor Ticks einfach erstmal weg lassen und evtl. bei Bedarf im
Delphi-Quellcode:
OnAfterDraw
Event Ticks "von Hand" zeichnen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz