本人看了Delphi5的Demos下面的TChart的例子,研究后有个问题不能解决,如下:
统计某商店的某个商品每个月销售金额,横坐标显示12个月(即一月份、二月份...等等);纵坐标显示销售金额(从0开始)。统计生成图示后,一共有12个柱状。
我现在想实现这个效果:当鼠标移动到某个月的柱子上面后,用Label1来显示出:
“X月份的销售金额为Y元”。X、Y是随着鼠标在12条柱子上移动而改变。该如何做?我现在只能在Series的OnClick事件中只能得到正确的金额,但是月份得到的始终是坐标值,而不是显示的“X月份”,我的代码如下:
procedure TFrmDKHXX.Series1Click(Sender: TChartSeries; ValueIndex: Integer;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  tmpX,tmpY : Double;
  RQ,JE: String;//月份、金额
begin
  if Button = mbLeft then
  begin
    Series1.GetCursorValues(tmpX,tmpY);
    RQ := Series1.GetHorizAxis.LabelValue(tmpX);//得到X坐标值
    JE := FloatToStr(Series1.GetMarkValue(ValueIndex));//得到Y坐标值
    
    Label1.Caption := RQ+'销售金额为'+JE+'元';
  end;
end;
怎么实现“当鼠标移动到某个月的柱子上后,显示正确的月份和销售金额”???
大虾们,帮帮小弟。分不够再加!!!

解决方案 »

  1.   

    小弟用TChart做过电站系统,但没有用到你的方法,帮你顶。
      

  2.   

    这还不简单吗? 多翻翻TCHART的帮助就知道了.我用过这个功能,好像有个SERIES,具体什么函数记不清了,但帮助中有,很简单的.
    注意:有个MARK属性,指的就是在一个点上显示标签(数值的).
      

  3.   

    procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      p : TChartClickedPart;
    begin
      Chart1.CalcClickedPart(Point(x,y),p);
      if p.PointIndex <> -1 then
        Series1Click(nil,p.PointIndex,mbLeft,[],x,y);//调用你那个函数,也可以直接写在这
    end;
      

  4.   

    这是本人查看帮助后找到的方法,觉得还是很简单的:
    procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    Var
      aIndex: Integer;
      RQ,JE: String;
    begin
      //首先判断鼠标是否在柱窗图内
      if PtInRect( Chart1.ChartRect, Point(X-Chart1.Width3D,Y+Chart1.Height3D)  ) then
      begin 
        aIndex:= Series1.Clicked(X,Y);//得到当前鼠标在哪个柱子上,如果不在,aIndex:=-1
        if aIndex <> -1 then
        begin
          RQ:= Series1.XLabel[aIndex];
          JE:= FloatToStr(Series1.GetMarkValue(aIndex));
          Label1.Caption:='日期:'+RQ+#13+'金额'+JE;
          Label1.Left:= X;
          Label1.Top := Y-Label1.Height-2;
          Label1.Visible:= True;
        end
        else
        begin
          Label1.Visible:= False;
        end;
      end
      else
      begin
        Label1.Visible:= False;
      end;
    end;非常感谢大家!
    lijinghe1(副乡长)(立党为公,执政为民)的方法原理是一样的,关键还是得到鼠标所在的柱子序号,即Series的OnClick事件中的ValueIndex!
      

  5.   

    longtusoft(开泰):
    送你一句话:千万别把简单的事情不当回事!今天早上,有个自认为很牛的人到我公司来应聘,问他某某问题,他说:“这个还不简单嘛,翻翻资料就知道了!10分钟就搞定!”老板立马就把他给请走了,呵呵~~~