TDictionary多输出?

时间:2015-11-09 19:30:19

标签: delphi delphi-xe delphi-xe7

是否可以在TDictionary中存储多个项目?我想为下一个

提供一个简单的解决方案

我的表格如下:

  • LOCATION_ID,CITY,ZIP_CODE
  • 1,England,2000
  • 2,匈牙利,1000
  • 3,土耳其,300
  • 4,德国,5000等...

我想存储表格中的所有字段以及搜索项目后的内容。是否TDictionary能够存储它?我有一个Paradox表,Query是一个简单的TQuery

我用2场

做了一个小例子
  var
  stSearch: string;
  vPDX: TDictionary<String, TCity>;
  variable: string; 

  stSearch := '4';
  vPDX := TDictionary<String, String>.Create;      qry_TMP.DatabaseName := 'C:\S_DATABASE';
  qry_TMP.SQL.Text := 'select * from SAMPLE_TABLE';
  qry_TMP.Open;

 while not qry_TMP.Eof do
   begin
   vPDX.AddOrSetValue(qry_TMP.FieldByName('LOCATION_ID').AsString,  qry_TMP.FieldByName('Location').AsString);    
qry_TMP.Next;
end;

if vPDX.TryGetValue(stSearch, variable) then
  showmessage(variable);

此代码有效,但我也需要另一个字段(ZIP_CODE)。

我用Class尝试过,但我只得到了表中的最后一项。

 TSampleClass = class
 ZIP_CODe: String;
 Location: String;
 end;

  var
  SampleClass, Value: TSampleClass;
  vPDX := TDictionary<String, TSampleClass>.Create;

  begin

  stSearch := '4';
  SampleClass := TSampleClass.Create;
  vPDX := TDictionary<String, TSampleClass>.Create;  
  qry_TMP.DatabaseName := 'C:\S_DATABASE';
  qry_TMP.SQL.Text := 'select * from SAMPLE_TABLE';
  qry_TMP.Open;

while not qry_TMP.Eof do
  begin
  vPDX.AddOrSetValue(qry_TMP.FieldByName('LOCATION_ID').AsString, SampleClass);     
  SampleClass.ZIP_CODE := Qry_TMP.FieldByName('ZIP_CODE').AsString;
  SampleClass.City := Qry_TMP.FieldByName('City').AsString;
  qry_TMP.Next;
  end;

if vPDX.TryGetValue(stSearch, SampleClass) then
  showmessage(SampleClass.ZIP_CODE + SampleClass.City);

任何人都可以帮助解决问题吗?我想要德国和5000 ZIP_CODE。我想学习如何使用TDictionary。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您只需拨打tSampleClass.Create一次。

将其移到WHILE语句中,以便为每条记录创建一个新实例。

答案 1 :(得分:1)

您只创建一个SampleClass实例,这意味着每次后续使用都会覆盖它包含的值。您需要为字典的每个添加创建一个新实例。

while not qry_TMP.Eof do
begin
  SampleClass := TSampleClass.Create;
  SampleClass.ZIP_CODE := qry_TMP.FieldByName('ZIP_CODE).AsString;
  SampleClass.City := qry_TMP.FieldByName('City').AsString;
  vPDX.AddOrSetValue(qry_TMP.FieldByName('LOCATION_ID', SampleClass);
  qry_TMP.Next;
end;