- 浏览: 237053 次
- 性别:
- 来自: ph
文章分类
最新评论
-
zrj_software:
说了等于没说,LZ能否把DLL代码给我研究下啊30729375 ...
如何在Delphi中调用.Net编写的DLL中的函数 -
reyesyang:
正在查找ruby单例模式相关资料,很有帮助,谢谢。
ruby中的单例模式 -
chaochao_pc:
您好,您的通讯工具能传输文件吗? 我在上边好像没找到!!! ...
Silverlight Socket 实现收发信息 -
huaxia524151:
谢谢,解决问题。return self.name.encode ...
Django笔记5(管理站点) -
yahon:
在flash中如何获取呢?
Flash+html--网页向FLASH传递参数
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/
发表评论
-
idftp几个简单函数
2010-10-08 11:00 24161 连接远程服务器procedure Connect(AAu ... -
用Delphi实现文件下载的几种方法
2010-10-08 10:23 1204笔者最近开发的系统中需要写一个下载文件的功能。以前用BCB调用 ... -
Delphi absolute关键字
2010-09-20 11:51 1135//它使得你能够创建一个新变量, 并且该变量的起始地址与另一个 ... -
如何在Delphi中调用.Net编写的DLL中的函数
2010-09-16 09:30 2161最近因公司群发邮件程式需要给注册一段时间没有激活的用户 ... -
WinAPI: SetLayeredWindowAttributes - 设置窗口的透明
2010-09-15 15:22 1932//声明:SetLayeredWindowAttributes ... -
Delphi2010组件/控件安装方法
2010-09-14 09:36 1430delphi 有很多组件可以用,下面介绍一下 在delphi2 ... -
delphi利用SHBrowseForFolder选择目录
2010-08-02 09:41 2027要求:利用Win32 API SHBrowseForFolde ... -
Microsoft Agent技术简介
2009-11-12 11:33 1191Agent技术的应用 ---- Micr ... -
delphi对象序列化
2009-10-31 10:12 1185function ComponentToStr(ACompon ... -
Delphi屏蔽控件的默认右键菜单
2009-10-28 14:34 1787在很多情况下我们也许 ... -
Delphi编程实现程序快捷方式
2009-10-24 10:46 1324摘要:本文主要介绍了 ... -
基于Delphi的融合DLL中的窗体
2009-09-24 14:29 7288基于Delphi的融合DLL中的 ... -
delphi中的静态变量
2009-09-24 10:51 1459众所周知,java,vb,c和c++中都有静态变量,它们都在变 ... -
取得系统运行的进程名
2009-07-31 14:13 826var hCurrentWindow:HWnd;szText: ... -
获得消逝时间
2009-07-31 14:11 967在测试硬件或软件的效率时或跟踪用户的响应速度时,需要测定消逝的 ... -
使用Delphi获取系统信息
2009-07-31 14:05 965Delphi以其优良的可视化编程,灵活的Windows ... -
相对路径转化为绝对路径
2009-07-31 14:02 1286请先添加 ComObj, ComConst引用,以下是实现代码 ...
相关推荐
Delphi中的泛型基础及简单应用
泛型使用全集(队_栈_字典_列表_对象列表)
IntfConstraint 的实例文件 已添加中文注释 包含编译后的执行文件
delphi 泛型及原生泛型列表、栈、队列、数组。
Delphi泛型库--DGL(The Delphi Generic Library) 在Delphi中实现的类型安全、高效、易用的泛型容器和算法库;借鉴了C++标准中的STL;
详细介绍了Delphi 2009新的语言特性,包括泛型、匿名方法及其它新的语言功能,具体有:泛型介绍、有关泛型的类型规则、Delphi中的泛型、泛型函数、泛型约束、特定类约束、接口约束、接口引用与泛型接口约束、使用...
Delphi 泛型的使用案例 解决问题:如有一组数字,55 68 79 120 130 180 先进行最大两个数的比对,譬如 130 180 比对,取小值,得到130,大的180-130=50, 然后在将50放入剩余的55 68 79 120比对,重复上面的比对要求...
Delphi泛型动态数组的扩展.3.rar
Delphi泛型动态数组的扩展.1.mht
Delphi泛型动态数组的扩展.2.mht
xe7结构体泛型
Decal 的全称是 Delphi Container and Algorithm Library,也就是 Delphi 数据容器和算法类库。 我个人认为是目前我所发现的类结构建模建得很好的一个数据结构类库,性能也是相当突出。他的思想是来自Stepanov 和 ...
stringgrid拖动换行泛型stringgrid拖动换行泛型stringgrid拖动换行泛型
Delphi2010语法手册,包括入门,语法基础,程序流控制,函数与过程,类与对象,异常处理,运算符重载,泛型等
Delphi泛型库--DGL(The Delphi Generic Library) , writed in 2004. === 安装: 将DGL源代码目录设置到编译器的搜索路径中 使用方法: 直接引用DGL_XXX.pas单元,大部分应用都应该没有问题了; 如果为了速度或效率等...
stringgrid拖动换行泛型修正stringgrid拖动换行泛型修正stringgrid拖动换行泛型修正
系统级屏幕键盘,可向外部程序发送键值,内嵌了一个拼音输入法,收录了3000个常用汉字,字典文件可自行增加。...使用了泛型类型,应该是2010以后的版本才能正常编译。用Delphi7的需要自己修改代码。
我在Delphi中的泛型集合简介会话中的样本源 OpenDocument的 用于OSX的Delphi FireMonkey应用程序,显示了如何在默认应用程序中打开文件和URL。 特殊文件夹 用于OSX和Windows的Delphi FireMonkey应用程序,显示了如何...
系统级屏幕键盘,可向外部程序发送键值,内嵌了一个拼音输入法,收录了3000个常用汉字,字典文件可自行增加。...使用了泛型类型,应该是2010以后的版本才能正常编译。用Delphi7的需要自己修改代码。
1、支持 GDI+1.1; 2、命名与结构与.Ne很接近,很多地方可以参考 msdn 的帮助. 3、基于接口进行功能调用. 4、使用了 Helper、运算符重载、泛型等 Delphi 的新语法, 所以只适用于 Delphi 2009 之后的版本.