Project A.exe raised exception class EAccessViolation 项目引发异常类EAccessViolation,“模块‘ 地址访问违规”的纠错
3、地址的冲突,关键是参数地址的冲突,在Delphi中,自身使用的一些参数名称上的冲突,时常出现。因此,将打印代码中的局部变量FileName,改成要FileMane。2、执行打印代码,再执行读取 sName:=ClientDataSet1.FieldByName('姓名').AsString;在使用参数时,不要和Delphi的VCL 使用的名称一致,在使用与VCL常用的名称一致时,前。养老习惯,
一、问题表现
1、打开二个主副关联数据表,由副表打印带图像表格后,点击主表(打开副表),出现下列错误:
Project Best.exe raised exception class EAccessViolation with message 'Access violation at address 00402492 in module 'best.exe'.
即:
项目Best.exe引发异常类EAccessViolation,消息为“模块' Best.exe '中地址00402492的访问违 规”。
二、检查代码
1、出错代码行
sName:=ClientDataSet1.FieldByName('姓名').AsString;
2、打印代码
procedure TCertificate_Old_Frm.GridppReport8Initialize(Sender: TObject);
var S,FileName: string;
begin
GridppReport8.LoadFromFile( ReportPath+'资格证书_身份证.grf' );
with ClientDataSet2 do
begin
FileName:=DBEdit1.text;
if FileName<>'' then
begin
GridppReport8.ControlByName('Photo1').AsPictureBox.LoadFromFile(FileName);
end;
FileName:=DBEdit2.text;
if FileName<>'' then
begin
GridppReport8.ControlByName('Photo2').AsPictureBox.LoadFromFile(FileName);
end;
S:=FieldByName('姓名').AsString+'(居民身份证),'+FieldByName('证书编码').AsString+',与原件一致。';
GR1:=GridppReport8.AddParameter('说明1',grptString);
GridppReport8.ParameterByName('说明1').AsString:=S;
end;
end;
三、分析原因
1、从原代码看。原则上是无错误的。都能单独执行,无错误;
2、执行打印代码,再执行读取 sName:=ClientDataSet1.FieldByName('姓名').AsString;
3、地址的冲突,主要是引用时,地址的紊乱,造成这个结果的一个主要原因,就是VCL参数相同,引起的,如设置局部变量FileName,但是在VCL是,往往多个子参数是FileName,因此,顺着这个思路,在出现错误代码开始,向前推,检查代码。试着变化代码,测试是否出错。
将打印代码中的局部变量FileName,改成要sFileMane。问题解决。
四、思考
在使用参数时,不要和Delphi的VCL使用的参数、变量、属性名称一致,在使用与VCL常用的参数、变量、属性名称相似时,要通过添加前缀或后缀的方法,改变名称,如: sFileName 或 FileName_1。养成良好习惯,可以避免一些,不必要的麻烦和出错。
这里,关键是参数地址的冲突,在Delphi中,自身使用的一些参数名称上的冲突,时常出现。这些,往往是Delphi编译时的不严谨造成的,但作为编程者,应当规避。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)