`
qzriso
  • 浏览: 242517 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

Delphi 2010 中的泛型

阅读更多

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://www.samool.com/archives/41142/

分享到:
评论

相关推荐

    Delphi中的泛型基础及简单应用

    Delphi中的泛型基础及简单应用

    Delphi_2009_2010_XE_泛型使用全集(队_栈_字典_列表_对象列表)

    在 Delphi 中,泛型编程允许开发人员编写灵活且可重用的代码,该代码可以操作不同类型的值。通过使用泛型,我们可以创建能够处理各种数据类型的类或函数,这不仅提高了代码的灵活性,还增强了其复用性。 #### 二、...

    Delphi 泛型 接口约束的实例

    在 Delphi 编程语言中,泛型是一种强大的工具,它允许我们编写可重用的代码,这些代码可以在多种不同的数据类型上工作。泛型接口约束是泛型类或方法中一个重要的特性,它限制了可以传递给泛型类型的参数必须实现特定...

    delphi 泛型学习实录

    泛型是Delphi语言中的一个重要特性,它允许开发者编写能够处理多种数据类型的通用代码。这篇“Delphi 泛型学习实录”将深入探讨这一主题。 首先,我们要理解什么是泛型。泛型是一种模板或类蓝图,它在编译时并不...

    Delphi泛型编程:类型安全的代码复用艺术

    #### 二、泛型编程在 Delphi 中的重要性 泛型编程是一种编程技术,允许开发者编写出类型安全且高度可重用的代码。这种编程方法允许代码独立于具体的类型,从而能在多种类型之间共享。在 Delphi 中,泛型编程特别有...

    Delphi泛型库--DGL

    **Delphi泛型库——DGL详解** 在Delphi编程环境中,DGL(The Delphi Generic Library)是一个非常重要的工具,它为开发者提供了类型安全、高效且易用的泛型容器和算法。这个库的设计灵感来源于C++的STL(Standard ...

    Delphi泛型动态数组的扩展.3.rar

    本文将深入探讨"Delphi泛型动态数组的扩展"这一主题,结合压缩包中的文件,我们将讨论如何利用泛型来增强动态数组的功能。 首先,让我们了解泛型。泛型是Delphi(以及许多其他面向对象语言)中的一种特性,它允许...

    Delphi 泛型的使用案例

    Delphi 泛型的使用案例 解决问题:如有一组数字,55 68 79 120 130 180 先进行最大两个数的比对,譬如 130 180 比对,取小值,得到130,大的180-130=50, 然后在将50放入剩余的55 68 79 120比对,重复上面的比对要求...

    xe7结构体泛型

    在本文中,我们将深入探讨"xe7结构体泛型"这一主题,这是一种特定于某个编程环境(可能是C#或Java等语言)的概念,用于提升代码的灵活性和类型安全性。 泛型主要在类、接口和方法中使用,它通过参数化类型来实现。...

    USB键盘鼠标控制器V3.1演示程序(Delphi7源代码)

    在Delphi中,异常处理(try...except...finally)是常用的方式。此外,源代码中可能还包括调试信息,帮助开发者定位和修复问题。 "通讯组件"可能包含了实现USB通信的关键代码或者第三方库,而"test"可能是测试用例...

    Delphi2010语法手册.pdf

    在Delphi 2010入门章节中,会介绍工程文件结构与语法,单元文件结构以及单元语法与uses从句。工程文件结构是指一个Delphi项目中的文件组成和布局,通常包括主程序文件(.dpr)、单元文件(.pas)等。uses从句是用于...

    Delphi2010开发基础指南

    在Delphi 2010开发中,首先需要了解的是其基本的语法结构,这包括了标识符的使用、数据类型、常量与变量的声明、程序流程控制等。标识符用于给程序元素命名,有标准标识符和自定义标识符之分,它们在不同的作用域中...

    Delphi泛型动态数组的扩展.1.mht

    Delphi泛型动态数组的扩展.1.mht

    Delphi泛型动态数组的扩展.2.mht

    Delphi泛型动态数组的扩展.2.mht

    Delphi 的数据结构泛型类库 - DeCAL (含源码)

    Decal 的全称是 Delphi Container and Algorithm Library,也就是 Delphi 数据容器和算法类库。 我个人认为是目前我所发现的类结构建模建得很好的一个数据结构类库,性能也是相当突出。他的思想是来自Stepanov 和 ...

    使用新的Delphi编码样式和结构-Delphi 2009语言功能详述

    Delphi 2009中的泛型遵循一套特定的规则,这些规则确保泛型类型的正确性和类型安全性。例如,类型参数的使用范围、类型参数的约束等。 **Delphi中的泛型** 在Delphi 2009中,泛型可以通过在类或函数定义中使用尖...

    Delphi2010语法手册

    Visual Component Library (VCL)在Delphi 2010中得到了升级,以适应Unicode和新的Windows API。许多控件和组件被修改以支持Unicode字符串,同时增加了新的控件,如TTaskDialog,用于展示现代Windows任务对话框。 3...

    delphi2010 教程及语法手册

    在Delphi 2010的教程及语法手册中,涵盖了从基础语法、数据类型、程序流程控制,到面向对象编程、异常处理以及泛型等高级特性。以下内容将对Delphi 2010的入门知识、基础语法、数据类型及运算符、程序流程控制、函数...

    Delphi使用CreateAnonymousThreadX传递参数的匿名线程

    在Delphi编程环境中,线程是并发执行的基本单元,它允许程序在后台执行任务而不阻塞主线程。在某些情况下,我们可能需要创建一个能够独立运行的匿名线程,并且在线程函数中传递参数。`CreateAnonymousThreadX`是...

    delphi枚举字符串转换

    在Delphi编程中,枚举(Enumeration)是一种强大的工具,用于定义一组相关的命名常量。枚举类型在处理固定集合的值时非常有用,而字符串转换则是编程中常见的操作,特别是在处理用户输入或数据交互时。当我们需要将...

Global site tag (gtag.js) - Google Analytics