Метод UnicodeString::FirstChar()
возвращает указатель на первый символ (так же, как UnicodeString::LastChar()
возвращает указатель впоследний символ).
Указываемые данные заканчиваются нулем.Таким образом, утверждение Label1->Caption = us.FirstChar();
такое же, как если бы вы написали Label1->Caption = L"12345";
вместо этого.Свойство TLabel::Caption
также является UnicodeString
, в котором имеется конструктор, принимающий в качестве ввода указатель WideChar*
с нулевым символом в конце.Вот почему вы видите результат, который вы получаете.
Если вам нужен только первый символ, используйте UnicodeString::operator[]
вместо:
Label1->Caption = us[1]; // UnicodeString is 1-indexed!
Или,используя FirstChar()
, просто разыменяем указатель:
Label1->Caption = *(us.FirstChar());
Обратите внимание, что если метод UnicodeString::IsEmpty()
вернет true, оба подхода завершатся неудачно.operator[]
сгенерирует исключение ERangeError
.FirstChar()
вернет указатель NULL
, который неопределенное поведение для разыменования.Так что следите за этим, например:
if (!us.IsEmpty())
Label1->Caption = us[1];
else
Label1->Caption = _D("");
if (!us.IsEmpty())
Label1->Caption = *(us.FirstChar());
else
Label1->Caption = _D("");
Более безопасный вариант - использовать вместо этого метод UnicodeString::SubString()
, который вернетпустая строка, если запрошенная подстрока выходит за пределы диапазона:
Label1->Caption = us.SubString(1, 1); // also 1-indexed!
В качестве альтернативы вы можете использовать функцию RTL System::Strutils::LeftStr()
вместо:
#include <System.StrUtils.hpp>
Label1->Caption = LeftStr(us, 1);