StringList不是很好用吗?为什么不用。
如果一定要,那从TList派生一下吧。

解决方案 »

  1.   

    你这样还是自己管理不了,string(缺省是Ansistring)类型是自管理的。你想自己管理字符串,就得用字符数组,自己分配管理。
    你上面的代码,pascal语法检查同不过的,
    你这样的做法不用担心,list释放时就释放存入的指针值,指针指向的对象她不负责,你要自己负责。但string是自管理的,这里不用担心。
    List.Add(Pchar(s))j;//add pointer类型。
    测试代码:
    var
      s:string;
      List: TList;
    begin
      s:='abc';
      List := TList.Create;
      list.add(Pchar(s));
      showmessage(string(list.items[0]));
      List.Free;
      showmessage(s);
    end;TList大都用来做管理对象链表什么的,你管理string,不如用Tstringlist;
      

  2.   

      是这样,我想自己写一个类似于数据库引擎的东西,可以往内存中写任何类型数据,如果用字符数组太浪费内存,就算这个字段是空的也要分配那么多内存,而用string就可以只占用4个字节。
    to laza :你说得对。但问题是List如果是全局变量,我在别的过程中用showmessage(string(list.items[0]));也可以显示正常,这时这块内存是不是已经被系统释放了?再对这个地址操作岂不是很危险?我想动态建立一个string->将地址写入Tlist->在程序完后释放。
    难道只能单独针对String类型再加上一个TStringList吗?
      
      
      

  3.   

    这样,把 string定义为全局变量,程序结束才释放字符串。单元 interface 部分的var 添如全局字符串...
    var
      Form1: TForm1;
      U_Str1, U_str3: string;implementation
    ....//测试代码:
      U_str1 := 'Form1Unit_String';
      U_Str3 := 'Form1Unit_String';  list.add(Pchar(U_str1));
      list.add(Pchar(U_str3));  showmessage(string(list.items[0]));
      showmessage(string(list.items[1]));
      List.Free;
      showmessage(U_Str1);
      showmessage(U_Str3);
      

  4.   

    list:=Tlist.create;//list是全局变量
    ....
    var s:string;
    begin
      s:='abc';
      list.add(s);
    end;
    在其它过程中:
    var v:string;
    begin
    v:=copy(list.ad(s),x,y);//其中,x是字符窜的起始位置,y是结束位置(可以量长度取得字符串全长,如Length(list.item[0]))。copy函数在内存中新辟了一块空间,不会和其它内容冲突。
    List.Free;//最后释放list此外,你可以看一下copy function的说明及其例子
      

  5.   

    对不起,刚才打错字了。应该是
    v:=copy(list.item[0],x,y);
      

  6.   

    binyao:s 是局部变量,出了那个过程以后s所指的string也许已经回收了?
    我想到一个方法:设全局变量:var p:Pchar;
    procedure X;
    ...
    getMem(p,length(s));
    p:=s;
    ...procedure Y;
    ...
    freemem(p);
    ...
    各位高手,行不行?
      

  7.   

    其实,Delhi本身就对字符串做了很多包装,而且这些都是做在编译器那一级的,上述讨论的完全都可以用TStringList来实现,也不会出现浪费内存的事情,反而是用TList倒又可能丢失内存,因为Delphi的字符串(不包括ShortString)都是有引用计数的,上述转来转去反而要么都是内存,要么访问无效地址
      具体可看《深入Delphi编程》一书
      

  8.   

    不会吧,不用Stringlist真的不行吗?
      

  9.   

    不用当然可以,但是要自己处理很多东西,
    而这些Delphi都已经做好了,干吗不用?
      

  10.   

    再说,TStringList里的string也是用的AnsiString,每个Item只比List多用4个字节,
    其它的用来储存字符串的内存都是动态管理的,这里,我想是你想得太多了
      

  11.   

    你为什么喜欢画蛇添足?String类型就很安全。
    它其实可以当成一个数组来使用,不过下标从1开始索引,索引0为其引用计数,当等于0时系统会自动释放此String对象。索引-1为其长度。
      

  12.   

    Lin之言缪矣,结构是对的,位置说错了
      

  13.   

    我还是换个方式再说一遍我的问题吧。我在内存开辟一个4个字节的地址,用一个指针p指向它,然后想在这个地址存一个string或是pchar类型的字符串(当然存的是一个字符串指针,字符串的类容由系统或是自己另外开辟空间)请问怎么存?想在程序结束时解除怎么解?
      

  14.   

    出于某些原因用tstringlist实在不方便