本文整理自网络,侵删。
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.
相关阅读 >>
Delphi 获取android package name:
Delphi 打造mygetprocaddress函数(Delphi源码)
Delphi getsessionusername通过会话id得到会话名称
processid, process handle, window handle 之间的互相转换
Delphi snowflake一秒可生成500万id的分布式自增id算法―雪花算法
更多相关阅读请进入《Delphi》频道 >>