窗体里有动态生成的控件,在关闭时报错?

killserver 2009-08-05 12:45:27
窗体里有tchart控件,动态生了一些checkbox,勾选checkbox作图,在关闭窗体时报错,代码如下:
//这是释放控件过程,在窗体close事件里有调用.
procedure TFrmHB.FreeFormCtrl();
var i,igroup:integer;
begin
try
for igroup:=self.PageControl1.PageCount-1 downto 0 do begin
for i:=self.PageControl1.Pages[igroup].ControlCount-1 downto 0 do begin
self.PageControl1.Pages[igroup].Controls[i].Free;
end;
end;
for i:=self.GroupBox1.ControlCount-1 downto 0 do begin
self.GroupBox1.Controls[i].Free;
end;
for i:=self.Chart1.SeriesCount-1 downto 0 do begin
self.Chart1.Series[i].Free;
end;

except
on e:erangeerror do
begin
messagedlg(e.Message,mterror,[mbok],0);
end;
end;
//这是生成控件的过程 在点击作图按留时调用
procedure TFrmHB.setItemView();
var
pColorBox: TColorBox;
pCheckBox: TCheckBox;
intTop,intLeft,intCell,colorid:integer;
ssql,itemcode,itemName:string;
begin
intCell:=1;inttop:=20;intleft:=10;
ssql:='SELECT * FROM V_UserView where userid=' + self.userid + ' and fitemcode<>''sstate'' order by forder';
customerdata.GetAdoQuery(ssql);
if customerdata.ADOQuery1.IsEmpty then exit;
try
while not customerdata.ADOQuery1.Eof do begin
if not customerdata.ADOQuery1.FieldByName('FitemName').IsNull then begin
itemName:= customerdata.ADOQuery1.FieldValues['FitemName'];
if not customerdata.ADOQuery1.FieldByName('fitemcode').IsNull then begin
itemcode:=customerdata.ADOQuery1.FieldValues['fitemcode'];
end;
if not customerdata.ADOQuery1.FieldByName('colorindex').IsNull then begin
colorid:=strtoint(customerdata.ADOQuery1.FieldValues['colorindex']);
end else begin
colorid:=0;
end;
pCheckBox:=TCheckBox.Create(self);
pcheckbox.Parent:=self.GroupBox1 ;
pCheckBox.Caption:= itemName;

pcheckbox.Name:='pcheckbox'+ itemcode;
pcheckbox.Hint:=inttostr(intCell);
if intcell<=2 then pcheckbox.Checked:=true;
pcheckbox.Width:=70;
pcheckbox.Top:=inttop;
pcheckbox.Left:= intLeft;
pcheckbox.OnClick:=myCheckBoxClick;

pColorBox:=TColorBox.Create(self);
pColorBox.Parent:=self.GroupBox1 ;
pColorBox.Name:='pColorBox' + itemcode;
pColorBox.Hint:=inttostr(intCell);
pColorBox.ItemIndex:=colorid;
pColorBox.Width:=40;
pColorBox.Top:= pcheckbox.top;
pColorBox.Left:=pcheckbox.Left+pcheckbox.Width;
pColorBox.OnChange:=myColorBoxChange;
intCell:=intCell+1;
if self.GroupBox1.ControlCount =10 then begin
inttop:=inttop+20;
intleft:=10;
end else begin
intleft:=intleft+pcolorbox.Width+pcheckbox.Width;
end;
end;
customerdata.ADOQuery1.Next;
end;
finally
customerdata.ADOQuery1.Close;
customerdata.pubCnn.Close;
end;

end;
//这是作图的过程 在myColorBoxChange myCheckBoxClick都有调用
procedure TFrmHB.DrawWhole();
var
pSeries:tFastLineSeries;
i,ii,intSeries,intCell:integer;
tmpHorizAxis:TchartAxis;
pColorBox: TColorBox;
pCheckBox: TCheckBox;
colorboxname:string;
begin
if pUnitp=nil then exit ;
try
self.Chart1.CustomAxes.Clear;
self.Chart1.SeriesList.Clear;

