【问题标题】:Draw a marker on each new point on teechart在 teechart 上的每个新点上绘制一个标记
【发布时间】:2015-04-22 12:36:40
【问题描述】:

我正在 Embarcadero XE 上开发一个应用程序,我从以太网端口接收实时数据并显示在屏幕上的 teechart 图表上。

该应用程序的工作方式类似于示波器,即图表显示有一个数据时间窗口(例如 10 秒),每个新输入点都会覆盖屏幕上已有的数据。

我希望您能帮助我编写一个仅在添加的最新点上放置标记的代码,以便用户可以跟踪屏幕上的哪些点是最新的点。我不想要所有的点都有一个标记,我只想要最新的。

正在使用的系列是快线。

这是我用来向图表添加数据的代码:

//Delete already existing point
if (Oscilografia.Series[0].Count>1) then
begin
Oscilografia.Series[0].Delete(cont);
end;
//Write point
Oscilografia.Series[0].addxy(cont,data, '', clblue);

【问题讨论】:

  • 只用一个点制作第二个点系列。用当前数据点覆盖该点。您的 fastline 系列会将累积的数据显示为一条线,点系列会将当前点显示为一个点。
  • 问题是我要显示35个系列的数据,并且有一个图例,用户可以选择他想看的系列。如果我创建一个新系列,它不会显示在图例中吗?
  • Oscilografia.Series[i].ShowInLegend := false;
  • 谢谢,我这里试试。

标签: delphi teechart


【解决方案1】:

您有多种选择。最简单的就是新建一个TPointSeries 来显示当前点。如果您不想在图例中显示此系列,则只需设置:

 Oscilografia.Series[n].ShowInLegend := false;

其中n 是您希望从图例中排除的系列的索引。

或者,您可以在OnAfterDraw 处理程序中自定义绘制任何相关项目。例如:

procedure TForm1.Chart1AfterDraw(Sender: TObject);
var
  xPos, yPos : integer;
begin
  Chart1.Canvas.Pen.Color := clRed;
  Chart1.Canvas.Pen.Style := psSolid;
  Chart1.Canvas.Pen.Width := 1;
  Chart1.Canvas.Pen.Mode := pmCopy;

  xPos := Chart1.BottomAxis.CalcPosValue(CurrentXValue);
  yPos := Chart1.LeftAxis.CalcPosValue(CurrentYValue);

  // Parameters are 
  //  X-Coord, Y-Coord, X-Radius, Y-Radius, Start Angle, End Angle, Hole%
  Chart1.Canvas.Donut(xPos, yPos, 3, 3, 0, 360, 0);
end;

这会产生,例如:

自定义绘图还可以让您做其他事情,例如添加标记等。例如:

procedure TForm1.Chart1AfterDraw(Sender: TObject);
var
  xPos, yPos : integer;
  yMax, yMin : integer;
begin
  Chart1.Canvas.Pen.Color := clRed;
  Chart1.Canvas.Pen.Style := psSolid;
  Chart1.Canvas.Pen.Width := 1;
  Chart1.Canvas.Pen.Mode := pmCopy;

  xPos := Chart1.BottomAxis.CalcPosValue(CurrentXValue);
  yPos := Chart1.LeftAxis.CalcPosValue(CurrentYValue);

  Chart1.Canvas.Donut(xPos, yPos, 3, 3, 0, 360, 0);

  Chart1.Canvas.Pen.Color := clGreen;
  Chart1.Canvas.Pen.Style := psDash;

  yMax := Chart1.LeftAxis.CalcPosValue(Chart1.LeftAxis.Maximum);
  yMin := Chart1.LeftAxis.CalcPosValue(Chart1.LeftAxis.Minimum);
  Chart1.Canvas.DoVertLine(xPos, yMax, yMin);
end;

它给出了一条跟随当前点的垂直虚线:

请注意,CalcPosValue 函数由图表轴公开,允许您将轴空间中的点转换为图表画布空间中的整数(屏幕)坐标。

【讨论】:

  • 我尝试了创建新系列选项,它完成了我想要的。谢谢。
  • 我发现你的自定义图纸解释很有趣,但是我怎样才能删除以前的自定义图纸,让它只显示在最新的点上?
  • @GabrielAttuati 您在OnAfterDraw 中绘制的任何内容都只会保留到控件重新绘制自身。它会在重新绘制图表时自动删除(即图表更新的任何时间)。尝试一下。在我的示例中,我当然没有定义 CurrentXValueCurrentYValue - 我留给您在这里获取相关点。
【解决方案2】:

作为 J 提出的使用自定义绘图技术绘制指针的替代方案,您可以将 TFastLineSeries 更改为使用 TLineSeries 并使其指针可见。然后,您可以使用OnGetPointerStyle 事件隐藏除最后一个之外的所有指针:

uses Series;

var Series1: TLineSeries;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  Chart1.View3D:=false;

  Series1:=Chart1.AddSeries(TLineSeries) as TLineSeries;
  for i:=0 to 360 do
    Series1.Add(Sin(PI*i/180));

  Series1.Pointer.Visible:=true;
  Series1.OnGetPointerStyle:=SeriesGetPointerStyle;
end;

function TForm1.SeriesGetPointerStyle(Sender:TChartSeries; ValueIndex:Integer):TSeriesPointerStyle;
begin
  result:=(Sender as TLineSeries).Pointer.Style;

  if (ValueIndex<>Sender.Count-1) then
    result:=psNothing;
end;

作为补充,如果要显示系列最后一点的标记,可以使系列的标记可见,并使用OnGetMarkText 事件隐藏除最后一个以外的所有标记:

uses Series;

var Series1: TLineSeries;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  Chart1.View3D:=false;

  Series1:=Chart1.AddSeries(TLineSeries) as TLineSeries;
  for i:=0 to 360 do
    Series1.Add(Sin(PI*i/180));

  Series1.Pointer.Visible:=true;
  Series1.OnGetPointerStyle:=SeriesGetPointerStyle;

  Series1.Marks.Visible:=true;
  Series1.OnGetMarkText:=SeriesGetMarkText;
end;

function TForm1.SeriesGetPointerStyle(Sender:TChartSeries; ValueIndex:Integer):TSeriesPointerStyle;
begin
  result:=(Sender as TLineSeries).Pointer.Style;

  if (ValueIndex<>Sender.Count-1) then
    result:=psNothing;
end;

procedure TForm1.SeriesGetMarkText(Sender:TChartSeries; ValueIndex:Integer; var MarkText:String);
begin
  if (ValueIndex<>Sender.Count-1) then
    MarkText:='';
end;

注意我在这里也使用TLineSeries,但如果您只对显示标记而不是指针感兴趣,您仍然可以使用TFastLineSeries

【讨论】:

    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 2020-07-13
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多