0

我的 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 的事实对这个问题并不重要。

4

1 回答 1

2

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

对,使用talMark LabelStyle,轴将绘制与系列中的点一样多的标签。您可以使用talAuto LabelStyle来获取所需的标签数量,并且您仍然可以在OnGetAxisLabel事件中设置标签的格式。


更新:

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

talAuto设置并且系列有标签时,它的行为类似于talTextand talMark:这些字符串用于底部轴,并且可以使用ValueIndexin事件。OnGetAxisLabeltalAuto设置了但系列没有标签时,它的行为类似于talValue:底部轴计算标签以显示在和的函数Minimum中。无法使用 in 事件,因为轴标签不对应于系列点。MaximumIncrementValueIndexOnGetAxisLabel

我猜你的系列中没有标签。否则,从talAutoto更改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;
于 2013-04-17T11:15:55.553 回答