- 浏览: 242517 次
- 性别:
- 来自: 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 24751 连接远程服务器procedure Connect(AAu ... -
用Delphi实现文件下载的几种方法
2010-10-08 10:23 1292笔者最近开发的系统中需要写一个下载文件的功能。以前用BCB调用 ... -
Delphi absolute关键字
2010-09-20 11:51 1160//它使得你能够创建一个新变量, 并且该变量的起始地址与另一个 ... -
如何在Delphi中调用.Net编写的DLL中的函数
2010-09-16 09:30 2219最近因公司群发邮件程式需要给注册一段时间没有激活的用户 ... -
WinAPI: SetLayeredWindowAttributes - 设置窗口的透明
2010-09-15 15:22 2004//声明:SetLayeredWindowAttributes ... -
Delphi2010组件/控件安装方法
2010-09-14 09:36 1467delphi 有很多组件可以用,下面介绍一下 在delphi2 ... -
delphi利用SHBrowseForFolder选择目录
2010-08-02 09:41 2095要求:利用Win32 API SHBrowseForFolde ... -
Microsoft Agent技术简介
2009-11-12 11:33 1249Agent技术的应用 ---- Micr ... -
delphi对象序列化
2009-10-31 10:12 1220function ComponentToStr(ACompon ... -
Delphi屏蔽控件的默认右键菜单
2009-10-28 14:34 1844在很多情况下我们也许 ... -
Delphi编程实现程序快捷方式
2009-10-24 10:46 1352摘要:本文主要介绍了 ... -
基于Delphi的融合DLL中的窗体
2009-09-24 14:29 7322基于Delphi的融合DLL中的 ... -
delphi中的静态变量
2009-09-24 10:51 1495众所周知,java,vb,c和c++中都有静态变量,它们都在变 ... -
取得系统运行的进程名
2009-07-31 14:13 855var hCurrentWindow:HWnd;szText: ... -
获得消逝时间
2009-07-31 14:11 997在测试硬件或软件的效率时或跟踪用户的响应速度时,需要测定消逝的 ... -
使用Delphi获取系统信息
2009-07-31 14:05 991Delphi以其优良的可视化编程,灵活的Windows ... -
相对路径转化为绝对路径
2009-07-31 14:02 1323请先添加 ComObj, ComConst引用,以下是实现代码 ...
相关推荐
Delphi中的泛型基础及简单应用
在 Delphi 中,泛型编程允许开发人员编写灵活且可重用的代码,该代码可以操作不同类型的值。通过使用泛型,我们可以创建能够处理各种数据类型的类或函数,这不仅提高了代码的灵活性,还增强了其复用性。 #### 二、...
在 Delphi 编程语言中,泛型是一种强大的工具,它允许我们编写可重用的代码,这些代码可以在多种不同的数据类型上工作。泛型接口约束是泛型类或方法中一个重要的特性,它限制了可以传递给泛型类型的参数必须实现特定...
泛型是Delphi语言中的一个重要特性,它允许开发者编写能够处理多种数据类型的通用代码。这篇“Delphi 泛型学习实录”将深入探讨这一主题。 首先,我们要理解什么是泛型。泛型是一种模板或类蓝图,它在编译时并不...
#### 二、泛型编程在 Delphi 中的重要性 泛型编程是一种编程技术,允许开发者编写出类型安全且高度可重用的代码。这种编程方法允许代码独立于具体的类型,从而能在多种类型之间共享。在 Delphi 中,泛型编程特别有...
**Delphi泛型库——DGL详解** 在Delphi编程环境中,DGL(The Delphi Generic Library)是一个非常重要的工具,它为开发者提供了类型安全、高效且易用的泛型容器和算法。这个库的设计灵感来源于C++的STL(Standard ...
本文将深入探讨"Delphi泛型动态数组的扩展"这一主题,结合压缩包中的文件,我们将讨论如何利用泛型来增强动态数组的功能。 首先,让我们了解泛型。泛型是Delphi(以及许多其他面向对象语言)中的一种特性,它允许...
Delphi 泛型的使用案例 解决问题:如有一组数字,55 68 79 120 130 180 先进行最大两个数的比对,譬如 130 180 比对,取小值,得到130,大的180-130=50, 然后在将50放入剩余的55 68 79 120比对,重复上面的比对要求...
在本文中,我们将深入探讨"xe7结构体泛型"这一主题,这是一种特定于某个编程环境(可能是C#或Java等语言)的概念,用于提升代码的灵活性和类型安全性。 泛型主要在类、接口和方法中使用,它通过参数化类型来实现。...
在Delphi中,异常处理(try...except...finally)是常用的方式。此外,源代码中可能还包括调试信息,帮助开发者定位和修复问题。 "通讯组件"可能包含了实现USB通信的关键代码或者第三方库,而"test"可能是测试用例...
在Delphi 2010入门章节中,会介绍工程文件结构与语法,单元文件结构以及单元语法与uses从句。工程文件结构是指一个Delphi项目中的文件组成和布局,通常包括主程序文件(.dpr)、单元文件(.pas)等。uses从句是用于...
在Delphi 2010开发中,首先需要了解的是其基本的语法结构,这包括了标识符的使用、数据类型、常量与变量的声明、程序流程控制等。标识符用于给程序元素命名,有标准标识符和自定义标识符之分,它们在不同的作用域中...
Delphi泛型动态数组的扩展.1.mht
Delphi泛型动态数组的扩展.2.mht
Decal 的全称是 Delphi Container and Algorithm Library,也就是 Delphi 数据容器和算法类库。 我个人认为是目前我所发现的类结构建模建得很好的一个数据结构类库,性能也是相当突出。他的思想是来自Stepanov 和 ...
Delphi 2009中的泛型遵循一套特定的规则,这些规则确保泛型类型的正确性和类型安全性。例如,类型参数的使用范围、类型参数的约束等。 **Delphi中的泛型** 在Delphi 2009中,泛型可以通过在类或函数定义中使用尖...
Visual Component Library (VCL)在Delphi 2010中得到了升级,以适应Unicode和新的Windows API。许多控件和组件被修改以支持Unicode字符串,同时增加了新的控件,如TTaskDialog,用于展示现代Windows任务对话框。 3...
在Delphi 2010的教程及语法手册中,涵盖了从基础语法、数据类型、程序流程控制,到面向对象编程、异常处理以及泛型等高级特性。以下内容将对Delphi 2010的入门知识、基础语法、数据类型及运算符、程序流程控制、函数...
在Delphi编程环境中,线程是并发执行的基本单元,它允许程序在后台执行任务而不阻塞主线程。在某些情况下,我们可能需要创建一个能够独立运行的匿名线程,并且在线程函数中传递参数。`CreateAnonymousThreadX`是...
在Delphi编程中,枚举(Enumeration)是一种强大的工具,用于定义一组相关的命名常量。枚举类型在处理固定集合的值时非常有用,而字符串转换则是编程中常见的操作,特别是在处理用户输入或数据交互时。当我们需要将...