在Delphi中使用鼠标光标更改图表值

时间:2017-11-03 00:12:01

标签: delphi charts

我需要在Delphi 10中创建一个图表,其中可以使用鼠标更改Series的值。我想用鼠标光标按下图表的值并拖动以更改其值。是否有任何需要启用的属性或是否具有特定的图表组件?

I saw another similar question,如@KenWhite所示,但我不明白,因为在该主题中使用了C#,而TeeChart组件在Delphi中的工作方式不同。

有人可以解释一下如何在Delphi中使用它吗?

感谢

1 个答案:

答案 0 :(得分:3)

拖动的简单示例。

enter image description here

我将图表AllowPanning设置为False以自由地使用鼠标右键,线条系列,点样式是大小= 4的圆圈,并通过简单的列表遍历寻找触摸点(不确定Std是否有方法可以获得离光标最近的点)。

也许您需要一些限制(例如,通过邻居值限制水平移位等)

 DragIdx: integer = -1;

procedure TForm1.Button18Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 19 do
    Series1.AddXY(i, Sin(i/2));
end;

procedure TForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i, xx, yy: Integer;
begin
  if Button = mbRight then begin
    DragIdx := -1;
    for i := 0 to Series1.Count - 1 do begin
      xx := Series1.CalcXPos(i);
      yy := Series1.CalcYPos(i);
      if Sqr(xx - x) + Sqr(yy - y) <= 5 * 5 then begin
        DragIdx := i;
        Break;
      end;
    end;
    Memo1.Lines.Add(Format('grab %d', [DragIdx]));
  end;
end;

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  xx, yy: Double;
begin
  if (ssRight in Shift) and (DragIdx >=0) then begin
    Series1.GetCursorValues(xx, yy);
    Memo1.Lines.Add(Format('change %d to %f  %f', [DragIdx, xx, yy]));
    Series1.XValues[DragIdx] := xx;
    Series1.YValues[DragIdx] := yy;
    Chart1.Repaint;
  end;
end;