各位前辈,小弟现在在练习一个工资管理程序(随书带的),程序的主窗口有5个dbgrid,其中dbgrid1显示
员工号和员工姓名,dbgrid2,dbgrid3,dbgrid4,dbgrid5分别显示固定福利津贴、月度奖金、月度福利津贴、
月度扣发,当在主窗口输入员工号后,固定福利津贴、月度奖金、月度福利津贴、扣发就分别显示出该员工的福利津贴、
月度奖金、月度福利津贴、扣发,另有按纽用于添加固定福利津贴、月度奖金、月度福利津贴、扣发。
dbgrid2,dbgrid3,dbgrid4,dbgrid5的datasource属性取值分别为DM——main.Ds_salary_1,
DM——main.Ds_salary_2,DM——main.Ds_salary_3,DM——main.Ds_salary_4;
Ds_salary_1,Ds_salary_2,Ds_salary_3,Ds_salary_4,的dataset属性的取值分别是
T_salary_1,T_salary_2,T_salary_3,T_salary_4;
T_salary_1,T_salary_2,T_salary_3,T_salary_4的tablename都是salary_other,用不同的filter条件在
4个dbgrid显示相应的内容。
有这么一个问题:程序中删除固定福利津贴、月度奖金、月度福利津贴、扣发是在dbgrid2,dbgrid3,dbgrid4,dbgrid5
中单击右键(主窗口放置了一个popmenu,name是M——delete,caption是“删除当前记录”),删除当前员工
的不需要的固定福利津贴、月度奖金、月度福利津贴、扣发;程序中代码如下:
在procedure TF_main.M_deleteClick(Sender: TObject);
begin
  if Sender is TDBGrid then
    (Sender as TDBGrid).DataSource.DataSet.Delete;
end;
但实际操作发现删除不掉,在
end;行设了断点,查看如下:
(Sender as TDBGrid).DataSourc=expression illegal in evaluator
(Sender as TDBGrid).DataSource.DataSet.=nil
(Sender as TDBGrid).DataSource.DataSet.Delete=inaccessible value
是哪里有什么问题?
    小弟多谢了!!!

