我正在使用Annotation和AnnotationCallout在序列上创建标签。但我遇到的问题是,随着新数据添加到图表中,他们的头寸没有更新。该系列会滚动,但Annotation/AnnotationCall会保持在同一位置。
我用以下代码设置了Annotation和AnnotationCall:
Anno.setLeft(aSeries.calcXPos(iIndex)-51);
Anno.setTop(aSeries.calcYPos(iIndex)+100);
Callout.setXPosition(aSeries.calcXPos(iIndex));
Callout.setYPosition(aSeries.calcYPos(iIndex));
有没有办法把它们连接到序列上的点上,或者我在工作中使用了错误的工具?
根据定义Scaling
属性的方式,批注位于图表上的像素位置或相对位置。
Annotation
就是这样工作的。因此,一旦定义了注释的位置,它就会粘在那里。
如果你想在点上贴标签,可以看看Series.Marks
。
当你在系列中添加点时,你可以添加一个标签文本,比如:
AddXY(xPos,yPos,"你好",clGreen);
设置Series.Marks.Visible := True
以显示标记标签。要动态自定义标签文本,请查看事件TChartSeries.OnGetMarkText
。
浏览所有Series.Marks
属性,根据您的喜好定制外观。
更新:
为了隐藏序列数据上的一些标记,请在OnGetMarkText
事件期间将标签文本设置为空字符串。
如何使用OnGetMarkText
:的示例
...
Series1.OnGetMarkText := Self.Series1GetMarkText; // Define the OnGetMarkText event
...
procedure TMyForm.Series1GetMarkText(Sender: TChartSeries;
ValueIndex: Integer; var MarkText: string);
begin
if ValueIndex=3 then // Just an example how to set the selection criteria
MarkText := 'Hello'
else
MarkText := '';
end;