两段代码就差一个操作符 一个报错 一个正常
   报错 <list index out of bounds (-1)>
   for I := FAdataSet.Fields.Count - 1 downto 0  do
    begin
      fldname := LowerCase(FAdataSet.Fields[i].FieldName);
      FAdataSet.Fields[i].Visible := (not (Pos(fldname+';',LowerCase(FInvisibleFields))>0))
            and (Pos(fldname+';',LowerCase(FvisibleFields))>0);
    end;    正常
    for I := FAdataSet.Fields.Count - 1 downto 0  do
    begin
      fldname := LowerCase(FAdataSet.Fields[i].FieldName);
      FAdataSet.Fields[i].Visible := (not (Pos(fldname+';',LowerCase(FInvisibleFields))>0))
            or (Pos(fldname+';',LowerCase(FvisibleFields))>0);
    end;

解决方案 »

  1.   

    or,只判断其中一个满足就可以,and需要两个条件都判断,也就是判断(Pos(fldname+';',LowerCase(FvisibleFields))>0)时可能出错,不过看你的提示,也不该是这呀,应该是哪里超出索引了
      

  2.   

    条件1 and  条件2 
    条件1 or  条件2区别大了,前者判断条件1的时候如果为假这个时候估计条件2就不用判别了。 也就是说在and的情况下,从左往右检查条件是否满足,如果不满足则后面不用检测了。但是or的情况不一样,应该是都检测了。估计是这样的、
      

  3.   

    你这里的情况现在是 (Pos(fldname+';',LowerCase(FInvisibleFields))>0 )成立。 取非后,就变成不成立,所以后面的那个条件没执行。如果and这里改成 (Pos(fldname+';',LowerCase(FInvisibleFields))>0),不要那个not,估计会和or情况报一样的错地
      

  4.   

    发现了应该是FvisibleFields字符串为空的原因