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的泛型,很是普遍。
简单的泛型类应用:(转).net
unit Unit1;指针
interfacecode
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;orm
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;blog
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)