for i:=0 to self.GroupBox1.ControlCount-1 do begin
if self.GroupBox1.Controls[i].ClassName='TCheckBox' then begin
pCheckBox:= TCheckBox(self.GroupBox1.Controls[i]);
if pCheckBox.Checked then begin
colorboxname:=stringreplace(pCheckBox.Name,'pcheckbox','pColorBox',[rfReplaceAll]);
pColorBox:=TColorBox(self.GroupBox1.FindChildControl(colorboxname));
pSeries:=TFastLineSeries.Create(self);
self.Chart1.AddSeries(pSeries);
pSeries.SeriesColor:= pColorBox.Selected;
pSeries.xValues.Order:=lonone;
pSeries.xValues.Sort;
pSeries.YValues.Order:=loascending;
pSeries.YValues.Sort;
pSeries.Title:=pCheckBox.Caption; {//}
intCell:=strtoint(pCheckBox.Hint);
for ii:=0 to high(pUnitp.arr_Sd_Jiao_P_T) do begin
pSeries.AddXY(strtofloat(self.StringGrid1.Cells[intCell,ii+1]),strtofloat(self.StringGrid1.Cells[0,ii+1]));
end;
if self.chbsame.Checked=false then begin
self.Chart1.CustomAxes.Add;
intSeries:= self.Chart1.CustomAxes.Count-1;
tmpHorizAxis:=self.Chart1.CustomAxes[intSeries];
tmpHorizAxis.Horizontal:=true;
tmpHorizAxis.Axis.Color:=pColorBox.Selected;
tmpHorizAxis.PositionPercent:=100+self.Chart1.CustomAxes.Count*3;
tmpHorizAxis.LabelsSize:=5;
tmpHorizAxis.LabelsFont.Size:=7;
self.Chart1.AxisBehind:=false;
pSeries.CustomHorizAxis:=tmpHorizAxis;
end;
end
end;
end;
except
on e:erangeerror do
messagedlg(e.Message,mterror,[mbok],0);
end;
end;
...全文
100 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
火龙岛主 2009-08-05
  • 打赏
  • 举报
回复
pColorBox:=TColorBox.Create(self);
使用self创建的控件,无须手工释放。系统会自动递归释放
pColorBox:=TColorBox.Create(nil);
需要手工释放的。

解决方法:去掉对FreeFormCtrl过程的调用即可。
sparklerl 2009-08-05
  • 打赏
  • 举报
回复
注意释放的顺序

你先释放GroupBox里面的控件,再释放GroupBox,再释放Page
hongqi162 2009-08-05
  • 打赏
  • 举报
回复
跟踪一下是不是那些已经释放掉了你又释放了一遍导致出现错误地址操作
killserver 2009-08-05
  • 打赏
  • 举报
回复
找到错误了,谢谢各位提醒。 是这一句的错误 ,
self.Chart1.SeriesList.Clear;
这个问题,让我改了两天了。
7年 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 smallhand 的回复:]
pColorBox:=TColorBox.Create(self);
使用self创建的控件,无须手工释放。系统会自动递归释放
pColorBox:=TColorBox.Create(nil);
需要手工释放的。

解决方法:去掉对FreeFormCtrl过程的调用即可。
[/Quote]
学习到了、
kampan 2009-08-05
  • 打赏
  • 举报
回复
我觉得2楼说的有道理,顺序应从里到外
de410 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zyxip 的回复:]
要是写成 TCheckBox.Create(self) 没有必要在窗体关闭的时候自己释放。TCheckBox.Create(nil) 的时候才需要自己释放

释放时应该先释放容器内部的控件,在释放外层的.

如果在绘图的过程中有访问到这些个控件,在释放时应该停止执行绘图的过程。
否则在Close 事件中可能控件让释放了,但绘制过程还是会访问的。
[/Quote]

up~~
newfang 2009-08-05
  • 打赏
  • 举报
回复
create参数为application何self都无需手工释放,参数为nil时才需要手工释放
ZyxIp 2009-08-05
  • 打赏
  • 举报
回复
要是写成 TCheckBox.Create(self) 没有必要在窗体关闭的时候自己释放。TCheckBox.Create(nil) 的时候才需要自己释放

释放时应该先释放容器内部的控件,在释放外层的.

