конструктор c ++, label.caption, преобразование std :: string в unicode - PullRequest
0 голосов
/ 22 января 2010

Просто нужно установить lbl.caption (внутри цикла), но проблема больше, чем я думал. Я пробовал даже с вектором wstrings, но такого нет. Я прочитал несколько страниц, попробовал некоторые функции, такие как WideString (), UnicodeString (), я знаю, что не могу и не должен отключать Unicode в C ++ Builder 2010.

std::vector <std::string> myStringVec(20, "");
myStringVec.at(0) = "SomeText";
std::string s = "something";

// this works ..
Form2->lblTxtPytanie1->Caption = "someSimpleText";

// both lines gives the same err
Form2->lblTxtPytanie1->Caption = myStringVec.at(0);
Form2->lblTxtPytanie1->Caption = s;

Ошибка: [ошибка BCC32] myFile.cpp (129): E2034 Не удалось преобразовать 'std :: string' в 'UnicodeString'

Это съело меня несколько часов. Есть ли какое-нибудь «быстрое и грязное» решение? Это просто должно работать ...

UPDATE

решаемая. Я смешал классы строк STL / VCL. Спасибо TommyA .

1 Ответ

5 голосов
/ 22 января 2010

Проблема в том, что вы смешиваете стандартный строковый класс библиотеки шаблонов с VCL строковым классом . Свойство caption ожидает строку VCL, которая обладает всеми функциями STL.

Работающий пример действительно передает (const char*), что хорошо, потому что для этого есть конструктор в конструкторе класса VCL UnicodeString, однако нет конструктора для копирования из строк STL.

Вы можете сделать одну из двух вещей, вы можете использовать один из строковых классов VCL в вашем векторе вместо STL, так что:

std::vector <std::string> myStringVec(20, "");
myStringVec.at(0) = "SomeText";
std::string s = "something";

становится:

std::vector <String> myStringVec(20, "");
myStringVec.at(0) = "SomeText";
String s = "something";

В этом случае две нижние строки также будут работать. В качестве альтернативы вы можете извлечь фактический нулевой завершенный символьный указатель из строк STL и передать их заголовку, после чего он будет преобразован в класс VCL String следующим образом:

// both lines will now work
Form2->lblTxtPytanie1->Caption = myStringVec.at(0).c_str();
Form2->lblTxtPytanie1->Caption = s.c_str();

Какое решение вы предпочитаете, зависит от вас, но если у вас нет особой необходимости в классе строк STL, я настоятельно рекомендую вам использовать классы строк VCL (как я показал в моем первом примере). Таким образом, вам не нужно иметь два разных строковых класса.

...