【问题标题】:TeeChart X Axis Label FormattingTeeChart X 轴标签格式
【发布时间】:2013-04-16 18:06:15
【问题描述】:

我的 TeeChart 看起来不错,网格线/刻度出现在我希望的位置等等(X 轴 LabelStyle 设置为 talAuto)。现在我需要格式化 X 轴标签,以便它们显示时间偏移而不是数据点编号。

我已将 LabelStyle 更改为 talMark,并且正在处理图表的 OnGetAxisLabel。问题是,当我将 LabelStyle 设置为 talAuto 时,我的事件处理程序会为每个 X 轴点调用,而不仅仅是显示标签的点。

如何设置以便仅针对 LabelStyle 为 talAuto 时绘制的标签调用我的事件处理程序?

我正在使用 C++ Builder XE3 和 IDE 附带的 TeeChart 版本。

受 Yeray 评论启发的更新:

将 LabelStyle 设置为 talAuto 我总是将 -1 的 ValueIndex 传递给我的事件处理程序。在查看 LabelText 时,我看到了在 ValueIndex 中预期的值,但我也得到了相同数量的不正确值(忽略非 X 轴值)。比如……

我的图表显示 5 个 X 轴值:200、400、600、800、1000。我的事件处理程序按以下顺序调用了 10 次:

ValueIndex      LabelText
    -1              937.5
    -1                0
    -1          240,000
    -1              200
    -1          239,800
    -1            1,000
    -1              800
    -1              600
    -1              400
    -1              200

我不知道前 5 个值是从哪里来的,也不知道为什么要调用我的事件处理程序。

注意:我删除了 C++ Builder 标签,因为任何使用 TeeChart 的人都可以回答这个问题,无论他们的语言如何;我使用 BCB 的事实对这个问题并不重要。

【问题讨论】:

  • 我添加了 vcl 标签。您使用 BCB 的事实是部分相关的,因为不同的 TeeChart 版本可能表现不同。

标签: c++builder vcl teechart


【解决方案1】:

我已将 LabelStyle 更改为 talMark 并正在处理图表的 OnGetAxisLabel。问题是我的事件处理程序被调用 每个 X 轴点,而不仅仅是显示标签的点 当我将 LabelStyle 设置为 talAuto 时。

对,使用talMarkLabelStyle,轴将绘制与系列中的点一样多的标签。 您可以使用talAutoLabelStyle 来获取您想要的标签数量,您仍然可以在OnGetAxisLabel 事件中设置标签的格式。


更新:

当我使用 talAuto 时,ValueIndex 始终为 -1,所以我不知道哪个 数据点与事件相关联。

当设置talAuto 并且系列有标签时,它的行为类似于talTexttalMark:这些字符串用于底部轴,并且可以使用OnGetAxisLabel 事件中的ValueIndex。 当设置了talAuto 但系列没有标签时,它的行为类似于talValue:底部轴计算标签以显示在MinimumMaximumIncrement 的函数中。无法使用OnGetAxisLabel 事件中的ValueIndex,因为轴标签与系列点不对应。

我猜你的系列中没有标签。否则,从 talAuto 更改为 talMark 不会有任何改变。

所以你必须在其中一个或另一个之间做出决定。也许您可以使用talValue(或不带标签的talAuto)来获取您希望的标签数量,并从将要绘制的字符串中提取您需要的信息。


或者,使用CustomLabels 可能更容易。它们将允许您控制轴标签的位置和文本,而无需任何事件。例如:

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

  Chart1.AddSeries(TBarSeries).FillSampleValues;

  Chart1.Axes.Bottom.Items.Clear;
  for i:=0 to Chart1[0].Count-1 do
    Chart1.Axes.Bottom.Items.Add(Chart1[0].XValue[i], 'label ' + IntToStr(i));
end;

【讨论】:

  • 谢谢,@Yeray。当我使用 talAuto 时,ValueIndex 始终为 -1,所以我不知道哪个数据点与事件相关联。
  • 我想从字符串中获取信息,但正如我在上面的更新中指出的那样(请参阅我帖子中的表格),我的事件处理程序被调用 10 次以获得显示 5 的图表标签;前 5 次调用传递的字符串值不正确。我无法知道哪些调用包含合法的值字符串,哪些不包含。
  • WRT 自定义标签,什么是 Chart1[0]?由于您使用它来访问 XValue,我猜它是您在上面添加的 TBarSeries。但是,如果是这种情况,您将标记系列中的每个点;我的应用程序中可能有数万个(或更多),其中许多不会显示(它们将在图表的左侧或右侧)。完成这项工作以便我排除未显示的内容并让我的标签“很好”——使用令人愉悦的值以适当的间隔令人愉悦地显示并不是一件容易的事。
  • 由于 TeeChart 将为我完成所有这些工作,我可以从传递给我的处理程序的文本中提取值并将其按摩到时间偏移中,我更愿意获得我的原始代码工作。
  • 另外,TeeChart 似乎有问题,或者我配置它的方式有问题。我不喜欢我的代码中有这些谜团。我对 TeeChart 有兴趣吗?我是否有一个稍后会咬我的覆盖或野指针?这些都不是应该轻易忽视的问题,所以我想深入了解错误标签的根源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多