点击按钮会出现窗体,窗体里是dbgrideh加ado控件。
有保存事件,会对表里的每一行逐个保存。
当我点击保存,关闭窗体,再打开就会出错list index out of bounds(7),表里面第7列以后的内容全消失了。
如果我不点保存,关闭窗体再打开不会出事。
后来,我手动加了9列,就不会出错。
为什么for i:=1 to 9 do dbgrideh1.columns.add;会不行???
求解决方案~

解决方案 »

  1.   


    procedure TForm10.FormShow(Sender: TObject);
    var i:integer;
        str:string;
    begin
      //用adocommand1新建临时表tmp,存储单据信息
      str:=' if exists(select name from sysobjects where name=''tmp'' and xtype=''u'')';
      str:=str+' drop table tmp';
      str:=str+' create table tmp(sysid int identity(1,1) primary key,productid varchar(20),productname nvarchar(40),';
      str:=str+' productdate datetime,area nvarchar(15),bigunit nchar(1),quantity int,';
      str:=str+' cost decimal(6,2),amount decimal(10,2))';
      adocommand1.CommandText:=str;
      adocommand1.Execute;
      add();//新增一行的函数,可以忽视
      with DBGrideh1 do
      begin
        columns.clear;
        for i:=1 to 9 do columns.add;//这句话因该没问题吧
        columns[0].FieldName:='xh';
        columns[1].FieldName:='productid';
        columns[2].FieldName:='productname';
        columns[3].FieldName:='productdate';
        columns[4].FieldName:='area';
        columns[5].FieldName:='bigunit';
        columns[6].FieldName:='quantity';
        columns[7].FieldName:='cost';
        columns[8].FieldName:='amount';
        columns[0].title.caption:='序号';
        columns[1].title.caption:='饮料编号';
        columns[2].title.caption:='饮料名称';
        columns[3].title.caption:='生产日期';
        columns[4].title.caption:='存放货区';
        columns[5].title.caption:='单位';
        columns[6].title.caption:='数量';
        columns[7].title.caption:='成本价';
        columns[8].title.caption:='金额';
        columns[0].Width:=12*3;
        columns[1].Width:=75;
        columns[2].Width:=12*12;
        columns[3].Width:=12*7;
        columns[4].Width:=12*6;
        columns[5].Width:=12*3;
        columns[6].Width:=12*4;
        columns[7].Width:=12*5;
        columns[8].Width:=12*6;
        for i:=0 to 8 do columns[i].title.Alignment:=tacenter;
        columns[0].ReadOnly:=true;
        columns[1].ReadOnly:=true;
        columns[2].ReadOnly:=true;
        columns[5].ReadOnly:=true;
        columns[8].ReadOnly:=true;
        //可修改项的列名为红色
        columns[3].Title.font.color:=clred;
        columns[4].Title.font.color:=clred;
        columns[6].Title.font.color:=clred;
        columns[7].Title.font.color:=clred;
        frozencols:=4; //冻结前4列
        columns[1].ButtonStyle:=cbsellipsis; //小按钮
        columns[4].ButtonStyle:=cbsauto;     //下拉式菜单
      end;
      adoquery1.Close;
      adoquery1.SQL.Text:='select ROW_NUMBER() over (order by sysid) as xh,* from tmp';
      adoquery1.Open;
      //使用adoquery2,读取x_hq生成存放货区下拉框的值
      adoquery2.Close;
      adoquery2.SQL.Text:='select * from x_hq order by sysid';
      adoquery2.Open;
      while not adoquery2.Eof do
      begin
        dbgrideh1.Columns[4].PickList.add(trim(adoquery2.FieldByName('item').AsString));
        adoquery2.Next;
      end;
      //DBGridEh求和,显示在最后一行
      DBGridEh1.SumList.Active:=True;
      dbgrideh1.FooterRowCount:=1;
      dbgrideh1.Columns[2].Footers.add;
      dbgrideh1.Columns[2].Footers[0].ValueType:=fvtStaticText;
      dbgrideh1.Columns[2].Footers[0].Value:='合计';
      dbgrideh1.Columns[2].Footers[0].Alignment:=taCenter;
      dbgrideh1.Columns[6].Footers.add;
      dbgrideh1.Columns[6].Footers[0].ValueType:=fvtSum;
      dbgrideh1.Columns[6].Footers[0].FieldName:='quantity';
      dbgrideh1.Columns[7].Footers.add;
      dbgrideh1.Columns[7].Footers[0].ValueType:=fvtavg;
      dbgrideh1.Columns[7].Footers[0].FieldName:='cost';
      dbgrideh1.Columns[8].Footers.add;
      dbgrideh1.Columns[8].Footers[0].ValueType:=fvtsum;
      dbgrideh1.Columns[8].Footers[0].FieldName:='amount';
      //单据基本信息
      edit1.ReadOnly:=true;
      edit2.ReadOnly:=true;
      edit1.Text:=createrkid();
      edit2.Text:=form1.statusbar1.Panels[4].Text;
      datetimepicker1.Date:=now;
      memo1.Lines.Clear;
      //dblookupcombobox1的下拉框值
      dblookupcombobox1.KeyValue:=null;
      dblookupcombobox1.ListField:='supplierid;company';
      dblookupcombobox1.KeyField:='supplierid';
      adoquery3.Close;
      adoquery3.SQL.Text:='select * from supplier order by supplierid';
      adoquery3.Open;
      //货款结算基本信息
      edit4.ReadOnly:=true;
      edit6.ReadOnly:=true;
      edit8.ReadOnly:=true;
      edit3.Text:='0'; //优惠默认为0
      edit5.Text:='0'; //初次入库时已付款默认为0
      edit7.Text:='';
      edit4.Text:='';
      edit6.Text:='';
      combobox2.Text:='';
      edit8.Text:=form1.statusbar1.Panels[4].Text;
      //combobox2的下拉框
      combobox2.Items.Clear;
      combobox2.Items.Add('现金');
      combobox2.Items.Add('银行');
      datetimepicker2.Date:=now;
      //定义productdate,quantity,cost字段的onsettext属性
      adoquery1.FieldByName('productdate').OnSetText:=ptestdate;
      adoquery1.FieldByName('quantity').OnSetText:=pjs;
      adoquery1.FieldByName('cost').OnSetText:=pjs;
    end;
    这是formshow的内容,代码太多了,我感觉是dbgrideh的列在又一次创建的时候出错了。是在没办法只能手动加列了。
      

  2.   

    在第一行代码处
      str:=' if exists(select name from sysobjects where name=''tmp'' and xtype=''u'')';--此处设断点
    运行,然后按F8进行调试,当跳到哪一行出现错误,就知道问题在哪了~
    要学会设断点,这样容易调试出错误,看你的代码,冗余度很高啊~