for m:=0 to self.ComponentCount-1 do
        if self.Components[m].ClassName='TComboBox' then begin
          CB := TComboBox(Self.Components[i]);
          for j:=0 to adoquery.FieldCount-1 do begin
            if trim(adoquery.Fields.Fields[j].DisplayName)='学校' then
              cb.ItemIndex:=cb.Items.IndexOfName(adoquery.Fields.Fields[j].DisplayName);
          end;
        end;运行到第六行时总说访问了非法内存地址,试了一下问题出在cb.Items.IndexOfName上,不让访问,但为什么呢?如何解决?

解决方案 »

  1.   

    for m:=0 to self.ComponentCount-1 do
      if self.Components[m].ClassName='TComboBox' then begin
         CB := TComboBox(Self.Components[m]);  //请注意:这里不应是 i 吧, 应是m
                               ============= 
         for j:=0 to adoquery.FieldCount-1 do begin
           if trim(adoquery.Fields.Fields[j].DisplayName)='学校' then
              cb.ItemIndex:=cb.Items.IndexOfName(adoquery.Fields.Fields[j].DisplayName);
         end;
      end;还有一个问题: cb是如何定义的?
      

  2.   

    你给出来的代码还会有点少,我估计是这里有问题
    if self.Components[m].ClassName='TComboBox' then begin
      CB := TComboBox(Self.Components[i]);// <--这里的"i"是不是应该是"m"
      

  3.   

    cb.ItemIndex不必要你这样赋值的吧?你要取这个index的话,自己定义个变量了
      

  4.   

    程序如下写没问题,你参照改一下,不要那个CB 存在procedure TForm1.Button1Click(Sender: TObject);
    var
      i: integer;
      Cur: integer;
    begin
      for i := 0 to Self.ComponentCount - 1 do
      begin
        if Self.Components[i].ClassName='TComboBox' then
        begin
          Cur := TComboBox(Self.Components[i]).Items.IndexOf('学校');
          TComboBox(Self.Components[i]).ItemIndex := Cur;
        end;
      end;
    end;