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 werte anzeigen (https://www.delphipraxis.net/53563-tchart-werte-anzeigen.html)

renekr 19. Sep 2005 05:32


TChart werte anzeigen
 
Hi,
Kann mir jemand sagen wie ich bei dem TChart bei onclick oder ev auch wenn man nur mit der Maus über den Wert geht ,den Wert ev im Hint anzeigen zu lassen.

Danke.

BrunoT 19. Sep 2005 07:11

Re: TChart werte anzeigen
 
Hallo René,

ich weiss zwar nicht, welche Tchart-Version du hast, aber es sollte so gehn:

Delphi-Quellcode:
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
  Var
  i:Integer;
begin
  chart1.ShowHint:=True;
  For i:=0 To Chart1.SeriesCount-1 do
  If Chart1.Series[i].GetCursorValueIndex >0 Then
 Chart1.Hint:=(Chart1.Series[i].ValueMarkText[Chart1.Series[i].GetCursorValueIndex]);
end;
mfg

BrunoT

renekr 19. Sep 2005 08:19

Re: TChart werte anzeigen
 
Hi,
Danke für die rasche Antwort.
Also ich benutze den normalen Chart in der Delphi 2005 Version.

Ich befülle ihn mit 3 Serien ( Punkt Serien ).

Ich will wenn man den Chart Move ( click benötige ich ja für den Zoom ) ( einen wert,egal welche Serie( also alle 3 )) das er dann im Hint anzeigt den Seriennamen,Y Value,X Spaltenbeschriftung.

HAbe das von dir probiert ,aber er bringt immer fehler Listenindex überschreitet maximun -1. oder halt keinen wert.

marabu 19. Sep 2005 09:33

Re: TChart werte anzeigen
 
Hallo René,

ich würde es ungefähr so machen:

Delphi-Quellcode:
interface
...
type
  TMainForm = class(TForm)
    TheChart: TChart;
    ActionButton: TButton;
    procedure FormCreate(Sender: TObject);
  private
    procedure ActionButtonClick(Sender: TObject);
    procedure AppShowHint(var HintStr: string; var CanShow: boolean; var HintInfo: THintInfo);
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.ActionButtonClick(Sender: TObject);
var
  bs: TBarSeries;
  i: integer;
begin
  bs := TBarSeries.Create(myChart);
  TheChart.AddSeries(bs);
  with bs do begin
    Add(40, 'labelA', clRed);
    Add(50, 'labelB', clGreen);
    Add(70, 'labelC', clBlue);
    Add(30, 'labelD', clYellow);
  end;
  with bs do
    for i := 0 to Count - 1 do
      XLabel[i] := IntToStr(i * 100);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := AppShowHint;
end;

procedure TMainForm.AppShowHint(var HintStr: string; var CanShow: boolean;
  var HintInfo: THintInfo);
var
  part: TChartClickedPart;
  index: integer;
  c: TChart;
  cs: TChartSeries;
begin
  if (hintinfo.HintControl is TChart) then
  begin
    c := TChart(HintInfo.HintControl);
    c.CalcClickedPart(HintInfo.CursorPos, part);
    if Assigned(part.ASeries) then begin
      cs := part.ASeries;
      index := cs.GetCursorValueIndex;
      if index >= 0 then
        HintStr := cs.YValueToText(cs.YValues[index]);
      HintInfo.ReshowTimeout := 50;
    end;
  end;
end;

end.
Grüße vom marabu

ValueMarkText() durch YValueToText() ersetzt

BrunoT 19. Sep 2005 10:28

Re: TChart werte anzeigen
 
Hallo René,

Das mit dem Listenindex liegt an Deinem anderen Code. Ich habe das noch einmal unter D2005 getestet und noch mal abgeändert, da das falsche angezeigt wurde.

Delphi-Quellcode:
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  Var
  i:Integer;
begin
  chart1.ShowHint:=True;
  For i:=0 To Chart1.SeriesCount-1 do
  If Chart1.Series[i].GetCursorValueIndex >=0 Then
    Chart1.Hint:=Chart1.Series[i].YValueToText(Chart1.Series[i].YValues[Chart1.Series[i].GetCursorValueIndex])
  else
    Chart1.Hint:='';
end;

@marabu: :gruebel: warum verwendest du den Hint der Application? Bei ClickPart fällt ja die Schleife weg(kannte ich noch nicht) :mrgreen:

marabu 19. Sep 2005 10:47

Re: TChart werte anzeigen
 
Hallo Holger,

Zitat:

Zitat von BrunoT
warum verwendest du den Hint der Application?

wenn du damit Application.ShowHint meinst, dann deshalb:

Delphi-Quellcode:
...
HintInfo.ReshowTimeout := 50;
...
Ich weiß momentan nicht, wie ich die Aktualisierung des Hint anders sicherstellen kann. Standardmäßig aktualisiert die VCL das hint window ja nur, wenn ich vorher mit der Maus die Komponente verlasse. Kennst du eine einfachere Methode?

marabu

BrunoT 19. Sep 2005 11:28

Re: TChart werte anzeigen
 
@marabu,

1. die Frage war nicht so gemeint, dass ich Deine weisen (-Marabu-) Fähigkeiten in Frage gestellt habe. :oops:
2. nein, kenne ich nicht, da ich folgendes nicht wusste.
Zitat:

Standardmäßig aktualisiert die VCL das hint window ja nur, wenn ich vorher mit der Maus die Komponente verlasse.
Ich habe mich mit Hints noch gar nicht beschäftigt, da ich solche^^ Informationen eigentlich immer in der Statusbar anzeige. Da habe ich keine Verweildauer :stupid:.

Aber: mein Quelltext geht auch! :mrgreen: und aktualisiert sich! :gruebel:

mfg

BrunoT

marabu 19. Sep 2005 11:59

Re: TChart werte anzeigen
 
Holger, ich bin erst durch deinen Code auf die Idee gekommen nach einer Lösung zu forschen. Natürlich funktioniert dein Ansatz über das Ereignis OnMouseMove(). Mir fiel nur auf, dass dabei (der value mit dem index 0 unterschlagen und) das hint window nicht aktualisiert wurde. Zum Testen habe ich ein Balken Diagramm verwendet. Wenn ich die Maus von einem zum nächsten Balken führe ohne die Komponente zu verlassen, dann wird nur der zuerst von der Maus erfasste Value im hint window angezeigt. Wenn das bei dir wirklich anders ist, dann suche ich mir schonmal einen Besen zum fressen...

marabu

renekr 19. Sep 2005 12:02

Re: TChart werte anzeigen
 
Hi @,
erstmal Danke schön das Ihr so schnell Antwortet.

HAbe das von marabu getestet und folgendes festgestellt:

Ich habe wie gesagt 3 Serien :
Y Value 50-150 ca.
X gebe ich keine Value mit,sondern setze nur den Text mit 2005 KW : 41 zb.:

Wenn ich auf 1 Serie gehe kommt der Wert im Hint bei den anderen 2 die X Beschriftung .

MAch i da was falsch?

Danke.

marabu 19. Sep 2005 12:17

Re: TChart werte anzeigen
 
Hallo René,

ich habe, als ich bei Holger abgeschrieben habe, einen Fehler mit abgeschrieben (mich so reinzulegen - das merke ich mir). Ich habe die notwendige Änderung an meinem Code angebracht.

marabu

BrunoT 19. Sep 2005 12:34

Re: TChart werte anzeigen
 
@marabu,

das mit dem ersten Wert war mein Fehler:
Delphi-Quellcode:
  If Chart1.Series[i].GetCursorValueIndex >=0 Then
natürlich fängt ja der Index mit 0 an. :oops: :oops: :oops: (ein Fehlerder mir immer wieder passiert, und schon Stunden der Fehlersuche gekostet hat.)
Das mit der Aktualisierung trifft zu. Ich habe, um die Wartezeit zu verkürzen, geklickt und damit warscheinlich ein refresh ausgelöst, lass also den Besen da wo er ist.

@renekr

[da war ein roter Kasten von marabu->] :mrgreen:
mit marks geht das leider daneben habe ich auch bemerkt, nimm lieber die YValues:
Delphi-Quellcode:
Hint:=Chart1.Series[i].YValueToText(Chart1.Series[i].YValues[Chart1.Series[i].GetCursorValueIndex]);

Mfg
BrunoT

renekr 19. Sep 2005 20:39

Re: TChart werte anzeigen
 
WOW:
Ihr 2 seit die größten.
Very Big Thanks von mir.
Ich hoff ich kann euch auch mal so schnell und Kompetent helfen.
Ich habe seit Samstag das Komplette Internet durchsucht und mich wund gegoogelt ohne Erfolg.

Also nochmal Danke von meiner Seite.

Werd jetzt noch ein bisschen dran feilen,damit ich im hint die Y Value angezeigt bekomt,den Serien namen,und den X Name dazu,dann ist es 1000 % perfect.

renekr 2. Okt 2005 14:34

Re: TChart werte anzeigen
 
Hi,
ich hoffe ihr 2 könnt mir nochmals kurz hekfen:

Habe folgenden Hint gebastelt:

HintStr :=cs.ValueMarkText[index]+' -- '+cs.YValueToText(cs.YValues[index])+' % -- Gruppe :'+cs.Title;

Ich habe 3 Series:

Serie 0 zeigt folgenden Hint an:
2005 KW :19 -- 96 % -- Gruppe : Mittelwert von Basis

Serie 1 zeigt folgenden Hint an:
96 -- 96 % -- Gruppe : Mittelwert von Sound

Serie 2 zeigt folgenden Hint an:
2005 KW :19 -- 96 % -- Gruppe : Mittelwert alle Gruppen


Warum zeigt der Hint beim 2 .Chart als cs.ValueMarkText[index] den Wert in der Y achse an? und nicht wie bei den 2 andeen Serien die Beschriftung der X Achse.
Was ist da falsch?
Füllen tue ich den Chart bei allen Gleich. 100 %ig.

Danke.

marabu 2. Okt 2005 15:23

Re: TChart werte anzeigen
 
Hallo René,

hast du Code, mit dem ich dein Problem auf meiner Maschine nachstellen kann? Am liebsten ein kleines Stück, welches nur das Problem zeigt - nicht gleich dein ganzes Projekt...

Ansonsten denke ich, dass du vielleicht den Markertext bei allen Punkten initialisiert hast, nur bei Serie 1 nicht - deshalb erhältst du dort 96 als Defaultwert.

Grüße vom marabu

renekr 2. Okt 2005 18:38

Re: TChart werte anzeigen
 
Hi,
also wie gesagt ich habe folgendes:
ONCREATE:
Application.OnShowHint := AppShowHint;

procedure TForm1.AppShowHint(var HintStr: string; var CanShow: boolean;
var HintInfo: THintInfo);
var
part: TChartClickedPart;
index: integer;
c: TChart;
cs: TChartSeries;
begin
if (hintinfo.HintControl is TChart) then
begin
c := TChart(HintInfo.HintControl);
c.CalcClickedPart(HintInfo.CursorPos, part);
if Assigned(part.ASeries) then begin
cs := part.ASeries;
index := cs.GetCursorValueIndex;
if index >= 0 then
HintStr :=cs.ValueMarkText[index]+' -- '+cs.YValueToText(cs.YValues[index])+' % -- Gruppe :'+cs.Title;
HintInfo.ReshowTimeout := 50;
end;
end;
end;

chart befülle:

chart2.Series[2].Add(StrToInt(KW_Leistung_2005_MW[i]),IntToStr(2005)+' KW :'+IntToStr(i), clYellow);

Der Hint muß so aussehn:
2005 KW :19 -- 96 % -- Gruppe : Mittelwert von Basis
wenn er falsch ist sieht er so aus:
96 -- 96 % -- Gruppe : Mittelwert von Sound

96 steht für den Wert in der Y Achse wo ich drauf bin,der variert auch ds geht,aber er sollte eigentlich die X Beschriftung anzeigen und nicht den Y Wert.


// Die Charts befülle ich immer so in einer For 1:= do.. schleife

Ich habe 2 Charts beide glecih,
Function zum befüllen des Charts ist Identisch und denoch ist bei Chart 1 Serie 2 der Hint falsch:
Im chart2 Serie2 ist er korrekt,obwohl die selbe Funktion zum befüllen dahinter steckt.

wie kann das sein.
Komisch ist das bei Chart 2 alles ok ist?!?!?!

marabu 2. Okt 2005 19:34

Re: TChart werte anzeigen
 
Laut Dokumentation übergibst du einen XLabel als zweiten Parameter der Methode Add() beim Befüllen deiner ChartSeries. Wenn du auf diesen Wert im Ereignis OnShowHint zugreifen willst, dann so:

Delphi-Quellcode:
...
HintStr := cs.XLabel[index] + ' -- ' + cs.YValueToText(cs.YValues[index])
  + ' % -- Gruppe :' + cs.Title;
...
Du kannst die cs.XLabel aber auch getrennt setzen. Eine letzte Möglichkeit zur Bestimmung von MarkText ist das Ereignis ChartSeries.OnGetMarkText - bei dieser Methode kann der Anzeigetext erzeugt werden, wenn er gebraucht wird - just in time.
Du musst prüfen, ob du an irgendeiner Stelle deine vermeintlich korrekt gesetzten Anzeigetexte überschreibst, indem du eine dieser Alternativen verwendest.

marabu

PS: Im Regelfall gilt natürlich XLabel[i] = ValueMarkText[i], aber der Zugriff über XLabel ist bei deiner Art des Befüllens semantisch sauberer.

renekr 2. Okt 2005 20:39

Re: TChart werte anzeigen
 
Hi,
man du bist der größte,ich habe mit Charts erst vor ner Woche angefangen und dank dir alles hinbekommen was ich wollte.

Das mit XLabel ging perfekt.
Mich wundert es nur, das es in 1.chart nciht ging und im 2 Chart geht.

Naja mit dem XLabel geht alles und ist besser.

Danke.

renekr 21. Jun 2007 09:17

Re: TChart werte anzeigen
 
Hi marabu,
Ich hoffe du kannst mir nochmal kurz helfen?

Ich habe ja das Appshowhint in dem Oncreate drin.
Damit mache ich die Hints beim TChart damit ich die Werte angezeigt bekomme.

Nun will oder muss ich von TMSSoftware das advstringgrid verwenden das auch einen OfficeHint hat.
Der sieht anderst aus und man kann noch nette sachen damit machen und darstellen lassen.

Mein Problem :
Folgende Konstellation:

Delphi-Quellcode:
OnCreate: Application.OnShowHint:=AppShowHint;
Das hat dann zur Auswirkung das der Office hint für das Advstringgrid nicht geht.
Wenn ich das weg mache dann geht er wieder aber dafür mein TChart Hint logischeerweise nicht mehr.

Ich würde aber gerne alles habn also das beim TChart die AppShowHint function wirkt und beim advstringgrid der normale OfficeHint von TMS Software.


Siehst du da eine möglichkeit das hinzubekommen?

Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 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