TDictionary.ContainsKey返回false,即使密钥存在

时间:2012-02-26 16:02:54

标签: delphi generics dictionary delphi-xe2

我现在面临的问题完全让我觉得我根本不懂编程。我有一个TDictionary对象,由TDate => TEvent (custom class)对组成。该对象用于由两个单独的应用程序共享的类(它们不通信)。在一个应用程序中,以下工作正常:

  //  Get recipes from the very event.
  Tmp := FCalendar.ContainsKey(D);
  if (Tmp) then
  begin
    E := FCalendar[D];
    CopyRecipes(E);
  end;

另一方面,同一段代码在其他应用程序中不起作用!怎么可能?我附上了调试器中发生的事情的屏幕截图:enter image description here

如您所见,密钥出现在字典中,但ContainsKey()会返回FALSE

造成这种情况的原因是什么?

此致 Patryk。

2 个答案:

答案 0 :(得分:6)

原因是TDate实际上只是TDateTime。这意味着它是一个双精度值,保持自德尔福纪元以来的天数。 TDate的IDE调试提示仅显示日期部分,并省略时间部分。您正在比较相等性,因此两个值在同一天,但具有不同的时间组件将不相等。这是一个截图来说明:

enter image description here

使用DateOf删除日期时间的时间部分来解决问题。每当收到日期值时,您都必须使用DateOf,并且在添加到字典之前清楚。

答案 1 :(得分:1)

可能在D而不是2011-11-11 可能D:= 2011-11-11 00-00-00