2009-06-25 6 views
0

Ich verwende ein TChart in Delphi 7, und ich möchte einige Balkendiagramme anzeigen. Ich verwende den folgenden Code, um die Serienwerte aus einer Datenbankabfrage einzurichten:Mouseover-Hinweis für TChart-Wert

chart1.FreeAllSeries; 

    chart1.SeriesList.Clear; 

    chart1.AddSeries(TBarSeries.Create(Self)); 
    TBarSeries(chart1.Series[0]).BarStyle:=bsRectGradient; 

    with query1 do 
    begin 
     Close; 
     Execute; 

     while not EoF do 
     begin 
      chart1.Series[0].Add(FieldAsFloat('sum_actual_days'), FieldAsString('contract_no')); 
      Next; 
     end; 

    end; 

Jeder Balken (Wert) nun das Etikett zeigt sowohl unterhalb der Bar, und in einem gelben Rechteck über der Bar.

Anstatt den Label-Wert zweimal zu wiederholen, habe ich einige zusätzliche Informationen aus der Abfrage, die ich über der Leiste anstelle der Beschriftung anzeigen möchte (oder vorzugsweise als Mouseover-Hinweis). Kann das mit dem TChart gemacht werden? Und wie... ?

Antwort

0

Es gibt das Tool "Tipps markieren", mit dem Sie einen Hinweis anzeigen können, wenn Sie über einen Balken gehen. Aber ich bin mir nicht sicher, ob Sie den Tipp ändern können, um benutzerdefinierte Daten anstelle der vordefinierten Stile anzuzeigen.

3

Dies kann mit einem TChart mithilfe des OnMouseMove-Ereignisses des Diagramms erfolgen. So etwas sollte Ihnen den Einstieg:

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
var 
    SeriesIndex: Integer; 
begin 
    SeriesIndex := Series1.Clicked(X, Y); 

    Chart1.ShowHint := SeriesIndex <> -1; 

    if Chart1.ShowHint then 
    begin 
    query1.RecNo := SeriesIndex; { this may need to be SeriesIndex + 1 } 
    Chart1.Hint := query1.FieldByName('YourFieldNameHere').AsString; 
    end; 
end; 

Natürlich ist die Abfrage, die Sie das Diagramm füllen verwendet, um noch offen sein muss für diesen Code zu arbeiten.

1

Das „Mark Tipps“ Tool bietet ein Ereignis benutzerdefinierten Text (OnGetText Ereignis) zu liefern:

procedure TForm1.ChartTool1GetText(Sender: TMarksTipTool; 
    var Text: String); 
var Index : Integer; 
begin 
    Index:=Series1.Clicked(Chart1.GetCursorPos); 

    Text:='Hello point '+IntToStr(Index); 
end; 
0

Sie ein Panel in das Diagramm setzen, und als Hinweis zu verwenden. Mit dem NearestPoint-Tool funktioniert es sehr gut.

enter image description here

Zuerst fügen Sie die NearestPoint Werkzeug auf das Diagramm (Klicken Sie doppelt auf das Diagramm, wählen Sie Extras/Add).

Dann fügen Sie ein Panel zum Diagramm (in die Chart-Komponente) und stylen Sie es nach Ihren Bedürfnissen.

dann die OnMouseMove Ereignis verwenden:

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
var i:integer; 
    px,py:integer; 

begin 
    if PtInRect(Chart1.ChartRect,Point(X,Y)) then 
    begin 
     i:=ChartTool1.GetNearestPoint(Series1,X,Y); 
     if (Series1.XValues.Count>0) and (i<Series1.Count) and (i>=0) then 
     begin 
      px:=Series1.CalcXPos(i); 
      py:=Series1.CalcYPos(i); 
      //You can add any data here to your panel, even you can put Images to it or anything else 
      Panel_Hint.Caption:=TimeToStr(Series1.XValue[i])+' • '+FloatToStrF(Series1.YValue[i],ffNumber,20,2); 
      Panel_Hint.Visible:=true; 
      Form1.Canvas.Font.Assign(Panel_Hint.Font); 
      Panel_Hint.Width:=Form1.Canvas.TextWidth(Panel_Hint.Caption)+8; 
      Panel_Hint.Left:=px-Panel_Hint.Width div 2; 
      Panel_Hint.Top:=py-Panel_Hint.Height-2; 
     end 
     else 
     Panel_Hint.Visible:=false; 
    end; 
end; 

Wenn Sie wollen, können Sie das NearestPoint Tool deaktivieren, aber wir müssen sie einfach den entsprechenden Punkt finden.

Verwandte Themen