2009-06-25 12 views
0

J'utilise un TChart dans Delphi 7 et je souhaite afficher certains graphiques à barres. Je suis en utilisant le code suivant pour définir les valeurs de la série d'une requête de base de données:Indice de survol de la valeur de la série TChart

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; 

Chaque barre (valeur) montre maintenant l'étiquette à la fois sous la barre, et dans un rectangle jaune au-dessus de la barre. Au lieu de répéter la valeur de l'étiquette deux fois, j'ai quelques informations supplémentaires de la requête que je voudrais montrer au-dessus de la barre au lieu de l'étiquette (ou, de préférence, comme un survol de la souris). Cela peut-il être fait avec le TChart? Et comment... ?

Répondre

0

Il existe l'outil "Conseils de marquage" qui vous permet d'afficher un conseil lorsque vous passez sur une barre. Mais je ne suis pas sûr si vous pouvez modifier la pointe pour afficher des données personnalisées au lieu des styles prédéfinis.

3

Cela peut être fait avec un TChart en utilisant l'événement OnMouseMove du diagramme. Quelque chose comme cela devrait vous aider à démarrer:

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; 

Bien sûr, la requête que vous avez utilisé pour remplir le tableau doit encore être ouvert pour que ce code fonctionne.

1

L'outil « Mark Conseils » fournit un événement pour fournir un texte personnalisé (événement OnGetText):

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

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

Vous pouvez mettre un panneau dans le graphique, et l'utiliser comme un indice. Avec l'outil NearestPoint, cela fonctionne très bien.

enter image description here

ajoutez d'abord l'outil NearestPoint au tableau (Double-cliquez sur le graphique, sélectionnez Outils/Ajouter).

Ensuite, ajoutez un panneau au graphique (dans le composant graphique) et le style en fonction de vos besoins.

Ensuite, utilisez l'événement OnMouseMove:

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; 

Si vous voulez, vous pouvez désactiver l'outil NearestPoint, mais nous en avons besoin de trouver facilement le point correspondant.