如果在绘图的过程中有访问到这些个控件,在释放时应该停止执行绘图的过程。
否则在Close 事件中可能控件让释放了,但绘制过程还是会访问的。
包含使用和开发接口文档,及Delphi、VB、VC++、C#.net、VB.net和WEB下的demo。 ACReport简介 Anycell Report(简称AC Report)是一款中国式报表组件,是国内最早的基于表格,支持图文混排、公式和脚本的中国式报表工具之一。就如Anycell Report的名称那样,灵活强大的表格功能一直是AC Report区别于其它软件或控件最显著的特征之一,AC Report 表格取消了传统表格概念中“列”的概念,每一行上的单元格数量可以不等,且可以自由活动,勿须上下对齐,在制作复杂的中国式报表可以避免很多不必要的合并拆分操作,制作表格更加方便和随心所欲,并且省省力。AC Report单元格支持多种丰富的形态,例如格式化文本、图片、图表、条码、OLE容器等。 AC Report的一些基本特点: 1.独具特色的表格,风格与Word表格相似,但可以做出比Word或Excel更灵活的表格来。 2. 功能全面、专业的中国式报表设计器,中国用户更易于学习和接受。 3.支持多种单元格样式,可以打印图像、图表(直方图、折线图等)、Rich文本、 条形码、中式财务帐薄、支持在报表中嵌入Word、Excel文档等。 4. 强大的计算和合计功能。内置表达式解析系统和函数库。 5. 可扩充性,可以在应用程序中给报表引擎扩充函数库、报表样式和单元格样式。 6.支持多种报表样式,如清单式、分组、交叉表、以及子报表等。 7. 支持多栏式报表。 8. 和应用程序完美结合,支持windows下所有的开发工具和程序语言(例如Delphi、C++、VB、PB、.NET、易语言),最终用户在设计器可直接选择打印字段,生成表达式,报表设计器用户容易学习理解。 9. 支持脚本和窗体编程,报表设计人员可以编写脚本、在报表设计器为报表添加窗体,为最终用户提供更丰富的交互功能。 10. 既可以使用应用程序中的数据集,也支持在报表中直接连接各种数据库,通过SQL直接获得报表需要的数据。 11.无失真导出为Excel、Word、Html格式的文档 Ver 2.3主要新增或修改的功能 一、增加的功能: 1、支持二维条码 2、图片单元格支持gif格式 4、增加了一边生成报表一边预览的选项,减少用户的等待感 5、清单报表增加了明细分栏功能。 6、分组报表增加每组分页补充空行功能。 7、清单和分组报表中,补充空行,可以选择是否显示横线和竖线条。 8、页面选项中增加“保持页脚在页面底部”、“是否套打模板”、“不打印背景图”等选项。 9、增加了批量设置字段别名的方法:SetDataFieldAliasName,使得英文字段在报表中可以用中文展现,更便于最终用户设计报表。 10、在设计器页面左边“报表样式”显示区中单击报表样式标签可以直接调出报表样式设置窗口 11、增加了Delphi下专用的VCL控件(对COM的再次封装,Delphi开发人员使用AC更加简单方便)。 12、Delphi的接口源码中增加了LoadFromCommonBlobField和SaveToCommonBlobField函数,可以直接从一个非ADO的Dataset中装入或保存模板文件。 13、函数优化,在同一页中如果两个或多个公式有公共子公式,则此公共子公式只会执行一次,例如:有以下两个公式: NumToCnText(sum(DocLines, DocLines.LineTotal)/10000, 1) NumToCnText(sum(DocLines, DocLines.LineTotal) * 100, 1) 在运行报表,sum(DocLines, DocLines.LineTotal) 函数在同页中只会被执行一次。 二、bug修正和功能变动 1、修正了右对齐单元格,不能及刷新的问题。 2、修正了调用Init方法后,退出应用程序报错的问题。 3、修正了退出“报表页面选项”窗口后,右下脚属性列表没有及刷新的问题。 4、在设计器中,如果某行的上边线不可见,则不覆盖上一行单元格的下边线(旧版中会覆盖)。 5、修正了不能撤销粘贴单元格操作的bug 6、修正了页面属性中打印机名称不能保存的问题 三、demo 1、增加了“保存模板到数据库”的demo 2、增加了自定义预览界面的demo 3、增加了分组合并报表demo 4、增加了清单报表在一页中分多栏打印的demo 5、增加了web下的demo 四、其它 1、界面的优化,工具栏风格改变、增加了所选单元格在标尺上的位置标注等。 2、AcRptEngine新增了一些方法,如ClearContents、ExportAcrToStream等

5,930

社区成员

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

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