var
  str: String;
begin
  str := '-1';
  ComboBox1.Items.AddObject('0', TObject(PChar(str)) );
  str := ADOQuery1.FieldByName('code').AsString;   //这行有问题
  ComboBox1.Items.AddObject('1', TObject(PChar(str)) );
end;procedure TForm1.ComboBox1Change(Sender: TObject);
var
  str: String;
begin
  str := StrPas(PChar(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));
  showmessage( str );
end;
选第一行时没问题,但选第二行时,显示怪码。为什么呀??

解决方案 »

  1.   

    var 
      str:^String; 
    begin 
      new(str);
      str^ := '-1'; 
      ComboBox1.Items.AddObject('0', TObject(str)); 
      new(str);
      str^:= ADOQuery1.FieldByName('code').AsString;  //这行有问题 
      ComboBox1.Items.AddObject('1', TObject(str)); 
    end; procedure TForm1.ComboBox1Change(Sender: TObject); 
    var 
      str: String; 
    begin 
      str :=(pstring(ComboBox1.Items.Objects[ComboBox1.ItemIndex]))^;
      showmessage( str ); 
    end; 
      

  2.   

    因为str 只是临时变量,超出上面那部分代码的时候就已经无效了,你把他的地址保存下来也没用.
    1楼利用动态创建对象的方法,解决了地址失效的问题,但是如何释放这些占用的内存会比较麻烦.如果你的原意是想在ComboBox里面显示数据表的字段,建议改用在Item里面保存Book的方式
      

  3.   

    想確認一下、当関Form時、new(str)占用的内存会不会自動释放?
      

  4.   


    不会,要用Dispose()手动释放。
      

  5.   

    TRzComboBox有Name和Value两列,嫌一楼方法释放麻烦可以用这个。