![]()  | 
![]() ![]() ![]() ![]()  | 
   
 | 
Проблема конкатенации строки с вариантом, содержащим 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  | ||||