文档章节

Delphi 2009 泛型容器单元(Generics.Collections)[4]: TDictionary<T>

涂孟超
 涂孟超
发布于 2014/09/26 15:38
字数 650
阅读 14
收藏 0
TDictionary 类似哈希表.

本例效果图:



代码文件:
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 2009 新增的泛型容器单元}

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.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 165
  ClientWidth = 275
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object Memo1: TMemo
    Left = 0
    Top = 0
    Width = 133
    Height = 165
    Align = alLeft
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -13
    Font.Name = 'Courier New'
    Font.Style = []
    Lines.Strings = (
      'Memo1')
    ParentFont = False
    ScrollBars = ssBoth
    TabOrder = 0
    ExplicitHeight = 176
  end
  object Button1: TButton
    Left = 139
    Top = 40
    Width = 128
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 139
    Top = 71
    Width = 128
    Height = 25
    Caption = 'Button2'
    TabOrder = 2
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 139
    Top = 102
    Width = 128
    Height = 25
    Caption = 'Button3'
    TabOrder = 3
    OnClick = Button3Click
  end
  object Edit1: TEdit
    Left = 139
    Top = 8
    Width = 40
    Height = 21
    TabOrder = 4
    Text = 'Edit1'
  end
  object Edit2: TEdit
    Left = 185
    Top = 8
    Width = 81
    Height = 21
    TabOrder = 5
    Text = 'Edit2'
  end
  object Button4: TButton
    Left = 139
    Top = 133
    Width = 128
    Height = 25
    Caption = 'Button4'
    TabOrder = 6
    OnClick = Button4Click
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/08/15/1269024.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
Delphi 2010 中的泛型

Delphi 2010 中的泛型日期:2010年5月31日 作者: 人气:10504 查看:[大字体 中字体 小字体]2010已发布很长时间了,口碑还不错,准备用它开发下一项目,但对泛型等新东西的认识还不够,就搜了...

vga
2016/08/09
19
0
Delphi 的编译指令(2): 条件语句的更多用法

$IFDEF 等同于 $IF DEFINED(...) : 它们的结束分别是: $ENDIF、$IFEND; 例子中的 VER200 是 Delphi 2009 的标识. begin {$IFDEF VER200} ShowMessage('这是 Delphi 2009'); {$ENDIF} {$IF D......

geek_loser
2015/01/29
0
0
支持.NET和移动设备的XLS读写控件XLSReadWriteII控件介绍

XLSReadWriteII 相关文章 在Delphi中使用XlsReadWrite xlsreadwriteII对excel进行读取操作的几点提示 解决 XLSReadWriteII 解析Excel95格式的文件乱码的问题 Excel读写方案XLSReadWriteII使用...

yidongkaifa
2014/06/04
0
0
java中List和List的区别

类型参数“”和无界通配符“”的区别 首先要区分开两种不同的场景: 第一,声明一个泛型类或泛型方法 类型参数“”主要用于第一种,声明泛型类或泛型方法 第二,使用泛型类或泛型方法 无界通...

芥末无疆sss
10/09
0
0
Java 泛型简写

Java 泛型简写 有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。 泛型类 泛型接口 泛型方法 通过 可以实现引用这种情况。 Tips 泛型的概念是针对的,在编译处理后...

精通吹水
2016/07/01
85
0

没有更多内容

加载失败,请刷新页面

加载更多

Dubbo下一站:Apache顶级项目

摘要: 导读: 近日,在Apache Dubbo开发者沙龙杭州站的活动中,阿里巴巴中间件技术专家曹胜利(展图)向开发者们分享了Dubbo2.7版本的规划。 本文将为你探秘 Dubbo 2.7背后的思考和实现方式。...

阿里云云栖社区
16分钟前
1
0
Vim中快捷键命令介绍

map命令简介 map是一个映射命令,将常用的很长的命令映射到一个新的功能键上。map是Vim强大的一个重要原因,可以自定义各种快捷键,用起来自然得心应手。Vim中有五种映射存在: 用于普通模式:...

陶小陶
20分钟前
2
0
结合实际场景谈一谈微服务配置

作为 Nacos 5W1H 的系列文章,本文将围绕“Where”,讲述 Nacos 配置管理的三个典型的应用场景: 数据库连接信息 限流阈值和降级开关 流量的动态调度 上一篇:Nacos帮我解决了什么问题? 数据...

阿里云官方博客
22分钟前
1
0
Docker | 采用镜像alpine缺少时区解决方法

加入: RUN apk --update add tzdata当然也可以安装其他的如 procps, php 等

云迹
22分钟前
2
0
在Python中调用Java扩展包HanLP测试记录

最近在研究中文分词及自然语言相关的内容,关注到JAVA环境下的HanLP,HanLP是一个致力于向生产环境普及NLP技术的开源Java工具包,支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义...

左手的倒影
33分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部