unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    List:TList;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
tem1,tem2:String;
pP:Pchar;
b:Integer;
begin
     tem1:='alex';
     tem2:='---';
     pP:=pChar(tem1+tem2);
     List.Add(pP);
     tem1:='yy';
     tem2:='-dd';
     pP:=pChar(tem1+tem2);
     List.Add(pP);//i:=i+1;
     for b:=0 to (List.Count-1) do
        ListBox1.AddItem(PChar(List.Items[b]),nil);
     ListBox1.AddItem(PChar('------------------'),nil);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
List:=TList.Create();
end;end.为何当按钮事件响应4次后,在ListBox里面就出现乱码了呢?!请高手指点!谢谢!

解决方案 »

  1.   

    晕,TList是这么用的吗,请问??
      

  2.   

    没试过 这个,
    你试试list.items.add
    我觉得字符串用ansistring 不挺容易么
      

  3.   

    修改成这样就可以了。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
      private
      List:TList;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
    tem1,tem2:String;
    pP:Pchar;
    b:Integer;
    begin
         List:=TList.Create();
         tem1:='alex';
         tem2:='---';
         pP:=pChar(tem1+tem2);
         List.Add(pP);
         tem1:='yy';
         tem2:='-dd';
         pP:=pChar(tem1+tem2);
         List.Add(pP);//i:=i+1;
         for b:=0 to (List.Count-1) do
            ListBox1.AddItem(PChar(List.Items[b]),nil);
         ListBox1.AddItem(PChar('------------------'),nil);
         List.Free;
    end;end.
      

  4.   

    有可能超过PChar的长度
    系统自动取出十六进制数的最后255位就不一定是正确的字符结果。
      

  5.   

    List:TList;
    你不需要Create的么TList一般保存 指针对象的比较好
    你string的就用TStringList
      

  6.   

    List:=TList.Create();
    记住以后,这类东西在这里释放一下,
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     List.Free;
    end;
      

  7.   

    呵呵,各位大虾请别见怪。现在调试一个程序,就是往TList里面添加字符出问题。上面的程序事件函数中只在TList中添加一次,按多少下都没问题的,但是上面的代码的确在我的机器上按了4次按钮,Combox里面就出现'?'了的 我用的是DELPHI6  对了上面的代码只是一个测试用的代码。请大虾们指点啊
      

  8.   

    我在窗体的构造函数中Create了的
      

  9.   

    用 TStringList....tem1:='alex';
         tem2:='---';
         pP:=pChar(tem1+tem2);
    List.Add(pP);
    // 我问你 你这个pp是指向哪里的?? 后面的pChar(tem1+tem2) 又在哪里??
    这是临时产生的一个对象 而且没有分配空间的 <你没有给它分配空间>  然后你把一个临时的地址放到List中去,那最后不乱了套才怪,。。程序没崩溃已经不错了因为List传入的是指针,根本没有COPY过程,而TStringList传入的是string,会有一个COPY过程,所以是安全的。。
      

  10.   

    帮你改成这个:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        procedure Button1Click(Sender: TObject);
      private
      List:TList;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
    tem1,tem2:String;
    pP:Pchar;
    b:Integer;
    begin
         List:=TList.Create();
         tem1:='alex';
         tem2:='---';
         pP:=pChar(tem1+tem2);
         List.Add(pP);
         tem1:='yy';
         tem2:='-dd';
         pP:=pChar(tem1+tem2);
         List.Add(pP);//i:=i+1;
         for b:=0 to (List.Count-1) do
            ListBox1.AddItem(PChar(List.Items[b]),nil);
         ListBox1.AddItem(PChar('------------------'),nil);
         List.Free;
    end;end.
      

  11.   

    我要的是多次插入(联系点按钮),楼上的说的,释放后,是无法连续点击的。小弟对delphi不熟悉,那请问,要在TList中保存string的对象,如何实现呢?!
      

  12.   

    TList传入的参数不是Pointer类型的么?
      

  13.   

    将tem1 tem 换成全局变量乱得跟厉害!请我在TList中如何保存局部对象呢?!TList中能够将局部对象COPY后保存么?!
      

  14.   

    楼上的大虾,我知道。你是说没点一次按钮Create一次List,但是我要的不是这样的效果。List是全局的,要不我也不会在窗体创建时CREATE了的
      

  15.   

    知道wsm连续点击多次就会出问题吗。。1. 你的List是全局的
    2. List中间保存的变量<指针>是LOCAL的你第一次加了2个进去 那么List中count为2
    然后第二次又加了2个进去 List中count为4
    现在你获取List中的指针所指向的内容时,你说第一次加入的两个地址现在会怎么样??这谁也说不清
    因为 这些是编译器 & 系统给你分配的。。原来的地址可能有效 也可能没效。。所以可能出错。。你可以在这样if List = nil then
      List := TList.Create;
     // your code.... // end;
    List.Free;
    List := nil;...