CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  VCL组件使用和开发

(急)类的编程

楼主jklee(飞)2005-04-20 15:34:53 在 C++ Builder / VCL组件使用和开发 提问

我是个菜鸟,我想实现一个类似与TStringList的类,不同的是我的类用的是WideString不是AnsiString;有没有高手赐教一下啊!! 问题点数:30、回复次数:8Top

1 楼smellteen(仰天)回复于 2005-04-20 16:01:15 得分 1

AnsiString::WideChar  
   
  这个函数不是可以把ansistring转换成一个wide-character   array么?  
   
  还有必要去另外实现一个么?Top

2 楼NetSpider9804040(网络蛛蛛)回复于 2005-04-20 17:36:18 得分 1

对啊,可以转换的啊,何需重写!Top

3 楼jklee(飞)回复于 2005-04-21 15:36:54 得分 0

哦   ~~~  
  具体要怎么写啊~~     没写过啊Top

4 楼jklee(飞)回复于 2005-04-21 15:47:46 得分 0

比如我想吧一个WideString的值放到TStringList中要怎么做啊?   好像不行啊Top

5 楼songhtao(三十年孤独)回复于 2005-04-21 15:58:35 得分 1

比如我想吧一个WideString的值放到TStringList中要怎么做啊?   好像不行啊  
  转换成AnsiString放进去,取出来后再转回WideString满足特殊要求。Top

6 楼jklee(飞)回复于 2005-04-21 16:09:52 得分 0

转换成AnsiString放进去,取出来后再转回WideString满足特殊要求。  
  这样不行啊,我把一个特殊字符放进去出来就成"?"了Top

7 楼Waiting4you(毛毛)回复于 2005-04-22 09:38:03 得分 20

