Loading... <p>2010已发布很长时间了,口碑还不错,准备用它开发下一项目,但对泛型等新东西的认识还不够,就搜了一下,发现下面这篇文章,还不错,大家一起补补课吧!</p> <p>C++中的模板、C#等语言中泛型技术,给许多操作不同类型数据的软件人员提供了一个很好的方法。其类型的“可变”性,让许多用过的软件人员所心喜。但是在Delphi 2009以前的版本中,是从来没有的。让许多不会用Delphi中TList的人员,大大的抱怨。如果用好Delphi中TList,其可用性,我个人认为,比其它语言中的泛型好用很多(当然对指针的应用和内存的分配、释放不了解的人除外)。</p> <p> 自从Delphi 2009的发布,给许多喜欢用泛型技术的软件人员,提供了方便。由于Delphi 2009不太稳定,也没有过多的去用其泛型技术。Delphi 2010发布以来,出现许多“Delphi 2010初体验,是时候抛弃Delphi 7了”的话语的满天飞,让我想一看其究竟。</p> <p><!--more--></p> <p> 闲话少说,Delphi 2010的泛型单元Generics.Defaults、Generics.Collections;重点还是Generics.Collections单元,其中有TArray泛型类、TList<T>(列表的泛型)、TQueue<T>(队列的泛型)、TStack<T> (栈的泛型)、TDictionary<TKey,TValue> (Hash Table哈希表的泛型)及其上述泛型所对应的TObject的泛型,非常广泛。</p> <p>简单的泛型类应用:(转)</p> <p>-----------------------------------------------------------------------------------------------</p> <p>unit Unit1;</p> <p>interface</p> <p>uses<br />Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br />Dialogs, StdCtrls;</p> <p>type<br />TForm1 = class(TForm)<br /> Memo1: TMemo;<br /> Edit1: TEdit;<br /> Edit2: TEdit;<br /> Button1: TButton;<br /> Button2: TButton;<br /> Button3: TButton;<br /> Button4: TButton;<br /> procedure FormCreate(Sender: TObject);<br /> procedure FormDestroy(Sender: TObject);<br /> procedure Button1Click(Sender: TObject);<br /> procedure Button2Click(Sender: TObject);<br /> procedure Button3Click(Sender: TObject);<br /> procedure Button4Click(Sender: TObject);<br />end;</p> <p>var<br />Form1: TForm1;</p> <p>implementation</p> <p>{$R *.dfm}</p> <p>uses Generics.Collections; {Delphi 泛型容器单元}</p> <p>var<br />Dictionary: TDictionary<Cardinal,string>; <br />{定义一个泛型 TDictionary 类, 指定有 Cardinal、string 构成}</p> <p>{建立}<br />procedure TForm1.FormCreate(Sender: TObject);<br />begin<br />Dictionary := TDictionary<Cardinal,string>.Create;</p> <p>Memo1.Clear;<br />Button1.Caption := Button1.Caption + ' 添加';<br />Button2.Caption := Button2.Caption + ' 删除';<br />Button3.Caption := Button3.Caption + ' 尝试取值';<br />Button4.Caption := Button4.Caption + ' 清空';</p> <p>Edit1.Clear;<br />Edit2.Clear;<br />Edit1.NumbersOnly := True;<br />end;</p> <p>{释放}<br />procedure TForm1.FormDestroy(Sender: TObject);<br />begin<br />Dictionary.Free;<br />end;</p> <p>{添加}<br />procedure TForm1.Button1Click(Sender: TObject);<br />var<br />key: Cardinal;<br />value: string;<br />str: string;<br />k,v: Boolean;<br />begin<br />key := StrToIntDef(Edit1.Text, 0);<br />value := Edit2.Text;<br />if value = '' then value := 'Null';</p> <p>k := Dictionary.ContainsKey(key); {Key 是否存在}<br />v := Dictionary.ContainsValue(value); {Value 是否存在}</p> <p>if not k then<br />begin<br /> Dictionary.Add(key, value);<br /> Memo1.Lines.Add(Format('%d=%s', [key, value])); {同步显示}<br />end;</p> <p>if k and not v then<br />begin<br /> str := Format('key 已存在: %d=%s; 是否修改其值?', [key, Dictionary[key]]);<br /> if MessageBox(0, PChar(str), '提示', MB_OKCANCEL or MB_ICONQUESTION) = mrOk then<br /> begin<br /> //Dictionary[key] := value; {Dictionary[key] = Dictionary.Item[key]}<br /> Dictionary.AddOrSetValue(key, value); {也可使用上一句}<br /> Memo1.Lines.Values[IntToStr(key)] := value; {同步显示}<br /> end;<br />end;</p> <p>if k and v then<br />begin<br /> str := Format('%d=%s 已存在, 不能重复添加', [key, value]);<br /> MessageBox(0, PChar(str), '错误', MB_OK + MB_ICONHAND);<br />end;</p> <p>Text := IntToStr(Dictionary.Count);<br />end;</p> <p>{删除: Remove}<br />procedure TForm1.Button2Click(Sender: TObject);<br />var<br />key: Integer;<br />i: Integer;<br />begin<br />key := StrToIntDef(Edit1.Text, 0);</p> <p>if not Dictionary.ContainsKey(key) then <br />begin<br /> ShowMessageFmt('key: %d 不存在', [key]);<br /> Exit;<br />end;<br /> <br />Dictionary.Remove(key);<br />Text := IntToStr(Dictionary.Count);</p> <p>{同步显示}<br />i := Memo1.Lines.IndexOfName(IntToStr(key));<br />if i > -1 then Memo1.Lines.Delete(i);<br />end;</p> <p>{尝试取值: TryGetValue}<br />procedure TForm1.Button3Click(Sender: TObject);<br />var<br />key: Integer;<br />value: string;<br />begin<br />key := StrToIntDef(Edit1.Text, 0);<br />if Dictionary.TryGetValue(key, value) then<br /> ShowMessageFmt('key: %d 已存在, 其值是: %s', [key, value])<br />else<br /> ShowMessageFmt('key: %d 不存在', [key])<br />end;</p> <p>{清空: Clear}<br />procedure TForm1.Button4Click(Sender: TObject);<br />begin<br />Dictionary.Clear;<br />Text := IntToStr(Dictionary.Count);<br />Memo1.Clear; {同步显示}<br />end;</p> <p>end.</p> <p>--------------------------------------------------------------------------------</p> <p>自定义泛型应用:(转)</p> <p>--------------------------------------------------------------------------------</p> <p>unit Unit1;</p> <p>interface</p> <p>uses<br />Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br />Dialogs, StdCtrls;</p> <p>type<br />TForm1 = class(TForm)<br /> Memo1: TMemo;<br /> Button1: TButton;<br /> Button2: TButton;<br /> Button3: TButton;<br /> Button4: TButton;<br /> Button5: TButton;<br /> procedure Button1Click(Sender: TObject);<br /> procedure Button2Click(Sender: TObject);<br /> procedure Button3Click(Sender: TObject);<br /> procedure Button4Click(Sender: TObject);<br /> procedure Button5Click(Sender: TObject);<br />end;</p> <p>var<br />Form1: TForm1;</p> <p>implementation</p> <p>{$R *.dfm}</p> <p>type<br />TArr<T> = array[0..9] of T; {定义一个泛型数组}<br />{虽然大家习惯用 T 来泛指其他类型, 但使用其他合法的标识符也是可以的}</p> <p>{用作 Integer}<br />procedure TForm1.Button1Click(Sender: TObject);<br />var<br />Arr: TArr<Integer>;<br />i: Integer;<br />begin<br />for i := Low(Arr) to High(Arr) do<br /> Arr[i] := i * i;</p> <p>Memo1.Clear;<br />for i := Low(Arr) to High(Arr) do<br /> Memo1.Lines.Add(Format('Arr[%d] = %d', [i, Arr[i]]));<br />end;</p> <p>{用作 string}<br />procedure TForm1.Button2Click(Sender: TObject);<br />var<br />Arr: TArr<string>;<br />i: Integer;<br />begin<br />for i := Low(Arr) to High(Arr) do<br /> Arr[i] := StringOfChar(Char(i+97), 3);</p> <p>Memo1.Clear;<br />for i := Low(Arr) to High(Arr) do<br /> Memo1.Lines.Add(Format('Arr[%d] = %s', [i, Arr[i]]));<br />end;</p> <p>{用作 Single}<br />procedure TForm1.Button3Click(Sender: TObject);<br />var<br />Arr: TArr<Single>;<br />i: Integer;<br />begin<br />for i := Low(Arr) to High(Arr) do<br /> Arr[i] := 100 / (i+1);</p> <p>Memo1.Clear;<br />for i := Low(Arr) to High(Arr) do<br /> Memo1.Lines.Add(Format('Arr[%d] = %f', [i, Arr[i]]));<br />end;</p> <p>{用作记录 TPoint}<br />procedure TForm1.Button4Click(Sender: TObject);<br />var<br />Arr: TArr<TPoint>;<br />i: Integer;<br />begin<br />for i := Low(Arr) to High(Arr) do<br /> Arr[i] := Point(i, i*2);</p> <p>Memo1.Clear;<br />for i := Low(Arr) to High(Arr) do<br /> Memo1.Lines.Add(Format('Arr[%d] = (%d,%d)', [i, Arr[i].X, Arr[i].Y]));<br />end;</p> <p>{用作类 TButton}<br />procedure TForm1.Button5Click(Sender: TObject);<br />var<br />Arr: TArr<TButton>;<br />i: Integer;<br />begin<br />for i := Low(Arr) to High(Arr) do<br />begin<br /> Arr[i] := TButton.Create(Self);<br /> Arr[i].Name := Concat('Btn', IntToStr(i+1));<br />end;</p> <p>Memo1.Clear;<br />for i := Low(Arr) to High(Arr) do<br /> Memo1.Lines.Add(Format('Arr[%d] is %s', [i, Arr[i].Name]));<br />end;</p> <p>end.</p> <p>本文来自Delphi园地,转载请标明出处:<a href="https://www.samool.com/go/aHR0cDovL3d3dy5kZWxwaGlmYW5zLmNvbS9JbmZvVmlldy9BcnRpY2xlXzY0OTQuaHRtbA==" target="_blank" >http://www.delphifans.com/InfoView/Article_6494.html</a></p> 相关文章 Delphi7调用C#的webservice,在windows2008下不能运行?? Delphi ListView排序 Delphi中获取Unix时间戳及注意事项 恢复delphi7 文件关联 delphi Format格式化函数 如何将Bitmap位图与base64字符串相互转换 通过MAP文件尝试解决Access violation at address错误 Delphi获得与设置系统时间格式 只输入数字或字母 delphi 字符串与内存流和文件的快速转换函数 Last modification:June 27th, 2010 at 12:40 pm © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments Pay by AliPay Pay by WeChat