我写了一段程序,能非常正常运行,然后我在其间加了一个信息提示的Application.MessageBox('xxx','xxx',MB_OK)了之后就报告:project project.exe raised exception class EAccessViolation with message'Access violation at address 0045229b in module 'project.exe'.Read of address 00000208',process stopped.Use Step or Run to continue.我跟踪了一下,发现是在访问一个子对话框中的DBEdit1.Text时,取不到值:
strTemp := form1.DBEdit1.Text;//这里非法访问但是如果把Application.MessageBox('xxx','xxx',MB_OK);注释掉就没有这个问题了,strTemp := form1.DBEdit1.Text就能访问了。好不理解,向各位求教了!~~谢谢~~

解决方案 »

  1.   

    首先你要理解一下MessageBox的用法,MessageBox还有一种表达方式MessageBox(xx.Handle,'xx','xx',MB_OK),那么我们可以非常清楚MessageBox一定要建立在一个Handle上的,那么问题是否以及解决了。
    商榷。
      

  2.   

    form1创建了,前面说了,如果注释掉application.messagebox()则一点问题都没有我连showMessage()都用过了,还是一样
      

  3.   

    另外单独创建一个项目.单独测试messagebox语句,如果还出错.重装吧.否则就是你程序写错了.
      

  4.   

    已经单独测试过messagebox了,没问题程序写错了也不可能在没有messagebox的时候正常,一加上messagebox()就出错吧?而且我的只是这样:messagebox('数量不能为空','提示',MB_OK);非常简单的提示而已……
      

  5.   

    这种情况我也遇到.是MessageBox()之前进行了pChar之类的操作,访问了非法的内存,然后在显示里会出错.将代码贴出来吧.
      

  6.   

    messagebox()中的参数不对,在D7中该函数的第一个参数是handle,你缺了第一个参数,导致后面的参数都负错了
      

  7.   

    楼上的,必须要handle么?学习中。
      

  8.   

    var iItemInv : Integer;//库存数量  vFrmAddOrderLine := TFrm_AddOrderLine.Create(Application);
      try
        if vFrmAddOrderLine.ShowModal() = mrOK then
        begin
          sItemCode := vFrmAddOrderLine.dblkcbxItemCode.Text;
          iQuantity := StrToInt(trim(vFrmAddOrderLine.edtQuantity.Text));      aqItemInv.Close;
          aqItemInv.SQL.Clear;
          aqItemInv.SQL.Add('select * from T_ITEM_INV where ITEM_CODE=:sItemCode');
          aqItemInv.Parameters[0].Value := sItemCode;
          aqItemInv.Open;      iItemInv :=0;
          if not aqItemInv.IsEmpty then
            iItemInv :=aqItemInv.FieldByName('QUANTITY').AsInteger;      aqItemInv.Close;      if iItemInv + iQuantity < 0 then  //当iQuantity为负数的时候表示出库
          begin
            Application.MessageBox('此物料库存不足。','提示',MB_OK);//这里如果注释掉就没有问题
            iQuantity := 0 - iItemInv;//调整出库数量为最大库存量
          end;      with lvOrderLines.Items.Add do
            Caption := sItemCode;
            SubItems.add(vFrmAddOrderLine.dbedtItemDesc.Text);//如果没有注释messagebox,跟踪到这里出错,注释了之后就没有问题
            SubItems.add(vFrmAddOrderLine.dbedtItemUnit.Text);
            SubItems.add(IntToStr(iQuantity));
          end;
      finally
        vFrmAddOrderLine.Free;
      end;
    --------------------------
    代码太多了,不好贴,整理了一下,大家看看吧,多谢了
      

  9.   

    我想可能是这个问题:
    在vFrmAddOrderLine.ShowModal后,vFrmAddOrderLine可能已经从内存释放了(譬如vFrmAddOrderLine的OnClose设置Action := caFree),当然后面所有的引用都可能引起非法访问错误,跟注释或不注释messagebox没有关系,不注释不错只是凑巧而已。
    建议你看看TFrm_AddOrderLine单元,或者设置TFrm_AddOrderLine的OnClose中Action := caHide;再重新试试??
      

  10.   

    To baguli(巴古里):
    正是在vFrmAddOrderLine的OnClose我设置了Action := caFree
    :)问题解决了,太感谢你了~~~