看来要自己编链表了:(  
  这是偶编的链表模版类,没经过严格测试,不过现在用用还行  
  #ifndef   TDataList_HPP  
  #define   TDataList_HPP  
  template   <class   T>   class   TDataList  
  {  
  private:  
                  typedef   struct   TI{  
                                  T   Data;  
                                  struct   TI   *Next;  
                  }CItem,*   pItem;  
                  pItem   FItem,FFirst,FLast;  
                  int   CurLoc;  
                  #pragma   option   push   -vi-  
                  pItem   getItem(int   Index)  
                  {  
                                  if(Index<0)Index=0;  
                                  if(Index>=Count)Index=Count-1;  
                                  if(CurLoc>Index)  
                                  {  
                                                  FItem=FFirst;  
                                                  CurLoc=0;  
                                  }  
                                  while(FItem!=NULL&&CurLoc<Index)  
                                  {  
                                                  CurLoc++;  
                                                  FItem=FItem->Next;  
                                  }  
                                  return   FItem;  
                  }  
                  #pragma   option   pop  
                  #pragma   option   push   -w-rvl  
                  T   &getData(int   Index)  
                  {  
                                  pItem   ti=getItem(Index);  
                                  if(ti!=NULL)return   ti->Data;  
                  }  
                  #pragma   option   pop  
                  void   setData(int   Index,T   &data)  
                  {  
                                  pItem   ti=getItem(Index);  
                                  if(ti!=NULL)ti->Data=data;  
                  }  
                  int(   *FOnCompare)(T   &,T   &);  
                  int   FCount;  
                  #pragma   option   push   -vi-  
                  void   QS(pItem*   ppItem,int   Left,int   Right)  
                  {  
                                  pItem   x,y;  
                                  int   i,j;  
                                  i=Left;j=Right;  
                                  x=ppItem[(i+j)/2];  
                                  do{  
                                                  while(FOnCompare(ppItem[i]->Data,x->Data)<0&&i<Right)i++;  
                                                  while(FOnCompare(x->Data,ppItem[j]->Data)<0&&j>Left)j--;  
                                                  if(i<=j)  
                                                  {  
                                                                  y=ppItem[i];  
                                                                  ppItem[i]=ppItem[j];  
                                                                  ppItem[j]=y;  
                                                                  i++;  
                                                                  j--;  
                                                  }  
                                  }while(i<=j);  
                                  if(Left<j)QS(ppItem,Left,j);  
                                  if(i<Right)QS(ppItem,i,Right);  
                  }  
                  #pragma   option   pop  
  public:  
                  __property   T   Items[int   Index]   =   {read=getData,write=setData};  
                  __property   int   Count=   {read=FCount};  
                  __property   int(   *OnCompare)(T   &,T   &)   =   {read=FOnCompare,write=FOnCompare};  
                  TDataList();  
                  ~TDataList();  
                  int   Add(const   T   &data);  
                  void   Delete(int   Index);  
                  void   Insert(int   Index,const   T   &data);  
                  void   Clear(void);  
                  int   IndexOf(const   T   &data);  
                  T&   Last(void){return   FLast->Data};  
                  T&   First(void){return   FFirst->Data};  
                  void   Sort(void);  
  };  
  template   <class   T>   TDataList   <T>   ::   TDataList()  
  {  
                  FLast=FItem=FFirst=NULL;  
                  FCount=0;  
                  CurLoc=0;  
                  FOnCompare=NULL;  
  }  
  template   <class   T>   TDataList   <T>   ::   ~TDataList()  
  {  
                  if(FCount>0)Clear();  
  }  
  int   template   <class   T>   TDataList   <T>   ::   Add(const   T   &data)  
  {  
                  pItem   Item=new   CItem;  
                  Item->Data=data;  
                  Item->Next=NULL;  
                  if(FCount==0)  
                  {  
                                  FItem=FFirst=Item;  
                                  CurLoc=0;  
                  }  
                  else  
                  {  
                                  FLast->Next=Item;  
                  }  
                  FLast=Item;  
                  return   FCount++;  
  }  
  void   template   <class   T>   TDataList   <T>   ::   Delete(int   Index)  
  {  
                  pItem   Item;  
                  if(FCount<=0)return;  
                  if(Index>=FCount)Index=FCount-1;  
                  if(Index<=0)  
                  {  
                                  Item=FFirst->Next;  
                                  delete   FFirst;  
                                  FFirst=Item;  
                                  if(CurLoc==0)   FItem=Item;  
                  }  
                  else  
                  {  
                                  Item=getItem(Index-1)->Next;  
                                  FItem->Next=Item->Next;  
                                  delete   Item;  
                                  if(CurLoc==Count-2)FLast=FItem;  
                  }  
                  FCount--;  
                  if(FCount==0)FLast=FItem=FFirst=NULL;  
  }  
  void   template   <class   T>   TDataList   <T>   ::   Insert(int   Index,const   T   &data)  
  {  
                  pItem   Item=new   CItem;  
                  Item->Data=data;  
                  if(Index>Count)Index=FCount;  
                  if(Index<=0)  
                  {  
                                  Item->Next=FFirst;  
                                  FFirst=Item;  
                                  CurLoc++;  
                                  if(FCount==0)  
                                  {  
                                                  FItem=FLast=FFirst;  
                                                  CurLoc=0;  
                                  }  
                  }  
                  else  
                  {  
                                  getItem(Index-1);               //CurLoc=Index-1;  
                                  Item->Next=FItem->Next;  
                                  FItem->Next=Item;  
                                  if(Index>=Count)FLast=Item;  
                  }  
                  FCount++;  
  }  
  void   template   <class   T>   TDataList   <T>   ::   Clear(void)  
  {  
                  pItem   aItem=FFirst,bItem;  
                  while(aItem)  
                  {  
                                  bItem=aItem;  
                                  aItem=aItem->Next;  
                                  delete   bItem;  
                  }  
                  FFirst=FItem=FLast=NULL;  
                  FCount=CurLoc=0;  
  }  
  int     template   <class   T>   TDataList   <T>   ::   IndexOf(const   T   &data)  
  {  
                  pItem   aItem=FFirst;  
                  int   i=0;  
                  while(aItem)  
                  {  
                                  if(aItem->Data==data)return   i;  
                                  aItem=aItem->Next;  
                                  i++;  
                  }  
                  return   -1;  
  }  
  void       template   <class   T>   TDataList   <T>   ::   Sort(void)  
  {  
                  if(FOnCompare==NULL)return;  
                  if(FCount<2)return;  
                  int   i;  
                  pItem*ppItem=new   pItem[FCount];  
                  ppItem[0]=FFirst;  
                  for(i=1;i<FCount;i++)ppItem[i]=ppItem[i-1]->Next;  
                  QS(ppItem,0,FCount-1);  
                  FItem=FFirst=ppItem[0];  
                  CurLoc=0;  
                  for(i=1;i<FCount;i++)ppItem[i-1]->Next=ppItem[i];  
                  FLast=ppItem[FCount-1];  
                  FLast->Next=NULL;  
                  delete   []ppItem;  
  }  
  #endif  
  Top

8 楼Waiting4you(毛毛)回复于 2005-04-22 09:43:46 得分 7

用法:  
  TDataList   <WideString>   wLst;  
  Lst.Add(WideString("ABCDE"));//添加  
  Lst.Delete(0);//删除  
  for(int   i=0;i<Lst.Count;i++)Lst.Items[i]=WideString("Changed!");//修改  
  Lst.Clear();//清除  
  Lst.Sort();//排序  
  Lst.Insert(0,WideString("It's   Inserted!"));//插入  
  用法和TStringList类似  
  Top

相关问题

  • delphi编程!(急!)
  • 急:GDI+编程
  • Help!!(用对象编程)关于类的操作!急急急!!!!!!!!!
  • php编程急问
  • 急问 winsock编程
  • WinInet类编程请教……
  • 关于vb类编程
  • 急!急!急!编程问题
  • 编程问题,急急急......
  • 急~~C#类库编程的两个问题,2小时后揭贴

关键词

  • ti
  • template
  • 转换
  • ffirst
  • fitem
  • tdatalist
  • curloc
  • fcount
  • flast
  • ppitem

得分解答快速导航

  • 帖主:jklee
  • smellteen
  • NetSpider9804040
  • songhtao
  • Waiting4you
  • Waiting4you

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo