鼠标悬停提示TChart系列值

时间:2009-06-25 11:47:46

标签: delphi teechart

我在Delphi 7中使用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;

每个条形(值)现在都在条形图下方和条形图上方的黄色矩形中显示标签。

我没有重复标签值两次,而是从查询中得到一些其他信息,我想在条形图上方而不是标签上显示(或者,最好是鼠标悬停提示)。可以用TChart完成吗?怎么......?

4 个答案:

答案 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 :(得分: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;

答案 2 :(得分:0)

有一个“标记提示”工具,可让您在条形图上移动时显示提示。但我不确定您是否可以修改提示以显示自定义数据而不是预先设定的样式。

答案 3 :(得分:0)

您可以将Panel放入图表中,并将其用作提示。使用NearestPoint工具,它可以很好地工作。

enter image description here

首先将NearestPoint工具添加到图表中(双击图表,选择工具/添加)。

然后将一个Panel添加到Chart(进入Chart组件)并根据需要设置样式。

然后使用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;

如果需要,可以禁用NearestPoint工具,但我们需要它来轻松找到相应的点。