第一次正常,
但是再次调用initDBGridEh时,提示'List index out of bounds(2)'procedure TForm1.FormShow(Sender: TObject);
begin
initDBGridEh;
DBGridEh1.FrozenCols:=2;
end;procedure TForm1.initDBGridEh();
begin
with   ADOQuery1   do
begin
close;
sql.clear;
sql.add(sqlStr);
open;
for   i:=0   to   FieldCount-1   do
begin
Fields[i].Visible:=False;  //调试发现在这边报错,怎么解决呢?
end;
FieldByName('Code').Visible:=True;
end;因为是要先把字段隐藏的
 

解决方案 »

  1.   

    因为第一次执行initDBGridEh时DBGridEh1.FrozenCols是0
    后面执行时DBGridEh1.FrozenCols已经变成上一次设置的值,即2
    结果是要保证列数大于或者等于FrozenCols的值而:
    for i:=0 to FieldCount-1 do
    begin
    Fields[i].Visible:=False;
    ...
    这是把所有的列设置隐藏,
    那肯定就报错了
      

  2.   

    如果'Code'只1显示,在FormShow时应该也是报错
      

  3.   

    那怎么解决啊我最后显示的字段肯定是超过2的
    FieldByName('Code').Visible:=True;
    FieldByName('name').Visible:=True;
    ...
    ...
      

  4.   


    一般不是在formshow中写,你可以在formcreat中写
    先打开dbgrideh的数据源
    adoquery1.open;
    DBGridEh1.FrozenCols:=2;
      

  5.   

    一般这种问题是因为编程不严谨造成的.这种先要判断    col的 count >= 2 才能 锁定啊.无论什么都要先判断.
      

  6.   


    for i:=0 to FieldCount-1 do
    begin
    Fields[i].Visible:=False; 
    end;
    FieldByName('Code').Visible:=True;
    FieldByName('Name').Visible:=True;
    FieldByName('HelpCode').Visible:=True;
    DBGridEh1.FrozenCols:=1;
    end;这样也报错啊
    因为我的ADOQuery1是取出所有字段
    所以需要在后面隐藏,再把需要显示的字段 显示出来
      

  7.   

    如果你要不显示dbgrideh列的话可以试试:
    既然要留下冻结列就从第三列开始:
    for i:=2 to DBGridEh1.Columns.Count-1 do
    begin
    self.DBGridEh1.Columns[i].Visible:=False; 
    end;
      

  8.   

    你在设计期,将相关字段加入dbgrideh,id不加入就可以了.
      

  9.   

    重新置0,设置隐藏后再设置
    ...
    DBGridEh1.FrozenCols:=0;
    for i:=0 to FieldCount-1 do
    begin
    Fields[i].Visible:=False; ...DBGridEh1.FrozenCols:=2;