![]() |
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. |
Re: TChart werte anzeigen
Hallo René,
ich weiss zwar nicht, welche Tchart-Version du hast, aber es sollte so gehn:
Delphi-Quellcode:
mfg
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; BrunoT |
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. |
Re: TChart werte anzeigen
Hallo René,
ich würde es ungefähr so machen:
Delphi-Quellcode:
Grüße vom marabu
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. ValueMarkText() durch YValueToText() ersetzt |
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: |
Re: TChart werte anzeigen
Hallo Holger,
Zitat:
Delphi-Quellcode:
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?
...
HintInfo.ReshowTimeout := 50; ... marabu |
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:
Aber: mein Quelltext geht auch! :mrgreen: und aktualisiert sich! :gruebel: mfg BrunoT |
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 |
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. |
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 |
Re: TChart werte anzeigen
@marabu,
das mit dem ersten Wert war mein Fehler:
Delphi-Quellcode:
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.)
If Chart1.Series[i].GetCursorValueIndex >=0 Then
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 |
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. |
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. |
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 |
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?!?!?! |
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:
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.
...
HintStr := cs.XLabel[index] + ' -- ' + cs.YValueToText(cs.YValues[index]) + ' % -- Gruppe :' + cs.Title; ... 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. |
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. |
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:
Das hat dann zur Auswirkung das der Office hint für das Advstringgrid nicht geht.
OnCreate: Application.OnShowHint:=AppShowHint;
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 10:39 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 by Thomas Breitkreuz