文档章节

Delphi 2010 中的泛型

vga
 vga
发布于 2016/08/09 08:45
字数 1230
阅读 23
收藏 0
点赞 0
评论 0

Delphi 2010 中的泛型 日期:2010年5月31日 作者: 人气:10504 查看:[大字体 中字体 小字体] 2010已发布很长时间了,口碑还不错,准备用它开发下一项目,但对泛型等新东西的认识还不够,就搜了一下,发现下面这篇文章,还不错,大家一起补补课吧!

C++中的模板、C#等语言中泛型技术,给许多操作不同类型数据的软件人员提供了一个很好的方法。其类型的“可变”性,让许多用过的软件人员所心喜。但是在Delphi 2009以前的版本中,是从来没有的。让许多不会用Delphi中TList的人员,大大的抱怨。如果用好Delphi中TList,其可用性,我个人认为,比其它语言中的泛型好用很多(当然对指针的应用和内存的分配、释放不了解的人除外)。

  自从Delphi 2009的发布,给许多喜欢用泛型技术的软件人员,提供了方便。由于Delphi 2009不太稳定,也没有过多的去用其泛型技术。Delphi 2010发布以来,出现许多“Delphi 2010初体验,是时候抛弃Delphi 7了”的话语的满天飞,让我想一看其究竟。

 闲话少说,Delphi 2010的泛型单元Generics.Defaults、Generics.Collections;重点还是Generics.Collections单元,其中有TArray泛型类、TList<T>(列表的泛型)、TQueue<T>(队列的泛型)、TStack<T> (栈的泛型)、TDictionary<TKey,TValue> (Hash Table哈希表的泛型)及其上述泛型所对应的TObject的泛型,非常广泛。

简单的泛型类应用:(转)


unit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type TForm1 = class(TForm) Memo1: TMemo; Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); end;

var Form1: TForm1;

implementation

{$R *.dfm}

uses Generics.Collections; {Delphi 泛型容器单元}

var Dictionary: TDictionary<Cardinal,string>; {定义一个泛型 TDictionary 类, 指定有 Cardinal、string 构成}

{建立} procedure TForm1.FormCreate(Sender: TObject); begin Dictionary := TDictionary<Cardinal,string>.Create;

Memo1.Clear; Button1.Caption := Button1.Caption + ' 添加'; Button2.Caption := Button2.Caption + ' 删除'; Button3.Caption := Button3.Caption + ' 尝试取值'; Button4.Caption := Button4.Caption + ' 清空';

Edit1.Clear; Edit2.Clear; Edit1.NumbersOnly := True; end;

{释放} procedure TForm1.FormDestroy(Sender: TObject); begin Dictionary.Free; end;

{添加} procedure TForm1.Button1Click(Sender: TObject); var key: Cardinal; value: string; str: string; k,v: Boolean; begin key := StrToIntDef(Edit1.Text, 0); value := Edit2.Text; if value = '' then value := 'Null';

k := Dictionary.ContainsKey(key); {Key 是否存在} v := Dictionary.ContainsValue(value); {Value 是否存在}

if not k then begin Dictionary.Add(key, value); Memo1.Lines.Add(Format('%d=%s', [key, value])); {同步显示} end;

if k and not v then begin str := Format('key 已存在: %d=%s; 是否修改其值?', [key, Dictionary[key]]); if MessageBox(0, PChar(str), '提示', MB_OKCANCEL or MB_ICONQUESTION) = mrOk then begin //Dictionary[key] := value; {Dictionary[key] = Dictionary.Item[key]} Dictionary.AddOrSetValue(key, value); {也可使用上一句} Memo1.Lines.Values[IntToStr(key)] := value; {同步显示} end; end;

if k and v then begin str := Format('%d=%s 已存在, 不能重复添加', [key, value]); MessageBox(0, PChar(str), '错误', MB_OK + MB_ICONHAND); end;

Text := IntToStr(Dictionary.Count); end;

{删除: Remove} procedure TForm1.Button2Click(Sender: TObject); var key: Integer; i: Integer; begin key := StrToIntDef(Edit1.Text, 0);

if not Dictionary.ContainsKey(key) then begin ShowMessageFmt('key: %d 不存在', [key]); Exit; end;

Dictionary.Remove(key); Text := IntToStr(Dictionary.Count);

{同步显示} i := Memo1.Lines.IndexOfName(IntToStr(key)); if i > -1 then Memo1.Lines.Delete(i); end;

{尝试取值: TryGetValue} procedure TForm1.Button3Click(Sender: TObject); var key: Integer; value: string; begin key := StrToIntDef(Edit1.Text, 0); if Dictionary.TryGetValue(key, value) then ShowMessageFmt('key: %d 已存在, 其值是: %s', [key, value]) else ShowMessageFmt('key: %d 不存在', [key]) end;

{清空: Clear} procedure TForm1.Button4Click(Sender: TObject); begin Dictionary.Clear; Text := IntToStr(Dictionary.Count); Memo1.Clear; {同步显示} end;

end.


自定义泛型应用:(转)


unit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); end;

var Form1: TForm1;

implementation

{$R *.dfm}

type TArr<T> = array[0..9] of T; {定义一个泛型数组} {虽然大家习惯用 T 来泛指其他类型, 但使用其他合法的标识符也是可以的}

{用作 Integer} procedure TForm1.Button1Click(Sender: TObject); var Arr: TArr<Integer>; i: Integer; begin for i := Low(Arr) to High(Arr) do Arr[i] := i * i;

Memo1.Clear; for i := Low(Arr) to High(Arr) do Memo1.Lines.Add(Format('Arr[%d] = %d', [i, Arr[i]])); end;

