fmx260.bpl访问冲突ShowMessage(FMX,Win32)

时间:2019-08-02 16:41:02

标签: firemonkey c++builder

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

我不明白为什么IntToStr(7)会导致这种违规?我想知道这与我在声明myCharts向量中使用__unsafe有什么关系。我不得不为此the reason shown here.

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

以下是错误的屏幕截图:

fmx260.bpl access violation

second one

这是我在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);
 }
}

p.s。 10.3.1和10.3.2发生错误。我正在使用C ++ Builder。

1 个答案:

答案 0 :(得分:1)

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

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

我们还知道您正在调试-因此我们推断某事无法按您的预期工作。

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

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

有两点检查建议可以帮助您:尝试调试的行为是什么,以及与Windows API调用中断之间的关系如何?调用ShowMessage时程序的状态是什么-请记住,在Win32上,底层Windows API用于很多事情,但(显然)不是用于iOS和Android。

我希望这对您有帮助...