我的代码将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);
}
}
p.s。 10.3.1和10.3.2发生错误。我正在使用C ++ Builder。
答案 0 :(得分:1)
请原谅我将此作为答案发布,但我不允许发表评论-太新了:o(
根据您所说的,我们知道是ShowMessage失败了-仅在Win32中(根据the documentation是同步的,而在其他平台上则是异步的-我相信(但尚未检查) ),它映射到标准的Windows调用)。
我们还知道您正在调试-因此我们推断某事无法按您的预期工作。
您已向我们显示了调用ShowMessage的位置,但没有显示如何实现这些功能或期望的结果。
通常情况下,如果Widows API调用失败,则您要么传入了垃圾(可能从FMX中的Dialogs服务层提供),要么您的prgram处于执行您所要执行的操作的状态做(阻塞消息循环,线程不安全等)
有两点检查建议可以帮助您:尝试调试的行为是什么,以及与Windows API调用中断之间的关系如何?调用ShowMessage时程序的状态是什么-请记住,在Win32上,底层Windows API用于很多事情,但(显然)不是用于iOS和Android。
我希望这对您有帮助...