【问题标题】:How to delete TChart (FMX, C++)如何删除 TChart (FMX, C++)
【发布时间】:2019-08-14 01:12:44
【问题描述】:

我不知道如何删除TChart。这必须很简单,但我没有看到它。在下面的 TListView ButtonClick 代码中,我从活动的 TChart 中删除了一个系列,如果该系列恰好是最后一个系列,那么我想删除整个 TChart

TComponent *T;                     // find chart and delete the selected series
for (int i = 0; i < (Form1->ComponentCount); i++) {
   T = Form1->Components[i];
   if (T->ClassName() == "TChart") {
      int test = T->Tag;
      if (test == TappedChartTag) { //TappedChartTag is global
        if (TChart *TC = dynamic_cast<TChart *>(T)) {
            TC->RemoveSeries(AItem->Index); // this removes the series
            if (TC->SeriesCount()==0) {  // if this was last series, delete chart
               TC->CleanupInstance();
            }
        }
      }
    }
}

我找不到完全摆脱TChart 的方法。 TC-&gt;CleanupInstance(); 将其完全擦除(看不到任何东西),但 TChart 仍然存在。

我在 Embarcadero Rad Studio(C++ Builder 10.3 Update 1)工作。

更新:我尝试用delete TC; 代替TC-&gt;CleanupInstance();,它适用于Win32,但不适用于iOS。

【问题讨论】:

  • 由于ARC reference countingdelete TC; 不适用于 iOS(和 Android)。 TC 是对TChart 对象的活动引用,因此在分配TC 时它的引用计数会增加。之后调用delete TC; 只会减少引用计数,但其他地方还有其他活动引用,这就是对象实际上没有从内存中释放的原因。

标签: firemonkey c++builder teechart


【解决方案1】:

好的,根据 Remy 提供的解决方案 in this question 我现在可以使用了。我刚刚用一行替换了TC-&gt;CleanupInstance(); 以设置一个等于组件索引delINT = i 的整数。然后在遍历组件的循环下面,我放了这个简单的代码:

if (delINT > 0) {
  Form1->Components[delINT]->DisposeOf();
}

我让事情变得比本来应该做的更难。我无法在我之前的代码中调用DisposeOf(),因为它脱离了上下文。在这种情况下,它可以正常工作(在 Win32、iOS 和 Android 上)。

【讨论】:

  • 您可以简单地使用TC-&gt;DisposeOf(); 代替。不需要delINT。一旦找到匹配的TChart,您可能还应该break 循环,除非您有多个具有相同匹配Tag 值的TChart 对象(在这种情况下,您应该通过Components[] 数组向后循环)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2015-09-09
相关资源
最近更新 更多