这里的新语法一般指Delphi7不支持的语法,高版本中会经常遇到,所以花一点时间学会使用它。泛型是一种特殊的类型。你不用一开始就指明参数的具体类型,而是先定义一个类型变量,在使用的时候再确定参数的具体类型。准备从万一博客中学习,节约翻找资料的时间。

最简单的泛型

一开始我们看下Tbyte类型的定义

继续看一下类型TBytes是如何定义出来的.

首先:

type TArray<T> = array of T;

然后:

type TBytes = TArray<Byte>;

TBytes为标准的字节泛型,深一步也就是字节数组.

其实就相当于TBytes = array of Byte;Delphi7没有泛型概念,可以这么定义.

  首先定义一个泛型数组TArr<T> = array[0..9] of T,后面声明变量的时候可以吧TArr<T>尖括号中的T换成想要的类型,可以是整形、字符串、浮点、数据结构、类等等。

implementation

{$R *.dfm}
type
TArr<T> = array[0..9] of T; {定义一个泛型数组}
{虽然大家习惯用 T 来泛指其他类型, 但使用其他合法的标识符也是可以的。
简单来说就是粗范围的定义一个T,后面声明变量的时候可以自己修改变量类型。} 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; procedure TForm1.Button2Click(Sender: TObject);
var
Arr: TArr<string>;
i: Integer;
begin
for i := Low(Arr) to High(Arr) do
//重复某个字符3次
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; 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; 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; 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])); for i := Low(Arr) to High(Arr) do
Arr[i].Free;
end;

泛型类TList

想要使用TList<T>必须先引用泛型容器单元Generics.Collections

//引用新增的泛型容器单元
uses
Generics.Collections; //定义一个泛型 TList 类, 这指定了要用于 string}
var
List: TList<string>;
str: string = 'Test'; //建立
procedure TForm1.FormCreate(Sender: TObject);
begin
List := TList<string>.Create; Memo1.Clear;
Edit1.Text := str;
Button1.Caption := Button1.Caption + ' 显示';
Button2.Caption := Button2.Caption + ' 添加';
Button3.Caption := Button3.Caption + ' 插入';
Button4.Caption := Button4.Caption + ' 删除1';
Button5.Caption := Button5.Caption + ' 删除2';
Button6.Caption := Button6.Caption + ' 查找';
Button7.Caption := Button7.Caption + ' 排序';
Button8.Caption := Button8.Caption + ' 翻转';
Button9.Caption := Button9.Caption + ' 清空';
Button10.Caption := Button10.Caption + ' 添加数组';
end; //释放
procedure TForm1.FormDestroy(Sender: TObject);
begin
List.Free;
end; procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text <> '' then str := Edit1.Text;
end; //显示
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
for i := 0 to List.Count - 1 do
Memo1.Lines.Add(List[i]); {List[i] = List.Item[i]}
Text := Format('当前总数: %d', [List.Count]);
end; //添加
procedure TForm1.Button2Click(Sender: TObject);
begin
List.Add(str);
Button1.Click; {刷新显示}
end; //插入, 譬如插入在最前面
procedure TForm1.Button3Click(Sender: TObject);
begin
List.Insert(0, str);
Button1.Click;
end; //根据序号删除, 譬如删除第一个数据
procedure TForm1.Button4Click(Sender: TObject);
begin
List.Delete(0);
Button1.Click;
end; //根据内容删除, 譬如删除第一个数据
procedure TForm1.Button5Click(Sender: TObject);
var
s: string;
begin
s := List[0];
List.Remove(s);
Button1.Click;
end; //查找
procedure TForm1.Button6Click(Sender: TObject);
var
n: Integer;
begin
n := List.IndexOf(str); {LastIndexOf 是从后面找; 也可用 List.Contains(str) 判断是否包含 str}
if n = -1 then
ShowMessage('没找到')
else
ShowMessageFmt('%s 是第 %d 个', [str, n+1]);
end; //排序
procedure TForm1.Button7Click(Sender: TObject);
begin
List.Sort;
Button1.Click;
end; //翻转
procedure TForm1.Button8Click(Sender: TObject);
begin
List.Reverse;
Button1.Click;
end; //清空
procedure TForm1.Button9Click(Sender: TObject);
begin
List.Clear;
Button1.Click;
end; //添加数组
procedure TForm1.Button10Click(Sender: TObject);
const
arr: array[0..2] of string = ('CodeGear', 'Delphi', '2009');
begin
List.Add('Embarcadero');
List.AddRange(arr);
Button1.Click;
end;

泛型类TQueue

TQueue 队列类主要有三个方法、一个属性:

Enqueue(入列)、Dequeue(出列)、Peek(查看下一个要出列的元素);

Count(元素总数). 队列类是采用先进先出原则。

implementation

{$R *.dfm}

uses
System.Generics.Collections; type
TRec = record
Name: string;
Age: Word;
end; var
Queue: Tqueue<TRec>; procedure TForm1.Button1Click(Sender: TObject);
var
rec: TRec;
begin
rec.Name := StringOfChar(Char(65 + Random(26)), 3);
rec.Age := Random(150);
Queue.Enqueue(rec);
Text := Format('当前队列成员总数: %d', [Queue.Count]); {让 Memo1 配合显示}
Memo1.Lines.Add(Format('%s, %d', [rec.Name, rec.Age]));
end; procedure TForm1.Button2Click(Sender: TObject);
var
rec: TRec;
begin
if Queue.Count = 0 then Exit;
rec := Queue.Dequeue;
ShowMessage(Format('%s, %d', [rec.Name, rec.Age]));
Text := Format('当前队列成员总数: %d', [Queue.Count]); {让 Memo1 配合显示}
Memo1.Lines.Delete(0);
end; procedure TForm1.Button3Click(Sender: TObject);
var
rec: TRec;
begin
if Queue.Count = 0 then Exit;
rec := Queue.Peek;
ShowMessage(Format('%s, %d', [rec.Name, rec.Age]));
end; procedure TForm1.FormCreate(Sender: TObject);
begin
Queue:= Tqueue<TRec>.Create(); Memo1.Clear;
Button1.Caption := Button1.Caption + ' 入列';
Button2.Caption := Button2.Caption + ' 出列';
Button3.Caption := Button3.Caption + ' 下一个出列的...';
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
Queue.Free;
end;

