delphi 容器类 2
来源:互联网 发布:手机超星怎么看网络课 编辑:程序博客网 时间:2024/06/07 02:07
说道Delphi中的容器类,初学者一定会不以为然地说:“嗨,那很常见啊,不是吗?Delphi中的窗口、Panal组件不就是吗?”
呵呵,说的没错,那些的确是容器组件;不过请大家看清楚我们今天的标题——容器类!!!
嘿嘿,怎么样啊,傻了吧,好好看本小飞龙的讲解吧!
容器类,其实在很多高级编程语言中都有封装(C++、Java中都有的,只不过封装的范围有所不同,但功能大同小异),其他语言的这里我们不提,这里只讨论Delphi中的容器类!
在这里我们要讲解的容器类,以两个最常用的为主线进行展开,他们是:
TStringList 和 TList
在本章中,我们只讨论TStringList,而将TList放在下一章中再详细讨论
第一章、TStringList
在这里我们要讲解TStringList,但同时有一个相关类是不能忽略的,那就是TStrings类
TStringList是由TStrings派生而来,而Tstrings是一个抽象类,他继承于Tpersistent类。
因此,我们将TStrings类 和 TStringList类 一同讲解,并做比较
1、TStrings、TStringList不是可视组件,只是两个通用类,因此他们与可视组件TMemo、TRichEdit没有可比性。
2、TStrings、TStringList都是管理“字符串-附属对象”这样一个列表,前者是抽象类,不能被实例化,只是定义了一些通用的属性、方法,而后者是从TStringList继承而来,可以实例化使用。如:
var S1, S2: TStrings; S3: TStringList;begin S1 := TStrings.Create; //这样就不可以(因为TStrings是抽象类,不能直接创建对象) S3 := TStringList.Create; //这样是可以的 S2 := TStringList.Create; //这样也是可以的(多态的典型使用)end;
注意:
上面S2的声明是TStrings类型,他是将一个TStringList类创建了对象之后,赋值给声明的TStrings变量。这是典型的多态的使用。(什么?你不知道什么是多态?乖乖隆咚,这可是大腕啊,这都不认识,赶紧饿补一下再回来找小飞龙~~~~)
我说过TStrings类是TStringList类的父类,多态使用中,子类对象赋值给父类变量后,变量的使用范围(属性、方法)是要注意的,子类没有的属性或方法,变量是不能使用的,而需要类型转换TStringList(S2)之后才能调用。如下面的代码段
var S:TStrings; begin S := TStringList.Create;//TStringList实现了TStrings中的抽象方法。 S.Add('123456789ABC'); //所以这样调用Add方法,是正确的; //因为TStrings类中是有Add方法的抽象声明的; //它实际调用的是子类TStringList实现的Add。 S.Sort //而这样调用Sort排序方法就会出错; //因为TStrings类中没有Sort方法的声明; //而变量S被声明为TStrings类,所以他看不到子类中继承后新增加的方法和属性。 S.Free; end;
上面代码中TStringList类中有一个方法,叫做Sort(这是一个排序的方法),但是在TStrings类里面却没有,他是TStringList子类新增加的方法。那么好了,在上面的程序代码段中,如果这样调用代码S2.Sort,哈哈,马上你就会看到编译器报错,具体为什么,大家可以好好地想一想,或者参考李维大师的著作阅读相关章节。
var S1, S2: TStrings; S3: TStringList;begin S1 := TStrings.Create; //这样就不可以(因为TStrings是抽象类,不能直接创建对象) S3 := TStringList.Create; //这样是可以的 S2 := TStringList.Create; //这样也是可以的(多态的典型使用) S1.Add('123456789ABC'); //报错了,因为S1中Add是抽象方法,只有声明 S.Free;end;
我们再来看看上面代码中的S1变量,你可以声明TStrings的对象,但是,如果你像上面那样创建他,那么编译器编译的时候会发出警告信息,列出TStrings类中的抽象方法,提醒你,这是一个抽象类,你不应该直接创建他的对象,当然,如果你不怕死,非要编译运行程序的话,也没问题,编译器对警告信息一般是放过的,所以,你的程序(如上面所示)仍然可以运行!
但是,嘿嘿,看见了吗?我说但是了,如果你在后面的代码中使用了你所创建的TStrings对象的那些 add,delete等方法的话,那你就死定了,因为这些是抽象方法,是不能用的,是Abstract方法。
为什么第二段代码中的S.Add('123456789ABC')不会有问题,可以很好地执行;但是第三段代码中的S1.Add('123456789ABC')就会报错呢?,他们的S和S1变量不都是TStrings类型吗?
关于这个问题,本小飞龙已经点的很清楚了,这是面向对象程序设计语言中非常重要的一个环节“多态性”,如果读者对这个概念不清楚,那么很多东西都会稀里糊涂,会走很多弯路,所以,赶紧看看相关的资料。在这里我们就不说了,我只说一句:这非常重要!!!!
3、TMemo是我们常见的一个可视化VCL组件,通常用于显示多行的纯文本内容。
Delphi 5中其Items属性类型是TStrings(实际上是继承自TStrings的TMemoStrings),因此可以直接从TStrings兼容类型的变量导入数据。
Delphi 7中组件有变化,没有了Items属性,取而代之的是Lines属性,类型是TStrings。
4.TRichEdit是另一个我们常见的一个可视化VCL组件,通常用于显示格式化的文本内容。
Delphi 5中其Items属性类型也是TStrings(实际上是继承自TStrings的TRichEditStrings),因此可以直接从TStrings兼容类型的变量导入数据。
Delphi 7中组件有变化,没有了Items属性,取而代之的是Lines属性,类型是TStrings。
5、TStrings的派生类主要用于管理字符串集合和对象集合。例如Delphi5中TStringList在内部分别为字符串和对象各声明了一个数组来存储数据,而在Delphi7中TStringList在内部是以一个记录类型来实现,因此他们能同时保存字符串和对象(注意:一般我们用TStringList来处理数组列表,而用下一章将要讲到的TList类来处理对象列表;但事实上TStringList类也是可以处理对象的,关于这一点,只要读者仔细看看Delpgi7中的TStringList类VCL的源代码就明白了,注意源代码中私有变量是一个记录类型)。
6、一般我们直接使用TStringList类而不是TStrings类,因为TStrings类是一个抽象类,不能直接使用,所以下面我们列出TStringList类的方法,并重点讲解其作用
方法描述Add在末尾添加一个字符串 TStringList.Add('123456789ABC ')AddObject在末尾添加一个对象 TStringList.AddObject('btn', Button1);Insert在指定位置插入一个字符串 TStringList.Insert(0, '123456789ABC ')InsertObject在指定位置插入一个字符串,并给他分配一个相应的对象举例:将窗体中的所有组件的组件名称放入ListBox的Item属性中Item属性是一个TStrings类型
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
for I := 0 to Form1.ComponentCount-1 do
ListBox1.Items.InsertObject(0, Form1.Components[I].Name,Form1.Components[I] as TObject);
end;
TStringList.Find(const S: string; var Index: Integer): Boolean;IndexOf与Find不同,IndexOf用来查找某一字符串指定的位置
TStringList.IndexOf(const S: string): Integer;Sort排序,Sorted属性设置为False的时候,调用Sort排序;
Sorted属性
Sorted属性设置为False的时候,调用Sort排序;Sorted属性设置为True的时候,列表自动排序,这时,就不要使用Insert了,而应使用Add来添加,系统会自动排序的;CustomSort客户自定义排序,这个我们不作介绍,有兴趣看Delphi帮助CaseSensitive设定字符串比较、取位置时,大小写是否敏感,这个我们不作介绍,有兴趣看Delphi帮助Duplicates添加字符串的时候,是否允许重复字段Add,这个我们不作介绍,有兴趣看Delphi帮助
- delphi 容器类 2
- Delphi中的容器类
- Delphi中的容器类
- Delphi中的容器类
- Delphi中的容器类
- Delphi中的容器类
- Delphi中的容器类
- delphi 容器类
- delphi 容器类 3
- Delphi 中的容器类
- Delphi中的容器类
- delphi 容器类 3. TCollection
- Delphi中的容器类(二)
- DELPHI 容器
- Delphi中的容器类(转载)
- Delphi容器类之---TList、TObjectList、TComponentList、TClassList的使用
- Delphi容器类之---Tlist,TStringlist,THashedStringlist的效率比较
- Delphi容器类之---TOrderedList、TStack、TQueue、TObjectStack、TObjectQueue
- Android传感器概述(六)
- 连连看主程序
- 大端小端(Big- Endian和Little-Endian)
- 中缀表达式转换成后缀表达式/计算后缀表达式
- Cocos2d-x纹理优化的一些方案
- delphi 容器类 2
- samba的配置文件, 共享opt和home目录
- kmp 练习下
- 打印前N个素数
- gcc 编译选项
- aba 回文练习 -- 参考罗大神的
- k_over 重叠字符串
- m_sort 归并排序(迭代)
- insert /*+append*/ into (直接插入)logging失效