2009-06-25 39 views
0

私はDelphi 7でTChartを使用しています。私はいくつかの棒グラフを表示したいと思います。私は、データベースクエリから系列値を設定するには、次のコードを使用しています: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; 

それぞれのバー(値)は今、両方のバーの下にラベルを表示し、バーの上に黄色の矩形にされます。

ラベル値を2回繰り返すのではなく、ラベルの代わりにバーの上に表示したいクエリの追加情報があります(マウスオーバーヒントが望ましい場合があります)。 TChartでこれを行うことはできますか?そしてどうやって... ?

答えて

0

バーの上を移動するときにヒントを表示できる「マークのヒント」ツールがあります。しかし、あらかじめ定義されたスタイルの代わりにカスタムデータを表示するようにヒントを修正できるかどうかはわかりません。

3

これはチャートのOnMouseMoveイベントを使用してTChartで行うことができます。このような何かが、あなたが始める必要があります。もちろん

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; 

をこのコードが動作するために、あなたがチャートを取り込むために使用されるクエリは、まだ開いていなければなりません。

1

「マークのヒント」ツールは、カスタムテキスト(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

あなたがチャートにパネルを入れ、ヒントとしてそれを使用することができます。 NearestPointツールを使用すると非常にうまく動作します。

enter image description here

まず([ツール/追加、チャートをダブルクリックします)チャートにNearestPointツールを追加します。

次に、チャートをチャートに追加して(チャートコンポーネントに)、必要に応じてスタイルを設定します。必要であれば、あなたはNearestPointツールを無効にすることができますが、我々はそれが簡単に対応点を見つける必要があり

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; 

その後ONMOUSEMOVEイベントを使用します。

関連する問題