泛型类TStack

堆栈类与队列类相似,堆栈的出列采用的是先进后出的方式

压栈采用Stack.Push(rec); 出栈采用Stack.Pop;下一个出列的依然是用Stack.Peek;

泛型类TDictionary<cardinal, string>;

类似字典,一个值对应着一个值,可以是数字与字符串,也可以是字符串与字符串.

在字典场景下使用该泛型极为方便.

uses
System.Generics.Collections; var
Dictionary: TDictionary<cardinal, string>;
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; 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; 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; procedure TForm1.Button4Click(Sender: TObject);
begin
Dictionary.Clear;
Text := IntToStr(Dictionary.Count);
Memo1.Clear; {同步显示}
end; 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;

Delphi 新语法:泛型的更多相关文章

  1. delphi新语法之泛型实现的对象池模板

    现在的DELPHI因为支持泛型的语法,所以也能支持模板编程了.   // 标准模板 unit UntPools;   interface   uses   Classes, SysUtils, Unt ...

  2. Delphi新语法 For ..In

    首先我们要知道哪些类型可以用For In吧,下面就是: for Element in ArrayExpr do Stmt;      数组 for Element in StringExpr do S ...

  3. Delphi新语法

    http://www.cnblogs.com/hnxxcxg/category/456344.html

  4. Delphi 7以来的Delphi 2009测试版新语法特性

    我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...

  5. class helper 可能是从 Delphi 2007 增加的新语法

    class helper 可能是从 Delphi 2007 增加的新语法, 因为感觉不太实用, 直到今天才测试了一下. 试过之后才知道: 挺有意思的! 基本功能就是修改已存在的类. Txxx = cl ...

  6. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

  7. .NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

    开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,. ...

  8. .NET中那些所谓的新语法之四:标准查询运算符与LINQ

    开篇:在上一篇中,我们了解了预定义委托与Lambda表达式等所谓的新语法,这一篇我们继续征程,看看标准查询运算符和LINQ.标准查询运算符是定义在System.Linq.Enumerable类中的50 ...

  9. 1、ASP.NET MVC入门到精通——新语法

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特 ...

  10. Java之JDK7的新语法探索

    Java之JDK7的新语法探索 前言 感谢! 承蒙关照~ 字面量: 各种精致的表达方式: 八进制以0开头,十六进制0X开头,二进制以0B开头. 二进制运算时,应该写成这样才直观: &15 -& ...

随机推荐

  1. SQL性能优化的47个小技巧,你了解多少?

    大家好,我是哪吒. 1.先了解MySQL的执行过程 了解了MySQL的执行过程,我们才知道如何进行sql优化. 客户端发送一条查询语句到服务器: 服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中 ...

  2. Spring Boot自动配置原理懂后轻松写一个自己的starter

    目前很多Spring项目的开发都会直接用到Spring Boot.因为Spring原生开发需要加太多的配置,而使用Spring Boot开发很容易上手,只需遵循Spring Boot开发的约定就行了, ...

  3. MFC中的RTTI(Runtime Type Identification, 运行时类型识别)详解(参考《深入浅出MFC》)

    在MFC中的RTTI的实现,主要是利用一个名为CRuntimeClass的结构来链接各个"有关系的类"的信息来实现的.简单来说,就是在需要用到RTTI技术的类内建立CRuntime ...

  4. HDMI转USB视频采集卡(ACASIS 1080P高清视频采集卡)--九五小庞

    ACASIS阿卡西斯是深圳市菲德越科技有限公司旗下数码科技品牌.菲德越是2008年成立的一家专注于采集卡.硬盘盒.集线器等专业3C配件产品,集研发.设计.生产.销售于一体的高新科技公司,我们公司以向客 ...

  5. DomDom

    DomDom 目录 DomDom 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.2.1 目录分析 2 GetShell 2.1 尝试命令执行 2.2 nc反弹shell失败 2.3 PHP ...

  6. 一步步入门Jenkins+Net Core3.1+Gitlab,实现 CICD

    架构说明: 由浅入深,我们暂时不考虑分布式,安装Jenkins到用户服务器进行CICD 需要两台服务器 Gitlab:192.168.232.128:12080 源代码仓库,可以参考<安装git ...

  7. Python ( 高级 第一部)

    目录 time 时间模块 Python的内置方法 数字模块 随机模块 序列化模块 pickle 序列化模块 json os 系统模块 os  shutil 模块 os,path 模块 文件压缩模块 z ...

  8. WPF 打印界面控件内容

    public class PrintDialogHelper { private const string PrintServerName = "DESKTOP-49LV5U6"; ...

  9. 10base-t的数据发送

    功能 数据流(NIC) pin码 发送信号 发送回路 1 2 接收信号 接收回路 3 不使用   4 不使用   5 接收信号 接收回路 6 不使用   7 不使用   8 上图是基于10BASE-T ...

  10. centos7端口转发工具rinetd

    1.下载软件 wget http://li.nux.ro/download/nux/misc/el7/x86_64/rinetd-0.62-9.el7.nux.x86_64.rpm 2.安装软件 yu ...