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 Achsenkreuz hervorheben; (https://www.delphipraxis.net/156918-tchart-achsenkreuz-hervorheben%3B.html)

Linkat 20. Dez 2010 14:49


TChart Achsenkreuz hervorheben;
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Delphiprogrammierer,
in meinem Diagramm, erzeugt mit der TChart-Komponente, hätte ich gerne das Achsenkreuz mit einer fetten Linie hervorgehoben. Wer kann mir die geeignete Eigenschaft oder Methode nennen.

Zusatzfrage: Wie kann ich die x- und y-Koordinaten im Verhältnis 1:1 darstellen?

Vielen Dank!

Gruß, Linkat

Delphi 2009 pro

Linkat 22. Dez 2010 08:48

AW: TChart Achsenkreuz hervorheben;
 
Hat keiner eine Idee?

ULIK 22. Dez 2010 09:01

AW: TChart Achsenkreuz hervorheben;
 
Hier mal eine Beschreibung, was Du zur Designzeit einstellen kannst:

- im Charteditor: Chart -> Axis -> LeftAxis
- dort erst mal bei 'Scales' das 'Automatic' ausschalten
- nun bei 'Minimum' und 'Maximum' ebenso 'Auto' auschalten und die Werte setzen ('Change')
- Dann den Increment per Hand eingeben (Tab 'Increment')

- jetzt machst das gleiche für die Bottom Axis (mit identischen Werten, wenn Du eine 1-1 Darstellung haben willst; Chart muß dann allerdings auch quadratisch in der Größe sein)

- Zum Achsendicke: Left Axis, hier auf 'Tick' umschalten und dort unter 'Axis' die Strichstärke einstellen

Wenn Du alles im Code machen willst, dann mußt Dir die obigen zugehörigen Werte setzen.

Linkat 22. Dez 2010 10:42

AW: TChart Achsenkreuz hervorheben;
 
Hallo ULIK,
vielen Dank für deine Angaben.
Werde es heute oder morgen testen.
Bin gerade an einer anderen Arbeit.

Gruß, Linkat

Linkat 22. Dez 2010 15:46

AW: TChart Achsenkreuz hervorheben;
 
Habe die Anregungen von ULIK bezüglich des hervorgehobenen Achsenkreuzes getestet ,bis jetzt leider ohne Erfolg. Hat noch jemand einen Tipp?

Gruß, Linkat

ULIK 22. Dez 2010 15:51

AW: TChart Achsenkreuz hervorheben;
 
Was paßt denn nicht? Bei mir hat es schon einen Effekt gehabt.

Linkat 23. Dez 2010 13:16

AW: TChart Achsenkreuz hervorheben;
 
Hallo ULIK,
wenn ich bei beiden Achsen die Automatic abschalte, und Max und Min für left und bottom gleich setze (z.B. auf -500 / 500), so wird aber immer noch beim Verändern der Form der Maßstab verzerrt. Es fehlt mir eine Eigenschaft wie stretch = false oder autosize = false. Zwar kann man über das Verhältnis Chart1.Width zu Chart1.Height einen festen Bezug zur Größe der Form herstellen, aber durch Änderungen der Achsenbeschriftung bzw. Legende wird das Verhältnis x/y wieder verändert.

Wenn ich zur Hervorhebung der x- und y-Achsen an den Ticks die Strichstärke verändere, so werden halt nur die Ticks stärker, aber nicht die Achsen durch den Nullpunkt.
Vielleicht habe ich mich in #1 nicht deutlich genug ausgedrückt. Ich meine mit Achsenkreuz durch den Nullpunkt des Koordinatensystems.

Wer hat noch einen Tipp?

Gruß, linkat

ULIK 23. Dez 2010 13:31

AW: TChart Achsenkreuz hervorheben;
 
Liste der Anhänge anzeigen (Anzahl: 1)
Achsenhervorhebung: Du mußt auf des Ticks-Seite die Strichstärke der Achsen ändern, nicht die der Ticks: Button 'Axis...' (siehe Bild)

Skalierung: dazu fällt mir keine Eignschaft ein. Du könntest höchstens im FormResize die Skalierung bzw. die Größen neu berechnen.


Grüße,
Uli

guinnes 23. Dez 2010 14:03

AW: TChart Achsenkreuz hervorheben;
 
Zitat:

Zitat von Linkat (Beitrag 1070157)
so wird aber immer noch beim Verändern der Form der Maßstab verzerrt. Es fehlt mir eine Eigenschaft wie stretch = false oder autosize = false.

Stell das Alignment des Charts doch einfach auf alNone, dann ändert sich der Chart nicht, wenn sich die Größe der Form ändert. Zum Achsenkreuz : Selber zeichnen in OnBeforeDrawValues

Linkat 23. Dez 2010 14:55

AW: TChart Achsenkreuz hervorheben;
 
@ULIK
ich möchte nicht die Ränder BottumAxis bzw. Left Axis, sondern das Achsenkreuz durch den Ursprung (0/0) hervorheben.

@Guinnes
Mit alNone bleibt das Vehältnis zwar gleich, aber das Chart wird nicht größer. Also auch keine vernünftige Lösung.

Vielen dank für eure Hilfe, aber ich bin wegen Weihnachtspause erstmal über 2 Wochen am Programmieren mit Delphi verhindert.

Ich wünsche allen Forum-Lesern ein frohes Weihnachtsfest und alles Gute im neuen Jahr.

Vielleicht hat der eine oder andere ja noch einen Tipp für mein Problem.

Gruß, Linkat

guinnes 23. Dez 2010 15:19

AW: TChart Achsenkreuz hervorheben;
 
Zitat:

Zitat von Linkat (Beitrag 1070177)
@Guinnes
Mit alNone bleibt das Vehältnis zwar gleich, aber das Chart wird nicht größer. Also auch keine vernünftige Lösung.

Einen Tod wirst du sterben müßen. Bleibt noch alNone und im OnRezize des Forms den Chart mit ScaleBy anpassen

alzaimar 23. Dez 2010 17:15

AW: TChart Achsenkreuz hervorheben;
 
:wall:So schwer ist das doch nicht:
Sei pnChartContainer das Panel, in dem sich der Chart befindet. Das TChart ist mit Alignment=alNone eingestellt, das Panel jedoch mit alClient.

So, im OnResize des Panels nun noch:

Delphi-Quellcode:
Begin
  chart.Width := Min (pnChartContainer.Width, pnChartContainer.Height);
  chart.Height := chart.Width;
End;
Unjetestet.

ATS3788 26. Dez 2010 19:43

AW: TChart Achsenkreuz hervorheben;
 
Entschuldigung Linkat habe erst eben deine private
Mail gesehen. Ich werde mir wenn es recht ist morgen das Problem
verinnerlichen

ATS3788 26. Dez 2010 19:57

AW: TChart Achsenkreuz hervorheben;
 
Delphi-Quellcode:
Chart1.BottomAxis.Axis.Width := 10;
;


Sowas ?

Und was einst du mit 1:1

ULIK 28. Dez 2010 15:22

AW: TChart Achsenkreuz hervorheben;
 
@Linkat:

Probier's mal damit:

Delphi-Quellcode:
procedure TForm1.Chart1Resize(Sender: TObject);
var
  nMinSize: integer;
begin
  // Chart neu positionieren, dabei Verhältnis fix lassen!
  nMinSize := Min(Chart1.Height, chart1.Width);
  Chart1.ChartRect := Rect( 50, 50, nMinSize - 50 , nMinSize- 50 );

  // Legende per Hand positionieren
  Chart1.Legend.Left := chart1.ChartWidth + 75;
  Chart1.Legend.Top := chart1.ChartRect.Top;
  Chart1.Legend.Height := chart1.ChartHeight;

  // Titel neu positionieren
  Chart1.Title.Left := nMinSize div 2;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  // Daten setzen
  Series1.Clear;
  for i := 1 to 100 do
    Series1.AddXY(Random(1200) - 600, Random(1200) - 600);

 
  // hier geht ich nun davon aus, daß die beiden Achen fixierte Wertebereiche von -600 bis 600 haben!


  // Eigene Chartpositionierung
  Chart1.CustomChartRect := True; // damit wird das automatische anpassen unterbunden!
  Chart1.ChartRect := Rect( 50, 50, 300, 300 );

  // Titel per Hand positioneren
  Chart1.Title.Caption := 'Streubesitz';
  Chart1.Title.Top := 20;

  // Achsen zentrieren im Ursprung (Min/Max Werte von -600 bis 600)
  Chart1.LeftAxis.PositionUnits := muPercent;
  Chart1.LeftAxis.PositionPercent := 50;

  Chart1.BottomAxis.PositionUnits := muPercent;
  Chart1.BottomAxis.PositionPercent := 50;

  // Legende
  Chart1.Legend.Left := chart1.ChartWidth + 75;
  Chart1.Legend.Top := chart1.ChartRect.Top;
  Chart1.Legend.Height := chart1.ChartHeight;
end;
Jede Größenänderung des Formulars paßt nun den Chart so an, daß das Größenverhältnis gewahrt bleibt (vor dem ersten Resize ist Legende noch falsch positioniert, hab das nur grad nicht korrigiert --> selbst schauen). Zudem sind die Achsen im Koordinatenursprung angesiedelt (können wie schon beschreiben in der Strichstärke angepaßt werden)

Grüße,
Uli

Linkat 28. Dez 2010 23:48

AW: TChart Achsenkreuz hervorheben;
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Alzaimar,Martin und Uli,
vielen Dank für die Hilfe. Wie bereits erwähnt habe ich zur Zeit Urlaub und habe zu Hause kein Windows-PC. Ich arbeite zuhause nur noch mit Linux und programmiere mit Lazarus/FPC. Was übrigens hervorragend funktioniert.

Ich habe also ein kleines Programm in Lazarus nachgebildet.
Der Hinweis, in dem onResize-Ereignis Höhe und Breite gleichzusetzen, ist sehr gut. Der Einheitskreis ist hinreichend rund.

Hier die Form samt Einheitskreis: s. Anhang

Hier das Programm:
Delphi-Quellcode:
unit charttestu;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Buttons, ExtCtrls, TAGraph, TASeries, Math;

type

  { TForm1 }

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    btStart: TButton;
    Chart1: TChart;
    Chart1LineSeries1: TLineSeries;
    Panel1: TPanel;
    procedure btStartClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.FormResize(Sender: TObject);
begin
  Panel1.Height:=Form1.Height-40;
  Panel1.Width:=Panel1.Height;
end;

procedure TForm1.btStartClick(Sender: TObject);
var i    :integer;
    x,y  :double;
begin
  i:=0;
  Chart1LineSeries1.Clear;
  while i<360 do begin
    x:=cos(pi*i/180);
    y:=sin(pi*i/180);
    Chart1LineSeries1.AddXY(x,y);
    inc(i,15);
  end;
end;

initialization
  {$I charttestu.lrs}

end.
Es sei noch erwähnt, dass hier die Chart-Komponente in einem Panel eingebettet ist, was natürlich nicht unbedingt sein muss.

Soweit bin ich zufrieden.

Jetzt fehlt nur noch das hervorgehobene Achsenkreuz durch den Ursprung.
Wer hat noch einen Tipp?

Gruß, Linkat

ULIK 29. Dez 2010 06:19

AW: TChart Achsenkreuz hervorheben;
 
Zitat:

Zitat von Linkat (Beitrag 1070872)
Jetzt fehlt nur noch das hervorgehobene Achsenkreuz durch den Ursprung.
Wer hat noch einen Tipp?

Hast Du die Zentrierung der Achsen aus meinem letzten Code probiert? Wenn ja, was paßt daran nicht?
Delphi-Quellcode:
  // Achsen zentrieren im Ursprung (Min/Max Werte von -600 bis 600)
  Chart1.LeftAxis.PositionUnits := muPercent;
  Chart1.LeftAxis.PositionPercent := 50;

  Chart1.BottomAxis.PositionUnits := muPercent;
  Chart1.BottomAxis.PositionPercent := 50;
Es gibt ansonsten noch die Möglichkeit, direkt auf den Canvas des Charts zu zeichnen:

Delphi-Quellcode:
procedure TForm1.Chart1AfterDraw(Sender: TObject);
begin
  Chart1.Canvas.Pen.Color := clRed;
  Chart1.Canvas.MoveTo(100,100);
  Chart1.Canvas.LineTo(300,100);
end;
Könntest Dir also die Achsenkreuze zur Not selbst zeichnen (Position müßt Du halt dann auch dem ChartRect heraus bestimmen)

Grüße,
Uli

Linkat 30. Dez 2010 18:59

AW: TChart Achsenkreuz hervorheben;
 
Hallo Uli,
vielen Dank für deine Anregungen.

Die Methoden aus #17

Zitat:

// Achsen zentrieren im Ursprung (Min/Max Werte von -600 bis 600)
Chart1.LeftAxis.PositionUnits := muPercent;
Chart1.LeftAxis.PositionPercent := 50;

Chart1.BottomAxis.PositionUnits := muPercent;
Chart1.BottomAxis.PositionPercent := 50;
funktionieren nicht unter Lazarus. Ähnliche finde ich nicht.

mit deinem Beispiel-Code
Zitat:

procedure TForm1.Chart1AfterDraw(Sender: TObject);
begin
Chart1.Canvas.Pen.Color := clRed;
Chart1.Canvas.MoveTo(100,100);
Chart1.Canvas.LineTo(300,100);
end;
kann ich zwar Linien ziehen (ich teste es momentan mit Lazarus), aber nach einer Größenänderung muß die Linie entsprechend korrigiert werden.

Ich habe gehofft, dass eine eingebaute Methode von Chart existiert, mit der man das Achsenkreuz hervorheben kann.

Ich werde nach meinem Urlaub noch ein bischen mit Delphi experimentieren. Vielleicht setze ich einen 'dezenten' Kreis um den Ursprung. Mal sehen.

So nun wünsche ich allen (aktiven und passiven) Delphi-Praxis-Nutzern eine schöne Slvester-Party und ein gutes neues Jahr.

Gruß, Linkat


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

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