Delphi 2010 中的泛型

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)

相關文章
相關標籤/搜索