请问一个问题(50分)

  • 主题发起人 主题发起人 imacih
  • 开始时间 开始时间
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;
 
你单步调试一下,看问题在哪里?然后再查找问题所在,你的代码这么多,没有人会给你仔细检查的
 
??
其他的还看不清楚,但是你有动态创建FORM的过程,却没找到你释放的过程,这是错误的!
 
其实大部分代码都不用看的,它们多是对数据表进行操作的代码。
动态创建了Form,也释放了啊,第二个过程的
Close;
Release;
就是释放窗体了(不知道这样对不对)。
其实我想知道的只是为什么运行到以下的几句时,就会出现上面所说的错误。。
sbLiveIn.Enabled := True;
sbActOrHold.Enabled := True;
sbLiveOut.Enabled := False
 
怎么没人回答的?
 
是在“Release”,你把对象全释放掉了。?!!!!!
把“Release”去掉准行。
 
怎么会呢?我Release掉的是子窗口,而
sbLiveIn.Enabled := True;
sbActOrHold.Enabled := True;
sbLiveOut.Enabled := False
访问的都是主窗口里的。
BTW:按你的方法试了,不行!
 
我也遇到了一样的问题.我的问题是出现在向空数据表inster一条记录后.
我用的也是access数据库,总觉得没有ms sql好用.
 
没有给一个满意的答复吗?
 
我觉得你还是使用的对象被释放了,
你可以调整一下语句顺序试一下:

DMForm.ChangeBtnState; /////////////////放在这儿
Close;
Release;
 
试了,不行。
 
将第二个过程的最后一句去掉:
////// DMForm.ChangeBtnState;
在第一个过程的 CheckLiveOutForm.ShowModal; 后面加上:
ChangeBtnState;
不是更容易调试。

会不会因为 post 锁定数据库的问题。但好象又不是,因为后面只是读。

把第二个过程分成两步来调试:
在TDMForm 中单独用一个按钮 来执行 ChangeBtnState;,
但一定要在 TCheckLiveOutForm.btnOKClick 执行后等一段时间,感觉到post应该成功了。
 
终于找到错误了,把
DMForm.ChangeBtnState;的前缀去掉即可!!!!
FT!
 
后退
顶部