各位xdjm快帮帮忙啊,我做的是用delphi开发activex控件。需要实现的功能是:
    对选中记录的PBDT_PAY_METHOD字段进行集体赋值。(CHOOSE_FLAG字段已经在TDBGridEh中显示为CheckBox,其中‘0’代表选中,‘1’代表不选中;PBDT_PAY_METHOD字段已做成下拉框);程序代码:
procedure TATest.cdsCheckPBDT_PAY_METHODChange(Sender: TField);
var tem : string ;
begin
        cdsCheck.DisableControls ;
        tem := cdsCheckPBDT_PAY_METHOD.AsString ;
        cdsCheck.First ;
        while not cdsCheck.Eof do
        begin
           if cdsCheckCHOOSE_FLAG.AsString = '0' then
           begin
            cdsCheck.Edit ;
            cdsCheckPBDT_PAY_METHOD.AsString := tem ;
           end;
           cdsCheck.Next ;
        end;
        cdsCheck.EnableControls ;   
end;报错:project D:\Program Files\Internet Explorer\IEXPLORE.exe faulted with message:'access voilation at .... write of .....

解决方案 »

  1.   

    问题可能出在 cdsCheckPBDT_PAY_METHOD.AsString := tem ;导致了递归调用,陷入死循环,但还没有更好的解决办法。
      

  2.   

    楼上说的对,修改如下:
    procedure TATest.cdsCheckPBDT_PAY_METHODChange(Sender: TField);
    var tem : string ;
    begin
            //添加代码,TATest.Tag的初始值需为0
            if cdsCheck.ControlsDisabled then exit;        cdsCheck.DisableControls ;
            tem := cdsCheckPBDT_PAY_METHOD.AsString ;
            cdsCheck.First ;
            while not cdsCheck.Eof do
            begin
               if cdsCheckCHOOSE_FLAG.AsString = '0' then
               begin
                cdsCheck.Edit ;
                cdsCheckPBDT_PAY_METHOD.AsString := tem ;
               end;
               cdsCheck.Next ;
            end;
            cdsCheck.EnableControls ;
    end;
      

  3.   

    “//添加代码,TATest.Tag的初始值需为0”后面部分是废话,呵呵,原来是想通过设置TATest.Tag来防止重入的,现在用了cdsCheck.ControlsDisabled来判断,不要误会啊。
      

  4.   

    谢谢楼上的兄弟,问题解决了,我还想问一下,如果循环条件是:
    while (not cdsCheck.Eof) and cdsCheck.Locate('CHOOSE_FLAG','0',[loCaseInsensitive]) do
    为什么有的时候能执行,有的时候就在第一条记录处出现死循环啦
      

  5.   

    cdsCheck.Next ;
    不应该放在if里面,if cdsCheckCHOOSE_FLAG.AsString <> '0' 就成了死循环了,因为没法next了