В статье рассматривается проблема, с которой столкнулся разработчик при использовании нового типа записи TTimeSpan в Delphi 2010. Основной вопрос заключается в несоответствии ожидаемых и фактических значений свойства Milliseconds. Разберемся подробнее.
Проблема
Разработчик столкнулся с проблемой, когда при использовании функции TTimeSpan.FromMilliseconds(5000) значение свойства Milliseconds ожидаемо было равно 5000, однако в результате получалось значение 0. Это привело к неудаче ассертации.
Исследование
При детальном рассмотрении метода GetMilliseconds, реализованного внутри TTimeSpan, был обнаружен следующий код:
function TTimeSpan.GetMilliseconds: Integer;
begin
Result := Integer((FTicks div TicksPerMillisecond) mod 1000);
end;
Разработчик отметил, что после выполнения деления и взятия остатка от деления на 1000 результат всегда будет находиться в диапазоне от 0 до 999. Это связано с тем, что Milliseconds представляет собой часть миллисекунд, оставшуюся после разбиения общего количества миллисекунд на секунды.
Альтернативный ответ
В качестве альтернативного решения было предложено использовать свойство TotalMilliseconds, которое возвращает общее количество миллисекунд и долей миллисекунды. Пример использования:
Это решение подтвердило свою работоспособность, что было отмечено в комментариях.
Подтвержденный ответ
Пользователь запутался в свойствах, которые дают общее количество выражения в определенной единице измерения (TotalMilliseconds), и свойствах, дающих часть значения при его разложении на составляющие (дни, часы, минуты, секунды, миллисекунды, тики). Свойство Milliseconds всегда будет возвращать значение от 0 до 999, так как это число миллисекунд в пределах одной секунды за вычетом единицы.
Заключение
Использование свойства TotalMilliseconds является правильным выбором для получения общего количества миллисекунд. Свойство Milliseconds, хотя и реализовано корректно, предназначено для возврата оставшейся части миллисекунд в пределах секунды.
Этот урок может служить напоминанием о том, что важно внимательно читать документацию и понимать назначение каждого свойства типа данных перед его использованием.
В статье обсуждаются проблемы с пониманием и использованием свойств `Milliseconds` и `TotalMilliseconds` в классе `TTimeSpan` языка программирования Delphi, выявленные при работе с версией 2010.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS