I
imacih
Unregistered / Unconfirmed
GUEST, unregistred user!
首先,我是菜鸟。。。
程序是这样的,数据表中有一字段只有‘入住’,‘空闲’,‘保留’三种状态,对应于三个按钮,当前数据为哪一状态,哪一按钮就Enabled,而其它的则Disabled。
允许用户修改数据,当在DBGrid中选中某一行并且进行修改后,应该立刻更新按钮的状态。下程序段是实现用户把数据从‘入住’改为‘空闲’的,但总是运行到最后
一个procedure时就出错,错误信息为:
Access violation at address 004EE86F in module 'EK.exe'. Read of address 000002F4。
本人为此搞了好几个小时都找不出原因,所以只能在此请大侠指点一下了。或者有没有别的方法实现我想要的功能?谢谢!
procedure TDMForm.sbLiveOutClick(Sender: TObject);
begin
if dmData.adodmBed.FieldByName('BedState').AsString = '入住' then
begin
if Application.MessageBox('真的要进行离退处理吗?', '确认', MB_OKCANCEL) = IDOK then
begin
Application.CreateForm(TCheckLiveOutForm, CheckLiveOutForm);
with dmData.adodmUser do //根据用户ID查找用户资料
begin
Close;
Open;
Locate('UserID', dmData.adodmBed.FieldByName('CurUserID').Value, [loPartialKey]);
CheckLiveOutForm.lbName.Caption := FieldByName('UserName').AsString;
CheckLiveOutForm.lbFactoryName.Caption := FieldByName('UserFactoryName').AsString;
end;
CheckLiveOutForm.edtLiveOutDate.Text := DateToStr(Date); //系统自动给出离退日期
CheckLiveOutForm.ShowModal;
end
end
else
Application.MessageBox('房间没有人住,不能进行离退处理!', '错误', MB_OK);
end;
procedure TCheckLiveOutForm.btnOKClick(Sender: TObject);
begin
with dmData.adodmUser do
begin
Edit;
FieldByName('UserState').Value := '离退';
FieldByName('LiveOutDate').AsString := edtLiveOutDate.Text;
Post;
end;
with dmData.adodmBed do
begin
Edit;
FieldByName('BedState').Value := '空闲'; //房间标记为空闲
FieldByName('CurUserID').Value := NULL;
Post;
end;
Close;
Release;
DMForm.ChangeBtnState;
end;
procedure TDMForm.ChangeBtnState;
begin
if dmData.adodmBed.FieldByName('BedState').AsString = '空闲' then
begin
sbLiveIn.Enabled := True;
sbActOrHold.Enabled := True;
sbLiveOut.Enabled := False
end
else if dmData.adodmBed.FieldByName('BedState').AsString = '入住' then
begin
sbLiveIn.Enabled := False;
sbActOrHold.Enabled := False;
sbLiveOut.Enabled := True
end
else if dmData.adodmBed.FieldByName('BedState').AsString = '保留' then
begin
sbLiveIn.Enabled := False;
sbActOrHold.Enabled := True;
sbLiveOut.Enabled := False;
end;
end;
程序是这样的,数据表中有一字段只有‘入住’,‘空闲’,‘保留’三种状态,对应于三个按钮,当前数据为哪一状态,哪一按钮就Enabled,而其它的则Disabled。
允许用户修改数据,当在DBGrid中选中某一行并且进行修改后,应该立刻更新按钮的状态。下程序段是实现用户把数据从‘入住’改为‘空闲’的,但总是运行到最后
一个procedure时就出错,错误信息为:
Access violation at address 004EE86F in module 'EK.exe'. Read of address 000002F4。
本人为此搞了好几个小时都找不出原因,所以只能在此请大侠指点一下了。或者有没有别的方法实现我想要的功能?谢谢!
procedure TDMForm.sbLiveOutClick(Sender: TObject);
begin
if dmData.adodmBed.FieldByName('BedState').AsString = '入住' then
begin
if Application.MessageBox('真的要进行离退处理吗?', '确认', MB_OKCANCEL) = IDOK then
begin
Application.CreateForm(TCheckLiveOutForm, CheckLiveOutForm);
with dmData.adodmUser do //根据用户ID查找用户资料
begin
Close;
Open;
Locate('UserID', dmData.adodmBed.FieldByName('CurUserID').Value, [loPartialKey]);
CheckLiveOutForm.lbName.Caption := FieldByName('UserName').AsString;
CheckLiveOutForm.lbFactoryName.Caption := FieldByName('UserFactoryName').AsString;
end;
CheckLiveOutForm.edtLiveOutDate.Text := DateToStr(Date); //系统自动给出离退日期
CheckLiveOutForm.ShowModal;
end
end
else
Application.MessageBox('房间没有人住,不能进行离退处理!', '错误', MB_OK);
end;
procedure TCheckLiveOutForm.btnOKClick(Sender: TObject);
begin
with dmData.adodmUser do
begin
Edit;
FieldByName('UserState').Value := '离退';
FieldByName('LiveOutDate').AsString := edtLiveOutDate.Text;
Post;
end;
with dmData.adodmBed do
begin
Edit;
FieldByName('BedState').Value := '空闲'; //房间标记为空闲
FieldByName('CurUserID').Value := NULL;
Post;
end;
Close;
Release;
DMForm.ChangeBtnState;
end;
procedure TDMForm.ChangeBtnState;
begin
if dmData.adodmBed.FieldByName('BedState').AsString = '空闲' then
begin
sbLiveIn.Enabled := True;
sbActOrHold.Enabled := True;
sbLiveOut.Enabled := False
end
else if dmData.adodmBed.FieldByName('BedState').AsString = '入住' then
begin
sbLiveIn.Enabled := False;
sbActOrHold.Enabled := False;
sbLiveOut.Enabled := True
end
else if dmData.adodmBed.FieldByName('BedState').AsString = '保留' then
begin
sbLiveIn.Enabled := False;
sbActOrHold.Enabled := True;
sbLiveOut.Enabled := False;
end;
end;