环境为Delphi 2010
当获取ComboBox.Items.Objects属性出现错误
'Access violation at address 004075E8 in module 'Test.exe'. Read of address 00000027'
调用语句为
ShowMessage(String(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));
请教各位,哪里错了?

解决方案 »

  1.   

    1.当前的ItemIndex为-1
    2.当前的ComboBox1.Items.Objects没有存入实例。
      

  2.   

    用法没问题吧procedure TForm11.cbb1Change(Sender: TObject);
    begin
      ShowMessage(cbb1.Items.Objects[cbb1.ItemIndex].ClassName);
      if cbb1.Items.Objects[cbb1.ItemIndex] is TButton then
        ShowMessage(TButton(cbb1.Items.Objects[cbb1.ItemIndex]).name);
    end;procedure TForm11.FormCreate(Sender: TObject);
    begin
      cbb1.Items.AddObject(btn1.Name, btn1);
      cbb1.Items.AddObject(btn2.Name, btn2);
      cbb1.ItemIndex := 0;
    end;
      

  3.   

    Items.Objects中你确认添加内容了吗
      

  4.   

    Sorry之前代码列示得不够清晰,我重写了个简单的示例,依然报错。procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(String(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ComboBox1.AddItem('测试',TObject('1'));
      ComboBox1.ItemIndex:=0;
    end;
      

  5.   

    simonhehe 你的代码是可以正常运行的,但,后面的Object必须是个对象?我直接放个字符串不可以吗?
      

  6.   


    必须是对象
    你如果非要放字符串, 可以这么干
    unit Unit11;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm11 = class(TForm)
        btn1: TButton;
        cbb1: TComboBox;
        procedure FormCreate(Sender: TObject);
        procedure cbb1Change(Sender: TObject);
      private
        strArr : array of string;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form11: TForm11;implementation{$R *.dfm}procedure TForm11.cbb1Change(Sender: TObject);
    begin
      Caption := string(cbb1.Items.Objects[cbb1.ItemIndex]);
    end;procedure TForm11.FormCreate(Sender: TObject);
    var
      I: Integer;
    begin
      SetLength(strArr, 10);
      for I := 0 to 10 do
        strArr[i] := 'aa' + IntToStr(i);  for I := low(strArr) to High(strArr) do
        cbb1.Items.AddObject(IntToStr(i), TObject(strArr[i]));
    end;end.
      

  7.   

    可是
    strArr[i]不也是个字符串吗?
    为什么要弄个字符串数组,字符串数组就是对象了?字符串就不是了?新手,还望赐教!
      

  8.   

    主要看你字符串变量的声明位置--会影响有效范围private
        strArr : array of string;
    //这样声明在当前单元内strArr的值始终有效(除非你修改了)
      

  9.   

    所以cbb1.Items.Objects[cbb1.ItemIndex]最终显示的是strArr[],而我的'1'直接就消失了,
    我一直认为这些变量内容被赋值到cbb1中去了,已经和strArr[]或者'1'无关了呢。所以也就是case5166说的生命周期了。
    多谢了,结贴.
      

  10.   

    AddItem实际存储的应该是个指针,所以你这句
    ComboBox1.AddItem('测试',TObject('1'));
    改成
    ComboBox1.AddItem('测试', TObject(PChar('1')));
    就可以了
      

  11.   


    我试过你这个PChar('1'),是不行的。
      

  12.   

    我在d7测试了下,可以的,d中对象都是指针,所以pchar一定没问题,读出的时候强制转换为pchar,例如你哪个Caption := string(cbb1.Items.Objects[cbb1.ItemIndex]);改为
    Caption := pchar(cbb1.Items.Objects[cbb1.ItemIndex]);