首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

内存寻址异常

2012-02-09 
内存寻址错误在程序刚刚运行时触发了这个错误:AccessViolationatAddress004DE670inmoduleMVHMIS.exe.Reado

内存寻址错误
在程序刚刚运行时触发了这个错误:Access   Violation   at   Address   004DE670   in   module   MVHMIS.exe.Read   of   address   00000158
自己觉得可能是在下面两个过程中出现问题,但是找不出来,麻烦各位帮忙看看
这个先遍历工资数据集的工资记录,然后进行加总,程序编译时出现:sum,s定义了但是程序没有使用到,为什么呢?
procedure   TPayForm.Total;
var
    i,s,sum:integer;
begin
    if   DM.ADSPay.RecordCount <1   then
        edTotal.Text:= ' '
    else
        begin
            DM.ADSPay.First;
            sum:=0;
            for   i:=0   to   DM.ADSPay.RecordCount-1   do
                begin
                    s:=StrToInt(DM.ADSPay.FieldByName( 'pay ').AsString);     //为s赋值
                    DM.ADSPay.Next;
                    sum:=sum+s;
                end;
      end;
end;

这个是在窗体创建时开始进行TQuery   控件SQL语句的初始化,可能有问题:
procedure   TPayForm.FormCreate(Sender:   TObject);
begin
    with   DM.ADQPay   do
        begin
            Close;
            SQL.Clear;
            //下面的SQL语句可能会有点问题,可是程序没有报错
            SQL.Add( 'select   *   from   (select     EmName   as   names,   pay   from     employee ');
            SQL.Add( 'union   select   PcName   as   names   ,   pay   from   physician ');
            SQL.Add( 'union   select   NName   as   names,   pay   from   nurse ');
            SQL.Add( 'union   select   TcName   as   names   ,   pay   from   technician) ');
            SQL.Add( 'a   order   by   names ');
            open;
        end;
    DM.ADSPay.Open;
end;

[解决办法]
你只是向SUM赋了值,但是有了值的SUM应该做什么用呢?没有语句, 所以编译器对其进行了优化,就去掉了SUM和S所参与的语句, 并提示你SUM,S有声明但是没有使用.

最起码应该是
procedure TPayForm.Total;
var
i,s,sum:integer;
begin
if DM.ADSPay.RecordCount <1 then
edTotal.Text:= ' '
else
begin
DM.ADSPay.First;
sum:=0;
for i:=0 to DM.ADSPay.RecordCount-1 do
begin
s:=StrToInt(DM.ADSPay.FieldByName( 'pay ').AsString); //为s赋值
DM.ADSPay.Next;
sum:=sum+s;
end;
edTotal.text := IntToStr(Sum)
end;
end;
[解决办法]
TPayForm建立时,数据模块还没有建立,所以出现地址错误,最好把这段代码放在数据模块的建立事件中

热点排行