关于Chart控件属性的问题,在可执行程序中可以访问,但是在DLL中访问却出现内存错误。

alating 2007-08-15 09:56:02
1:在自己的工程中为窗口添加Chart控件,然后加入如下代码,然后编译执行一点问题没有,Chart控件可以正确创建,坐标等设置也没有问题。
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//增加CHart控件
TChart *MyChart = new TChart(Form1);
MyChart->Parent = this;
MyChart->Left = 0;
MyChart->Top = 0;

//增加曲线
TLineSeries *MySeries = new TLineSeries(MyChart);
MyChart->AddSeries(MySeries);

//设置曲线下底坐标
MyChart->Axes->Bottom->Automatic = false;
......

//设置左边坐标
MyChart->Axes->Left->Automatic = false;
......

//其他设置
MyChart->View3D = false;
MySeries->ShowInLegend = false;

}

2:自己编写一个DLL,在DLL中有一个窗口TForm1,TForm1构造函数中同样使用上面一段代码,然后自己在做一个应用程序调用这个DLL,并且由这个应用程序来创建DLL中的TForm1窗口,出现内存错误。(如果注释掉上面的设置坐标的代码,窗口可以正确创建)
跟踪调试发现是这句代码有问题:MyChart->Axes->Bottom->Automatic = false;
再查看Chart的Axes属性,是这样定义的:__property TChartAxes* Axes = {read=FAxes};(只有只读属性)

有个疑问,既然是只读,为什么直接在.exe中可以对Axes 进行操作,但是在DLL中却不行呢,很奇怪,望大侠解答。
...全文
448 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
thanksgivingguy 2011-07-20
  • 打赏
  • 举报
回复
请问诸位,这个问题在四年之后是否解决了啊?如果是,能不能说明一下是什么原因呢?
alating 2007-09-06
  • 打赏
  • 举报
回复
等待ING。。。
alating 2007-08-27
  • 打赏
  • 举报
回复
在DLL中有保存主程序的Application,但是在TChart *MyChart = new Chart(MainApplication);这样new出来后,还是一样的问题。 MainApplication保存的是主程序的Application。
laowang2 2007-08-25
  • 打赏
  • 举报
回复
Application传过来没有?
alating 2007-08-24
  • 打赏
  • 举报
回复
在调用MyChart->Axes->Bottom->Automatic = false;Bottom是一个空指针,BottomAxis指针是一个空指针,所以访问会出错。

但是为什么在.EXE中new出来的TChart所有的属性值都是存在一个有效的地址空间中的,还是有疑问。
lihao1111111111 2007-08-22
  • 打赏
  • 举报
回复
没有过DLL调用TChart.
你调用MyChart- >Axes- >Bottom- >Automatic = false;时MyChart的结构正确吗?
你可以先用lib文件试试看!
alating 2007-08-20
  • 打赏
  • 举报
回复
没人回答吗,大家以前都没碰到过这个问题吗。急切等待中。。。
alating 2007-08-16
  • 打赏
  • 举报
回复
刚才说错了,TChart *MyChart = new Chart(Application);换成这样没有编译问题,是在DLL中运行的时候还是
MyChart->Axes->Bottom->Automatic = false;这一句报错,内存错误。
alating 2007-08-16
  • 打赏
  • 举报
回复
to aniven:换成TChart *MyChart = new TChart(Application);后还是一样的编译问题。

to constantine:我用的是CB6的环境,Axes和BottomAxis属性在TChart控件立都是有的。

另外发现个问题,好像直接访问TChart控件的属性都是可以的,比如:
MyChart- >Parent = this;
MyChart- >Left = 0;
MyChart- >Top = 0;
MyChart- >View3D = false;
MySeries- >ShowInLegend = false;
上面这些语句执行都是没有问题的。

但是下面语句去改变TChart控件属性的成员变量就有问题了:
比如:
MyChart- >Axes- >Bottom- >Automatic = false;
MyChart- >Axes- >Left- >Automatic = false;

以前没人碰到过这个问题吗,为什么在.exe中直接对TChart操作一点问题没有,但是在DLL中运用就有问题,搞了好几天了,还是找不到头绪,郁闷。。。
constantine 2007-08-15
  • 打赏
  • 举报
回复
没在dll中试过,而且好像没有Axes属性,而是BottomAxis,可能bcb差异比较大吧,说不清。
不过想说的是2个new出来的东西最好不要放在过程里面而是作为成员变量,然后结束时判断释放。
当然我说的只是一种编程习惯。VCL的机制也会自动是否你new出来的2个控件,不过最好还是谁new的谁delete
编译失败 2007-08-15
  • 打赏
  • 举报
回复
不是只读的问题,如果你直接MyChart- >Axes = ....就会编译错误(因为是只读),你只是访问了它的成员变量而已。

建议TChart *MyChart = new TChart(Form1);
换成TChart *MyChart = new TChart(Application);试试

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