【问题标题】:Large TChart takes a long time to draw大TChart绘制时间长
【发布时间】:2011-06-13 15:39:56
【问题描述】:

热门帖子:我接受​​了一个答案,但它对我不起作用。我将发布a new question,强调Delphi 7。感谢所有提供良好意见的人


我在一小时内每隔一秒进行一次测量。

我有一个先前的问题,它需要 45 秒来更新 TStringGrid 并设法将其降低到“比眼睛看得更快”。部分是通过移动循环的一些计算和数据库相关功能,但 - 令我惊讶的是 - 真正产生差异的变化是在循环之前将 strindgrid 的 rowCount 设置为 3600,而不是在循环内增加它。

现在我对 TChart 也有类似的问题。也许如果我尝试预分配图表?所以,我可以Chart1.Series[0].Count := 3600,但我不能使用AddXy()Add(),那么我将如何显式设置系列值?

我有一个非常简单的图表,y 轴上是浮点数,x 轴上是小时:秒

谁能提供帮助或建议另一种加快图表绘制速度的方法?


更新:有几个人建议使用TFastLineSeries,但我不知道怎么做。

啊哈 - 双击图表,显示所有系列,选择一个并单击更改

【问题讨论】:

  • 我的 TCharts 通常会在眨眼之间绘制 100,000 个点。您想告诉我们更多关于您的 TCharts 的信息吗?
  • +1 谢谢,这告诉我有希望 :-) 我最多只有 3600 个浮点数,值在 0 和 600 之间,并用 MM:SS 时间标记 x 轴
  • 我有兴趣进一步了解您/任何人可能知道的任何事情。我也有类似的情况。我们的系统通常(直到最近)都部署在 Windows XP 系统上。大量的点绘制非常快,没有任何问题。我的 Windows 7 系统上的相同数据集绘制速度非常慢。慢到我可以看到每条线是单独绘制的,当图表的一部分由于最大/最小值需要重新缩放时,我也可以看到所有重新缩放。试图寻找答案
  • 家禽奴隶??我会明白这背后有一个好故事:-)对不起,我帮不了你。大约在那个时候,我购买了一堆 TMS 软件组件,它们的图表非常好。我只能向您推荐 Google 的“最佳免费 Delphi 图表组件”。

标签: delphi delphi-7 teechart


【解决方案1】:

我只想评论 Michael Schmooks 的回答。使用 High(XValues) 设置系列的 Count 值会导致不显示数组中的最后一项。这是因为 high(XValues) 返回数组的最高 index,而不是数组的大小。

当然,只有在恰好添加了非常少的项目时才会注意到这一点。

Chart.Series[0].XValues.Count := high(XValues) + 1;

【讨论】:

    【解决方案2】:

    我设法在眨眼之间绘制了数百万个数据点。这是我的做法: 您可以做的是为 X 和 Y 值创建两个数组,用您的值填充它们,然后将这些数组填充到您的图表中。例如:

    var
      XValues, YValues: array of double; 
    begin
    
      SetLength(XValues, numberofValues);
      SetLength(YValues, numberofValues);
    
      for ix := 0 to numberofValues - 1 do 
      begin
        XValues[ix] := ...your values
        YValues[ix] := ...your values
      end;
    
      Chart.Series[0].XValues.Value := TChartValues(XValues);
      Chart.Series[0].XValues.Count := high(XValues);
      Chart.Series[0].XValues.Modified := true;
      Chart.Series[0].YValues.Value := TChartValues(YValues);
      Chart.Series[0].YValues.Count := high(YValues);
      Chart.Series[0].YValues.Modified := True;
    

    使用 TFastLineSeries 而不是常规的 TLineSeries 也可以加快绘图速度。使用 FastlineSeries 时,您还拥有 DrawAllPoints 属性。当设置为 false 时,绘图会更快。然后,TChart 将跳过与屏幕上其他数据点共享相同 X 位置的数据点。它只会画出这些的第一点。

    您可以在这里找到 DrawAllPoints 选项:

    【讨论】:

    • DrawAllPoints 的一大缺点是生成的图表通常不能很好地表示基础数据
    • +1 迈克尔,这看起来正是我想要做的。不幸的是,线 Chart1.Series[0].XValues.Value := TChartValues(XValues);给出错误“[”,但发现“:=”
    • 顺便说一句,DrawAllPoints 属于什么? Chart.Series[0].XValues?图表系列[0] ?图表?似乎没有一个工作
    • Delphi 7,如果有什么不同的话
    • DrawAllPoints 属于 TFastLineSeries。您可以直接在表单编辑器上进行设置。他们只是把它叫做 Draw All there。它是 Series -> Format 窗格上的一个复选框。我使用的是 TChart Pro 8.07,也许这在其他版本中有所不同?我不明白为什么 Chart1.Series[0].XValues := TChartValues(XValues) 不应该工作。刚刚重新检查过。
    【解决方案3】:

    你可以在Steema website找到关于快速图表的“官方”建议

    【讨论】:

    • 我只看到一个空白页面(使用 FireFox)。好的,我现在就去,谢谢+1
    • @LeonixSolutions:如果您的带宽较低,请右键单击链接并下载 VCLRealtime.pdf 文件 - 它只有 48KByte 大小。
    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多