![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Проблема конкатенации строки с вариантом, содержащим TBcd, в Delphi 12.3Delphi , Синтаксис , СинтаксисВ этой статье мы рассмотрим неожиданное поведение при работе с вариантами (Variant) в Delphi, содержащими двоично-десятичные числа (TBcd), и их конкатенации со строками. Описание проблемыКак обнаружил пользователь MarkShark на форуме, следующий код вызывает исключение в Delphi 12.3 (а также в более ранних версиях, таких как XE5 и 11.2):
При выполнении этого кода возникает исключение Причины поведенияКак объяснили участники обсуждения (PeterBelow, Remy Lebeau и другие), проблема связана с тем, как Delphi обрабатывает операции с вариантами:
Как отмечает Remy Lebeau: "Операция дает пользовательскому типу (TBcd) возможность решить, следует ли приводить левую часть к пользовательскому типу, что и происходит в этой ситуации, после чего происходит сбой во время этого преобразования из строки в TBcd." Решения проблемы1. Явное преобразование варианта в строкуСамый простой и надежный способ избежать проблемы - явно преобразовать вариант в строку перед конкатенацией:
Этот подход рекомендуется многими разработчиками, включая pmcgee, который ссылается на мнение части сообщества, считающего неявные преобразования потенциально опасными. 2. Использование FormatДругой вариант - использовать функцию Format:
3. Промежуточное преобразованиеМожно сначала преобразовать вариант в строку, а затем выполнять конкатенацию:
Почему работает простое присваивание?Интересно, что простое присваивание Альтернативное объяснение от Brian EvansBrian Evans приводит дополнительное объяснение, основанное на документации Windows OLE и Delphi: - В выражениях с вариантами невариантные значения автоматически преобразуются в варианты - Операции между вариантами следуют правилам Windows OLE (varAdd) - Для вариантов операция Выводы
Пример безопасного кода:
Помните: когда речь идет о типах и преобразованиях, компилятор всегда прав. Лучше явно указывать свои намерения в коде, чем полагаться на неявные преобразования. Контекст описывает проблему с конкатенацией строки и варианта, содержащего TBcd в Delphi, где неявное преобразование вызывает исключение, и предлагает решения через явное преобразование типов. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |