内存寻址错误
在程序刚刚运行时触发了这个错误: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建立时,数据模块还没有建立,所以出现地址错误,最好把这段代码放在数据模块的建立事件中