解决方案 »

  1.   

    dbgrid显示的是table或query中的数据集的内容,想要删dbgrid的当前行,只要删table 
    或query中的记录就行了. 
    语句: 
    table.edit; 
    table.delete; 
    或 
    query.edit; 
    query.delete;
      

  2.   

    TO tommy-linux
        谢谢你的回答。是我的问题提的不明确,还有要说明的我补充一下,设置固定福利津贴、月度奖金、月度福利津贴、扣发都是操作的salary-other表,salary-other表结结构如下:/* Table: SALARY_OTHER, Owner: MISDBA */
    CREATE TABLE SALARY_OTHER (ID INTEGER NOT NULL,
            YEARMONTH CHAR(7) NOT NULL,
            PERSON CHAR(6) NOT NULL,
            OTHER_TYPE CHAR(1) NOT NULL,
            NAME VARCHAR(10) NOT NULL,
            MONEY FLOAT,
            DESCRIPTION VARCHAR(200),
    CONSTRAINT SALARY_OTHER_ID PRIMARY KEY (ID));其中的OTHER_TYPE CHAR(1) NOT NULL是类型(0奖金,1福利,2津贴,3扣发),程序中有相应的代码procedure TF_main.i_person_idChange(Sender: TObject);
    begin
      if (Pos(' ',i_person_id.Text)=0) and DM_main.Database.Connected then
      begin //判断输入完整并且数据库连接
        With DM_main do
        begin
          Q_person.Close;
          Q_person.Params.ParamValues['PERSON']:=i_person_id.Text;
          Q_person.Open;
          if Q_person.RecordCount=1 then
          begin
            i_person_name.Text:=Q_person['NAME'];
            //i_depart_id.Text:=Q_person['DEPARTMENT'];
            T_salary_set.Filter:='PERSON='''+i_person_id.Text+'''';
            T_salary_set.Filtered:=True;
            T_salary_set.Open;
            if T_salary_set.RecordCount=0 then
              T_salary_set.AppendRecord([i_person_id.Text,0]);
            T_salary_1.Filter:='PERSON='''+i_person_id.Text
              +''' AND YEARMONTH=''0000000'''; //固定福利津贴
            T_salary_1.Filtered:=True;
            T_salary_1.Open;
            T_salary_2.Filter:='PERSON='''+i_person_id.Text
              +''' AND YEARMONTH='''+i_yearmonth.Text
              +''' AND OTHER_TYPE=''0''';     //月度奖金
            T_salary_2.Filtered:=True;
            T_salary_2.Open;
            T_salary_3.Filter:='PERSON='''+i_person_id.Text
              +''' AND YEARMONTH='''+i_yearmonth.Text
              +''' AND (OTHER_TYPE=''1'' OR OTHER_TYPE=''2'')';//福利津贴
            T_salary_3.Filtered:=True;
            T_salary_3.Open;
            T_salary_4.Filter:='PERSON='''+i_person_id.Text
              +''' AND YEARMONTH='''+i_yearmonth.Text
              +''' AND OTHER_TYPE=''3''';//月度扣发
            T_salary_4.Filtered:=True;
            T_salary_4.Open;
          end;
          Q_person.Close;
        end;
      end
      else
      begin //数据不完整
        with DM_main do
        begin
          T_salary_set.Close;
          T_salary_1.Close;
          T_salary_2.Close;
          T_salary_3.Close;
        end;
        i_person_name.Text:='';
      end;
    end;用于显示当员工号输入框的内容改变时,在4个DBGRID中显示出固定福利津贴、月度奖金、月度福利津贴、扣发。
        现在关键问题是如何区分应该删除哪个DBGRID中的,比如我想删除DBGRID1中固定福利津贴中的奖金,200和DBGRID4月度扣发中的扣发1,300。他们在2个DBGRID中,该如何判断是哪个DBGRID发出请求?
        请各位前辈多指点啊!!!
        如需要原码请留下EMAIL,共同学习。
      

  3.   

    1.如果你是想删除关于这个员工的纪录,请用
    table.edit; table.delete; 或 query.edit;query.delete;2.如果你想清空某个dbgird中的某项(比如说奖金),根据员工号找到那个字段值,将其置零。
    用locate或lookup方法可找到某个员工的纪录,在edit模式下对某字段值进行修改,再post就行。修改了表,那么dbgrid中自然就会显示出改后的结果。
    dbgrid显示的只是table或query中的数据集的内容,操作当然还是针对table或query进行。
      

  4.   

    TO silverwonder:
       是想删除某个员工的一条记录(在表中一个员工有多条记录,奖金、扣发都是一条记录),你说的方法我明白,但这里关键问题是sender的类型问题,sender必须是TDBGrid才能删除
    而右键菜单有时候发出的sender是cell之类的对象,如何解决?
    procedure TF_main.M_deleteClick(Sender: TObject);
    begin
      if Sender is TDBGrid then
        (Sender as TDBGrid).DataSource.DataSet.Delete;
    end;
    类似这段代码的意思。
      

  5.   

    关键问题,如何判断sender的类型是DBGRID?
      

  6.   

    使用if Sender.ClassType=TDBGrid then
    如果你想看Sender的具体类名的话:showmessage(Sender.ClassName)
      

  7.   

    TO NIGHTCLOUD:
         非常感谢你的回答,加了showmessage(Sender.ClassName),发现Sender的具体类名是TMenuItem,不是TDBgrid,有什么方法可以使Sender返回的是TDBgrid?
         小弟不胜感激!!!
      

  8.   

    M_deleteClick(Sender: TObject)事件是m_delete的事件,其sender
    当然是m_delete,但可以回朔到是哪一个dbgrid.showmessage((((Sender As TMenuItem).GetParentComponent) as TPopupMenu).PopupComponent.Name)(Sender As TMenuItem).GetParentComponent得到sender(TMenuItme)所属
    的TPopupMenu,
    (... As TPopupMenu).PopupComponent获得当前正在使用该Menu的控件,这
    就是你要找的DBGrid
      

  9.   

    TO NIGHTCLOUD:
         前辈,太谢谢了!!!程序改成procedure TF_main.M_deleteClick(Sender: TObject);
    begin
      showmessage((((Sender As TMenuItem).GetParentComponent) as TPopupMenu).PopupComponent.Name);
      if Sender is TDBGrid then
         (((((Sender As TMenuItem).GetParentComponent) as TPopupMenu).PopupComponent) AS TDBGRID).DataSource.DataSet.EDIT;
          (((((Sender As TMenuItem).GetParentComponent) as TPopupMenu).PopupComponent) AS TDBGRID).DataSource.DataSet.DELETE;
    end;
    功能实现了!!!
        真是太感谢CSDN和热心帮助我的朋友们了,特别是NIGHTCLOUD精确的解答,是你们让我从郁闷变的舒畅无比。
    I LOVE CSDN。
        另外问一下NIGHTCLOUD前辈,你帮我解答的有关回朔方面的知识是怎么学到的,有哪些书和文章介绍啊,小弟初学,还请前辈多多指教啊。:)
      

  10.   

    写成这样更好吧,清晰一点
    procedure TF_main.M_deleteClick(Sender: TObject);
    var
      aDBGrid:TDBGrid;
    begin
      aDBGrid:=TDBGrid(((((Sender As TMenuItem).GetParentComponent) as
        TPopupMenu).PopupComponent));
      aDBGrid.DataSource.DataSet.DELETE;
    end;
      

  11.   

    UP,这样感觉更明确。前辈,您的QQ是多少?:)