{用作 string} procedure TForm1.Button2Click(Sender: TObject); var Arr: TArr<string>; i: Integer; begin for i := Low(Arr) to High(Arr) do Arr[i] := StringOfChar(Char(i+97), 3);

Memo1.Clear; for i := Low(Arr) to High(Arr) do Memo1.Lines.Add(Format('Arr[%d] = %s', [i, Arr[i]])); end;

{用作 Single} procedure TForm1.Button3Click(Sender: TObject); var Arr: TArr<Single>; i: Integer; begin for i := Low(Arr) to High(Arr) do Arr[i] := 100 / (i+1);

Memo1.Clear; for i := Low(Arr) to High(Arr) do Memo1.Lines.Add(Format('Arr[%d] = %f', [i, Arr[i]])); end;

{用作记录 TPoint} procedure TForm1.Button4Click(Sender: TObject); var Arr: TArr<TPoint>; i: Integer; begin for i := Low(Arr) to High(Arr) do Arr[i] := Point(i, i*2);

Memo1.Clear; for i := Low(Arr) to High(Arr) do Memo1.Lines.Add(Format('Arr[%d] = (%d,%d)', [i, Arr[i].X, Arr[i].Y])); end;

{用作类 TButton} procedure TForm1.Button5Click(Sender: TObject); var Arr: TArr<TButton>; i: Integer; begin for i := Low(Arr) to High(Arr) do begin Arr[i] := TButton.Create(Self); Arr[i].Name := Concat('Btn', IntToStr(i+1)); end;

Memo1.Clear; for i := Low(Arr) to High(Arr) do Memo1.Lines.Add(Format('Arr[%d] is %s', [i, Arr[i].Name])); end;

end.

(出处:http://blog.csdn.net/zyj520401/archive/2009/12/12/4994383.aspx)

本文转载自:http://www.delphifans.com/infoview/Article_6494.html

共有 人打赏支持
vga

vga

粉丝 19
博文 335
码字总数 23381
作品 0
佳木斯
Delphi 发展历史

自然人的软件著作权,保护期为自然人终生及其died后50年;软件是合作开发的,截止于最后died的自然人died后第50年的12月31日。法人或者其他组织的软件著作权,保护期为软件首次发表之后50年,...

vga ⋅ 2014/05/13 ⋅ 2

Visual Studio2010新特性--C++王者归来(3)-泛型编程-转移构造函数

泛型编程(generic programming)关注于产生通用的软件组件,让这些组件在不同的应用场合都能很容易地重用。在c++中,类模板和函数模板是进行泛型编程极为有效的机制。 什么是临时对象?定义...

junwong ⋅ 2012/03/09 ⋅ 0

PostgreSQL的Delphi组件--PostgreDAC

PostgreDAC 是适合 Delphi/C++ Builder 操作 PostgreSQL 数据库的功能非常强大的组件包,允许你创建直连 PostgreSQL 数据库的 Delphi/C++ Builder 应用,无需 BDE 和 ODBC 支持。 使用 Post...

匿名 ⋅ 2012/03/20 ⋅ 0

delphi各个版本编译开关值

delphi各个版本编译开关值 {$IFDEF VER80} - Delphi 1 {$IFDEF VER90} - Delphi 2 {$IFDEF VER100} - Delphi 3 {$IFDEF VER120} - Delphi 4 {$IFDEF VER130} - Delphi 5 {$IFDEF VER140} - D......

伽罗kapple ⋅ 2016/03/01 ⋅ 0

F#简明教程二:F#类型系统和类型推断机制

在上一篇教程《F#与函数式编程概述》中 我们了解到F#和函数式编程的一些特点,更多关于F#语言和函数式编程的介绍可以参考51CTO之前对微软MVP赵颉老师的专访《TechED 09视频专访:F#与函数式编...

红薯 ⋅ 2010/04/20 ⋅ 1

FastReport产品介绍及免费下载地址

公司地址: 俄罗斯 公司网址: http://www.fast-report.com 详细信息: 由技术总监Alexander Tzyganenko创建于1998年,Fast Reports, Inc.开发了快速报表软件:应用程序、库和插件。 FastRe...

yidongkaifa ⋅ 2014/10/13 ⋅ 0

Delphi中使用汇编(关于POS函数的问题)

在delphi中使用汇编异常的简单,只用使用关键字asm ....end来引导就行了。 得到一个字符在字符串中的位置有很多方法,最简单的就是使用delphi自己的Pos函数 另外一个方法就是使用 循环查找字...

技术小美 ⋅ 2017/11/06 ⋅ 0

Runtime error 216 at xxx 故障解决一例

故障现象:部分Delphi项目在win7开发机上不能运行了,提示Runtime error 216 at xxx错误信息,但是将出错的EXE文件复制到别的win7和xp下,均运行正常。 解决办法:之前安装某软件时,将DEP对...

任远 ⋅ 2012/03/03 ⋅ 0

Delphi开发能力自我评测

Delphi开发能力自我评测日期:2008年11月23日 作者: 人气:3159 查看:[大字体 中字体 小字体](注:以下内容都是作者个人的学习经验和体会,仅代表个人观点。针对Win32下的Delphi程序开发而...

vga ⋅ 2016/08/09 ⋅ 0

C++新标准——C++1x

本文转自:http://liuyue.asia/2010/03/18/cpp0x-has-become-cpp1x/ 一个热爱 C++ 的程序员应该知道 C++0x 为何物吧。C++ 标准制定委员会曾在 1998 年和 2003 年制定和更新了 C++ 的标准,使...

张明 ⋅ 2010/03/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部