关于Delphi 2010 的ComboBox.Items.Objects属性

cate 2013-01-22 01:34:34
环境为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]));
请教各位,哪里错了?
...全文
668 15 点赞 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
云朵儿呀 2015-04-01
虽然时隔久远,但我一不小心也遇到了同样的问题,我以前用过类似的用法,翻阅以前的代码发现少了NewStr,也就是说要用指针,
使用方法:
赋值:
由 ComboBox1.AddItem('测试',TObject('1'));
改为ComboBox1.AddItem('测试',TObject(NewStr('1')));

读取:
由 Caption := string(cbb1.Items.Objects[cbb1.ItemIndex]);
改为Caption := Pstring(cbb1.Items.Objects[cbb1.ItemIndex])^;

另参见百度出来的文章:
http://blog.sina.com.cn/s/blog_51f445120100x14a.html
http://blog.csdn.net/xiongmao000738/article/details/6999707

希望可以帮到你!
  • 打赏
  • 举报
回复
引用 13 楼 cate 的回复:
引用 12 楼 bluekitty 的回复:AddItem实际存储的应该是个指针,所以你这句 ComboBox1.AddItem('测试',TObject('1')); 改成 ComboBox1.AddItem('测试', TObject(PChar('1'))); 就可以了 我试过你这个PChar('1'),是不行的。
我在d7测试了下,可以的,d中对象都是指针,所以pchar一定没问题,读出的时候强制转换为pchar,例如你哪个Caption := string(cbb1.Items.Objects[cbb1.ItemIndex]);改为 Caption := pchar(cbb1.Items.Objects[cbb1.ItemIndex]);
  • 打赏
  • 举报
回复
simonhehe 2013-01-22
用法没问题吧
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;
  • 打赏
  • 举报
回复
我看见佛 2013-01-22
1.当前的ItemIndex为-1 2.当前的ComboBox1.Items.Objects没有存入实例。
  • 打赏
  • 举报
回复
cate 2013-01-22
引用 12 楼 bluekitty 的回复:
AddItem实际存储的应该是个指针,所以你这句 ComboBox1.AddItem('测试',TObject('1')); 改成 ComboBox1.AddItem('测试', TObject(PChar('1'))); 就可以了
我试过你这个PChar('1'),是不行的。
  • 打赏
  • 举报
回复
AddItem实际存储的应该是个指针,所以你这句 ComboBox1.AddItem('测试',TObject('1')); 改成 ComboBox1.AddItem('测试', TObject(PChar('1'))); 就可以了
  • 打赏
  • 举报
回复
cate 2013-01-22
所以cbb1.Items.Objects[cbb1.ItemIndex]最终显示的是strArr[],而我的'1'直接就消失了, 我一直认为这些变量内容被赋值到cbb1中去了,已经和strArr[]或者'1'无关了呢。 所以也就是case5166说的生命周期了。 多谢了,结贴.
  • 打赏
  • 举报
回复
simonhehe 2013-01-22
引用 9 楼 cate 的回复:
可是 strArr[i]不也是个字符串吗? 为什么要弄个字符串数组,字符串数组就是对象了?字符串就不是了? 新手,还望赐教!
主要看你字符串变量的声明位置--会影响有效范围 private strArr : array of string; //这样声明在当前单元内strArr的值始终有效(除非你修改了)
  • 打赏
  • 举报
回复
cate 2013-01-22
可是 strArr[i]不也是个字符串吗? 为什么要弄个字符串数组,字符串数组就是对象了?字符串就不是了? 新手,还望赐教!
  • 打赏
  • 举报
回复
simonhehe 2013-01-22
引用 5 楼 cate 的回复:
simonhehe 你的代码是可以正常运行的,但,后面的Object必须是个对象?我直接放个字符串不可以吗? 引用 2 楼 simonhehe 的回复:用法没问题吧 Delphi/Pascal code?12345678910111213procedure TForm11.cbb1Change(Sender: TObject);begin ShowMessage……
必须是对象 你如果非要放字符串, 可以这么干
unit Unit11;

interface

uses
  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.
  • 打赏
  • 举报
回复
cate 2013-01-22
引用 6 楼 case5166 的回复:
关于字符串生命周期的问题。
什么意思,不明白。
  • 打赏
  • 举报
回复
我看见佛 2013-01-22
关于字符串生命周期的问题。
  • 打赏
  • 举报
回复
cate 2013-01-22
simonhehe 你的代码是可以正常运行的,但,后面的Object必须是个对象?我直接放个字符串不可以吗?
引用 2 楼 simonhehe 的回复:
用法没问题吧 Delphi/Pascal code?12345678910111213procedure TForm11.cbb1Change(Sender: TObject);begin ShowMessage(cbb1.Items.Objects[cbb1.ItemIndex].ClassName); if cbb1.Items.Objects[cbb1.I……
  • 打赏
  • 举报
回复
cate 2013-01-22
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;
  • 打赏
  • 举报
回复
kuangning 2013-01-22
Items.Objects中你确认添加内容了吗
  • 打赏
  • 举报
回复
相关推荐
发帖
Delphi
加入

4972

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2013-01-22 01:34
社区公告
暂无公告