【问题标题】:fmx260.bpl access violation ShowMessage (FMX, Win32)fmx260.bpl 访问冲突 ShowMessage (FMX, Win32)
【发布时间】:2019-08-02 16:41:02
【问题描述】:

我的代码将 TCharts 添加到 TLayout,然后更改 TLayout 高度以适应。它工作正常。但是,在调试一些代码时,我发现了一个非常奇怪的错误。我添加了一个ShowMessage(IntToStr(7)),它在我添加第二个图表(不在第一个图表上)后导致 fmx260.bpl 中的访问冲突。在第一次违规之后,只需将鼠标移到表单上就会导致另一个访问违规。这发生在 Win32 中,在 iOS 和 Android 上运行良好。

我不明白为什么IntToStr(7) 会导致这种违规行为?我想知道这是否与我在声明 myCharts 向量时使用__unsafe 有关。我必须为the reason shown here. 这样做

更新:错误也发生在 ShowMessage("text") 上。也许它只是与 ShowMessage 有关?

以下是错误的屏幕截图:

这是我在 Unit1.cpp 顶部的声明:

#include "Unit1.h"
#include <FMXTee.Store.hpp>
#include <System.IOUtils.hpp>
#include <stdio.h>
#include <vector>
#include <memory>
void AddChart(); // proto function
void ReSizeCharts(); //proto function
std::vector<__unsafe TChart*> myCharts;  // vector of charts

这是我的功能:

void AddChart()
{
  try {
      TChart *C = new TChart(Form1);
      C->Parent = Form1->Layout1;
      CloneChart(C, Form1->ChartTemplate, Form1, false);
      C->Align = TAlignLayout::Horizontal;
      C->Height = Form1->ChartTemplate->Height;
      C->Width = Form1->ChartTemplate->Width;
      C->MarginRight = 10;
      C->Tag = myCharts.size();
      C->HitTest = false;
      C->Visible = true;
      myCharts.push_back(C);    
      ReSizeCharts(); 
      ShowMessage(IntToStr(7)); // <-------this is is where ERROR occurs
      }
 catch( const Exception& e )
      {
      ShowMessage(e.Message);
      }
}

还有……

void ReSizeCharts()
{
try{
   if (static_cast<int>(myCharts.size()>0)) {
     myCharts[0]->Position->Y = 0; 
     for (int i = 1; i < static_cast<int>(myCharts.size()); i++) {
     myCharts[i]->Position->Y = i*(myCharts[0]->Height); 
   }
   Form1->Layout1->Height = static_cast<int>(myCharts.size()) * Form1->ChartTemplate->Height;   // make sure Layout1 is tall enough
   }
  }
catch ( const Exception& e )
 {
  ShowMessage(e.Message);
 }
}

附言错误发生在 10.3.1 和 10.3.2 上。我正在使用 C++ Builder。

【问题讨论】:

  • 您是否在不涉及TChart 的单独项目中遇到相同的错误?你filed a bug report with Embarcadero了吗?
  • 不,在我的项目中是唯一一次看到这个错误。我试图在一个新项目中构建一个精简版本(使用上面的代码和一个 TChart 和 TButton),它工作正常。我不确定我能否做出有意义的错误报告(不过我会坚持下去)。我无法在当前项目之外复制它。

标签: firemonkey c++builder


【解决方案1】:

请原谅我将此作为答案发布,但我不允许发表评论 - 太新了 :o(

根据您所说,我们知道是 ShowMessage 失败了-并且仅在 Win32 中(根据the documentation 是同步的,而在其他平台上是异步的-我相信(但尚未检查)它映射到一个标准的 Windows 调用)。

我们也知道您正在调试 - 所以我们推断 某事 没有按您的预期工作。

您已经向我们展示了您调用 ShowMessage 的位置,但没有向我们展示您如何实现这些功能或您的期望。

通常的情况是,如果 Widows API 调用失败,您要么传入垃圾(可能从 FMX 中的 Dialogs 服务层提供),要么您的 prgram 未处于执行您要求的状态要做(阻塞消息循环,不是线程安全等)

关于检查的两个建议可能会对您有所帮助:您尝试调试的行为是什么,以及这与似乎是 Windows API 调用的中断有何关系。调用 ShowMessage 时程序的状态是什么 - 请记住,在 Win32 上,底层 Windows API 用于许多事情,但它(显然)不适用于 iOS 和 Android。

我希望这会有所帮助...

【讨论】:

  • 嗨 Rob - 感谢您的意见。我大约 95% 确信这实际上与 Steema TChart 的一些错误行为有关。在遇到上述问题后,我完全重写了我的代码以避免使用向量(是的,很糟糕)。在解决这个问题时,我发现一些 TChart 调用会产生访问冲突。所以,我很确定那是真正的根源。我只是没有回过头来确认一下。
猜你喜欢
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多