搞了一天没搞定,非常着急,请大家解答一下 tchart 鼠标悬停在标记点上显示当前的值

jiangdong66 2011-01-06 02:15:36
tchart 鼠标悬停在标记点上显示当前的值。

怎么做?

曲线是从数组里面读取的值,连接起来的,用的是tchart控件。

我想实现效果就是,鼠标移动到标记点上,出现这个标记点上的原始标记值。


...全文
1167 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
CHENZQ1019 2011-04-11
  • 打赏
  • 举报
回复
c#下可以这样实现
private void tChart1_MouseMove(object sender, MouseEventArgs e)
{
int tempx, tempy;
tempx = e.X;
tempy = e.Y;
//获取鼠标对应坐标值的方法:
textBox1.Text = gantt1.GetHorizAxis.CalcPosPoint(tempx).ToString();
textBox2.Text = gantt1.GetVertAxis.CalcPosPoint(tempy).ToString();
}
这样可以转换
CHENZQ1019 2011-04-11
  • 打赏
  • 举报
回复
c#该如何实现呢?
zjgblue 2011-01-07
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, DB, TeeData,
DBChart, StdCtrls;

type
TForm1 = class(TForm)
tmr1: TTimer;
Chart1: TChart;
btn2: TButton;
Series1: TFastLineSeries;
Series2: TFastLineSeries;
procedure FormCreate(Sender: TObject);
procedure tmr1Timer(Sender: TObject);
procedure Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
I, Y,A: Integer;
TempData,PData:Double;
XStr: Array[0..60] Of AnsiString;
Str: AnsiString;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin //定义LeftAxis范围
chart1.LeftAxis.Automatic:=False;
chart1.LeftAxis.Minimum:=-100;
chart1.LeftAxis.Maximum:=300;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
Begin
//----------------------------------------------------曲线数据
TempData:=Random*132;
PData:=Random*200;
Chart1.Series[0].AddXY(I, TempData, TimeToStr(Time));
Chart1.Series[1].AddXY(I, PData, TimeToStr(Time));
//----------------------------------------------------BottomAxis使用时间显示
If I < 60 Then
XStr[I] := TimeToStr(Time)
Else
Begin
XStr[I Mod 60] := TimeToStr(Time);
Inc(Y);
Chart1.BottomAxis.SetMinMax(Y, Y + 59);
End;
Inc(I);
end;
//----------------------------------------------------
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
Var
TmpX, TmpY: Double;
T: Integer;
Begin
Chart1.Repaint();
Chart1.Canvas.TextOut(X + 20, Y + 20, '');
Chart1.Canvas.TextOut(X + 15, Y - 20, Str);
Chart1.Series[1].GetCursorValues(TmpX, TmpY);
A := Trunc(TmpX);
T := A Mod 60;
If (T < 0) Or (T > 60) Then exit;
Str := Format('时间: %s 数值: %s', [XStr[T], FormatFloat('0.00', TmpY)]);
end;

end.
jiangdong66 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zjgblue 的回复:]
Delphi(Pascal) code

procedure TFrmMain.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
TmpX, TmpY: Double;
T,AZ: Integer;
Begin
Chart1.Series[1].GetCursorVa……
[/Quote]
上述代码贴上去出现错误。
能否详细解释一下?我的横坐标是日期如2010-12-31,纵坐标是金额数字。
jiangdong66 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zhzhrony 的回复:]
引用 1 楼 xd19861130 的回复:
在 MouseMove 事件里判断鼠标是否处于标记点上(标记点是单位刻度吧?)
再对应刻度到数组里去取值,显示

上面这位朋友的方法很好啊!

我在补充详细点:首先你应该按照标志点的顺序建立以个数组(动态数组比较好,这样可以方便添加新的数据),鼠标放到标志点上,判断标志点的位置值比如第2个位置就直接取出数组对应的数值ARRAY【1】显示不就……
[/Quote]

思路不错,但由于本人水平有限,才搞delphi开发几个月。能否给出主要的代码?非常感谢!!!
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xd19861130 的回复:]
在 MouseMove 事件里判断鼠标是否处于标记点上(标记点是单位刻度吧?)
再对应刻度到数组里去取值,显示
[/Quote]
上面这位朋友的方法很好啊!

我在补充详细点:首先你应该按照标志点的顺序建立以个数组(动态数组比较好,这样可以方便添加新的数据),鼠标放到标志点上,判断标志点的位置值比如第2个位置就直接取出数组对应的数值ARRAY【1】显示不就可以了吗?
jiangdong66 2011-01-06
  • 打赏
  • 举报
回复
上述方法好像不对,我是要做到移动到标志点位置,出现标记点数值。
jiangdong66 2011-01-06
  • 打赏
  • 举报
回复
我决定还是用delphi7自带的tchart,有什么方法,还望各位继续帮忙。
bdmh 2011-01-06
  • 打赏
  • 举报
回复
我用timer写了一个,因为TChart没有OnPaint事件,暂时用timer来在Chart上鼠标位置画出当前数值

procedure TForm1.Timer1Timer(Sender: TObject);
var
p:TPoint;
s:string;
begin
GetCursorPos(p);
p := Chart1.ScreenToClient(p);
s := FormatFloat('0.00',Chart1.SeriesList[0].XScreenToValue(p.X))+':'+FormatFloat('0.00',Chart1.SeriesList[0].YScreenToValue(p.Y));
Chart1.Canvas.TextOut(p.X,p.Y,s);
end;
zjgblue 2011-01-06
  • 打赏
  • 举报
回复

procedure TFrmMain.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
TmpX, TmpY: Double;
T,AZ: Integer;
Begin
Chart1.Series[1].GetCursorValues(TmpX, TmpY);
AZ := Trunc(TmpX);
T := AZ Mod 60;
If (T < 0) Or (T > 60) Then exit;
Str := Format('时间: %s 数值: %s', [XStr[T], FormatFloat('0.00', TmpY)]);
end;

procedure TFrmMain.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Chart1.Repaint();
Chart1.Canvas.TextOut(X + 20, Y + 20, '');
Chart1.Canvas.TextOut(X + 15, Y - 20, Str);
end;

XD王 2011-01-06
  • 打赏
  • 举报
回复
在 MouseMove 事件里判断鼠标是否处于标记点上(标记点是单位刻度吧?)
再对应刻度到数组里去取值,显示
jiangdong66 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jiap1723 的回复:]
本身就不用注册 你去搜teechart 自己下载个安装

PS:安装很麻烦,俺步骤来 要删文件
[/Quote]

我去了她们的官方网站,是要花钱注册的。www.steema.com
风之谷 2011-01-06
  • 打赏
  • 举报
回复
本身就不用注册 你去搜teechart 自己下载个安装

PS:安装很麻烦,俺步骤来 要删文件
jiangdong66 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jiap1723 的回复:]
用的不多但是功能强大了很多,
[/Quote]

有破解版或者不用注册的吗?请介绍个
风之谷 2011-01-06
  • 打赏
  • 举报
回复
用的不多但是功能强大了很多,
jiangdong66 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jiap1723 的回复:]
teechart吧 用teechart的pointtool
[/Quote]

teechart需要花钱注册吧?与delphi自带的tchart区别大吗?
风之谷 2011-01-06
  • 打赏
  • 举报
回复
teechart吧 用teechart的pointtool
jiangdong66 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jiap1723 的回复:]
这样不行吗
[/Quote]

由于种种原因,不想做成这样,想鼠标放上去再出现。
风之谷 2011-01-06
  • 打赏
  • 举报
回复


这样不行吗

5,390

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