TDictionary.ContainsKey возвращает false, даже если ключ существует - PullRequest
3 голосов
/ 26 февраля 2012

Проблема, с которой я сейчас сталкиваюсь, заставила меня почувствовать, что я совсем не понимаю программирование. У меня есть 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 ]

6 голосов
/ 26 февраля 2012

Причина в том, что TDate на самом деле просто TDateTime. Это означает, что это значение с двойной точностью, содержащее количество дней со времен Delphi. Подсказки отладки IDE для TDate показывают только часть даты и пропускают часть времени. Вы сравниваете равенство, и поэтому два значения, которые находятся в одном и том же дне, но имеют разные компоненты времени, не будут равны. Вот скриншот для иллюстрации:

enter image description here

Решите проблему, используя DateOf, чтобы удалить часть времени даты и времени. Вам нужно будет использовать DateOf всякий раз, когда вы получаете значение даты, и четко перед добавлением в словарь.

1 голос
/ 26 февраля 2012

возможно в D не 2011-11-11 возможно D: = 2011-11-11 00-00-00

...