关于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中却不行呢,很奇怪,望大侠解答。
...全文
464 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);试试
之前四此发的库http://download.csdn.net/detail/maiker/9646423可以作废,本次为最新的,其测试了历史曲线的动态显示,这是对Microsoft WpfToolkit的更新和扩展: 1、将库版本升级到.NET 4.5,对命名控件进行了替换处理 2、实现了单数据Chart图的混合颜色显示,可通过修改资源字典调整和添加颜色 3、可控制各种Chart图形的数据值显示 4、坐标轴文本可倾斜显示 5、添加了StepLine图和圆环图,圆环半径比例系数可设定. 6、Legend可位于区域四侧,对齐方式也可以设定,以及是否显示, 可控制Chart Title是否显示 7、柱状图缝隙间隔可调整 8、全方面的加入了各种加载动画效果,动画效果可屏蔽,同时原系统自带动画效果,可叠加,这是两种不同的效果,可以互补性的单个使用 9、设计了五种主题颜色,各人可以针对图形颜色和背景色进行更好的搭配,在用户项目,可以自己添加新的主题。 10、扩展了时间轴的应用,在新的DateTimeChart可以通过鼠标平移和缩放时间轴,并测试了两个例子用于动态显示历史曲线,一个是外部定时更新,一个是内部定时更新 11、对LineDataPoint样式进行了设计,现在可以选择线图的点样式(如空心圆、五角星、三角形,矩形等),同时这些不同的点样式可以体现在Legend上,从而实现颜色和图形的双重区分。 12、对饼图的标签排布进行了深度扩展,借鉴了Telerik 饼图的标签排布规则,重新调整了标签排布,现在饼图标签在各种情况下都不会发生重叠,个人感觉比Visifire的饼图标签排布要好,虽然Visifire的饼图标签不会重叠,但连接线可能会出现重叠 13、借鉴了Visifire的标签智能适应,对各种Chart图的标签显示进行了重新定位,现在柱状图/Bar图的标签显示可以自行决定是水平排布还是垂直排布,是位于内部还是位于外部等等,而区域图的标签则使用了Win7窗口的文字区域背景的高斯模糊技巧,这样可以适应各种背景,而Visifire的标签色则通过底部背景色的计算来确定前景色,测试后发现在某些性色下显示不理想,在Y轴方向上,标签文字能自适应显示。 14、轴标签和数据点值标签都添加了格式化字符串属性的设定 15、轴添加了交替颜色显示设定 16、增加了一些新的Chart类型:Stock/AreaSpline/AreaStepLine/RangeArea/RangeSplineArea/Stacked100AreaSpline/StackedAreaSpline 对Candlestick进行了小幅的调整,现在宽度自适应,以及适应国的红涨绿跌股市颜色 总而言之,微软的控件库做得很标准,还是很好修改的,相对于微软的这个库,讲究的是WPF的那种注重其神而忽略其形,WPFVisifire则比较传统,而Telerik则在WPF上走得更远,模板全在外部定制和修改。连动画都在外面做,所以新上手的人在使用Telerik Chart时会比WPFVisifire难得多,但可修改性也强得多。 最后一直想在历史曲线取消点动画(及默认的透明度动画),以便提高执行效率,但微软的那部分动画不熟,总是修改失败。 后来类似Visifire添加QuickLine,但没完成。 可以发邮件wuyang26@live.cn讨论。

604

社区成员

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

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