DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: deliping
今日帖子: 1
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 smallmouse (小老鼠) ★☆☆☆☆ -
普通会员
2004/3/8 22:27:38
标题:
都是BOF和EOF惹的祸 浏览:1323
加入我的收藏
楼主: 我想这几个问题出现的原因与“问题:这5个问题怎样解决”中的“问题3”相同
  这些问题所涉及到的窗体及其组件的设置与“问题:这5个问题怎样解决”相同

//Refresh按钮的OnClick事件为:
procedure TfmSimple.sbRefreshClick(Sender: TObject);
begin          
 try
   dsMaster.DataSet.DisableControls;
   dsMaster.DataSet.Close;
   dsMaster.DataSet.Open;
 finally
   dsMaster.DataSet.EnableControls;
 end;
end;

//Delete按钮的OnClick事件为:
procedure TfmSimple.sbDeleteClick(Sender: TObject);
begin
 if dsMaster.DataSet.State = dsBrowse then
  begin
   if Application.MessageBox('您确定要删除这笔数据吗?', MB_YesNo+Mb_IconQuestion) = IDYes) then
     dsMaster.DataSet.Delete   
   else
     Exit;
  end;
end;

//自定义方法SetButton的实现:
procedure TfmSimple.SetButton;
begin
...
 if dsMaster.DataSet.State in [dsInsert, dsEdit] then
//当数据集是“插入”和“修改”状态时,不能进行“编辑”和“删除”操作
  begin    
    sbEdit.Enabled := False;
    sbDelete.Enabled := False;
  end
 else
//当数据集是“浏览”状态并且当前记录不是“首笔”或“末笔”记录时,可以进行“编辑”和“删除”操作
  begin
    sbEdit.Enabled := ((dsMaster.DataSet.State in [dsBrowse])
                        and (not dsMaster.DataSet.Eof) or
                        (not dsMaster.DataSet.Bof));
    sbDelete.Enabled := ((dsMaster.DataSet.State in [dsBrowse])
                          and (not dsMaster.DataSet.Eof) or
                          (not dsMaster.DataSet.Bof));
  end;
...
end;

//TDataSource的OnStateChange事件为:
procedure TfmSimple.dsMasterStateChange(Sender: TObject);
begin
 ...//这里也有代码,在此省略
 if dsMaster.DataSet.State = dsBrowse then
   begin   //dsMaster.DataSet在浏览模式
    if dsMaster.DataSet.RecordCount > 0 then
     begin      //前端有数据
      fmMain.StatusBar1.Panels[1].Text := '浏览数据';
      fmMain.StatusBar1.Panels[3].Text := 'Ctrl+Del删除 F3新增 F4修改 F12离开';
     end
    else
     begin      //前端无数据
      fmMain.StatusBar1.Panels[1].Text := '当前无数据';
      fmMain.StatusBar1.Panels[3].Text := '离开F12 新增F3';
     end;
   end;
end;

问题:

  可以看到,当数据表中无数据时,“修改”按钮和“删除”按钮不能使用,这在fmSimple窗体中的自定义方法SetButton中是这样实现的(该自定义方法的全部代码请参看“问题:这5个问题怎样解决”):

  ①.怎样在删除数据时,自动检测表中的数据数量,当数据全部删除后,不需单击“刷新”按钮就自动将数据集状态从“有数据”改变到“无数据”?并将“删除”按钮变为禁用?而在“新增”一笔数据后,“删除”按钮自动恢复?  

  ②.怎样在表中数据全部删除后,不需单击“刷新”按钮就自动将数据集状态从“有数据”改变到“无数据”?并自动将“修改”按钮变为禁用?而在“新增”一笔数据后,“修改”按钮自动恢复?    
  
  ③.以上代码运行后,将表中的数据全部删除,Refresh按钮仍然可用,需要退出fmSimple窗体后,再次打开才能将数据集状态从“有数据”改变到“无数据”而且若在此时,不关闭程序,直接在数据库中添加一笔数据后,单击“刷新”按钮,并不能使“前单、后单、最前、最后、新增、修改、删除”等按钮恢复为可用,也就是说,此时数据集状态仍是“无数据”状态。我将“刷新”按钮的OnClick事件中的代码删除的只剩dsMaster.DataSet.Close; dsMaster.DataSet.Open;两句后,发现以上问题解决,这是为什么?我们知道,当表中的数据量很多时,需要使用DisableControls、EnableControls这两个方法来控制数据控件与数据集组件的连接,但使用它们,就不能达到我预期的目的;不使用它们,当以后数据量多了以后,又怕每次“刷新”都会浪费很长时间。有没有好的方法解决这个问题?

                                            Smallmice
                                            E-mail:Smallmice1111@tom.com
      
  

----------------------------------------------
-
作者:
男 waterstone (waterstone) ★☆☆☆☆ -
盒子活跃会员
2004/3/9 7:59:58
1楼: 已阅!

----------------------------------------------
我来自农村广阔的田野我的每一个动作都很夸张http://waterstone.51r.com
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行62.5毫秒 RSS