Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Несоответствие строковых типов


Автор: A5uKa 15.11.2008, 15:57
strcmp(Edit1->Text,UserTabel->Fields->FieldByName("AccountName")->Value)

[BCC32 Error] interview.cpp(32): E2034 Cannot convert 'UnicodeString' to 'const char *'

Использую Builder 2009.. Не могу найти преобразование...
UserTabel - это АДО таблица из mdb

Автор: YanTsys 15.11.2008, 17:59
strcmp если не ошибаюсь работает с char*
для получения адреса char* внутри String используй
Код

Edit1->Text.c_str()


а уж что за поле у тебя Value понятия не имею хотя подозреваю что фраза насчет UnicodeString относится именно к нему

Что бы узнать где ошибка попробуй так

String sText1=Edit1->Text;
String sText2=UserTabel->Fields->FieldByName("AccountName")->Value;
strcmp(sText1.c_str(),sText2.c_str());

Автор: A5uKa 15.11.2008, 18:35
Ошибка тут ->

strcmp(sText1.c_str(),sText2.c_str());

такая

[BCC32 Error] interview.cpp(33): E2034 Cannot convert 'wchar_t *' to 'const char *'

Автор: YanTsys 15.11.2008, 19:21
У меня бидлер 6 версии
Прочитал такую вещь
Цитата

По умолчанию в D2009 String уже UnicodeString, поэтому если нужно 
использовать однобайтовую строку, то описывать нужно как AnsiString


А если так?

AnsiString sText1=Edit1->Text;
AnsiString sText2=UserTabel->Fields->FieldByName("AccountName")->Value;
strcmp(sText1.c_str(),sText2.c_str());


Автор: A5uKa 15.11.2008, 19:58
Спасибо. 
Так работает.

но всё же как написать сравнение в одну строку ?

Автор: YanTsys 15.11.2008, 20:03
Должно работать

strcmp(AnsiString(Edit1->Text).c_str(),AnsiString(UserTabel->Fields->FieldByName("AccountName")->Value).c_str());

Но наверняка в b2009 должен быть способ проще.

Добавлено через 3 минуты и 47 секунд
Кстати а почему strcmp? Нужно разобраться с преобразованием или просто проверить равенство?
Почему не просто 

Код

if ( Edit1->Text==String(UserTabel->Fields->FieldByName("AccountName")->Value) )
 {
   // ...
 }


Автор: A5uKa 15.11.2008, 20:12
[BCC32 Error] interview.cpp(40): E2031 Cannot cast from 'Variant' to 'UnicodeString'

это если стринг

AnsiString(UserTabel->Fields->FieldByName("AccountName")->Value)

если так то...
[BCC32 Error] interview.cpp(40): E2031 Cannot cast from 'Variant' to 'AnsiString'

Автор: YanTsys 15.11.2008, 20:21
т.е.
такая строка работает
Код

AnsiString sText2=UserTabel->Fields->FieldByName("AccountName")->Value;

а такая нет?
Код

AnsiString(UserTabel->Fields->FieldByName("AccountName")->Value)


Автор: A5uKa 15.11.2008, 20:24
Да
AnsiString sText2= AnsiString(UserTabel->Fields->FieldByName("AccountName")->Value);
не работает.

Автор: YanTsys 15.11.2008, 20:31
Когда после Value нажимаешь на точку и выпадает список вариантов в 6 билдере есть вариант .operator AnsiString() может в B2009 тоже есть такое преобразование? Попробуй выдает ли ошибку

Код

AnsiString sText2= AnsiString(UserTabel->Fields->FieldByName("AccountName")->Value.operator AnsiString());


Чувствую нужно срочно B2009 покупать а то отстану...

Автор: A5uKa 15.11.2008, 20:57
Спасибо так работает ...

Есть ещё один маленький вопросик , у меня в mdb базе происходит зацикливание тут

while (UserTabel->Fields->FieldByName("IDUser")!=NULL){
UserTabel->Next();

как-нибудь можно это... починить

Автор: mrbrooks 16.11.2008, 09:31
Вообщето для сравнения строк у UnicodeString есть метод Compare() 
Код

UnicodeString str1 = "blablabla";
UnicodeString str2 = "ыыыыыы";
int res = str1.Compare(str2); //далее курим матчасть.

использовать ansi-функции применимо к unicode-строкам не совсем разумно. тем более что есть аналог strcmp() для unicode - wcscmp()

Код

wcscmp(str1.w_str(), str2.w_str())


Так что мой вам совет не устраивайте братских могил из кодировок когда есть много стандартных способов.


Цитата(A5uKa @  15.11.2008,  20:57 Найти цитируемый пост)
while (UserTabel->Fields->FieldByName("IDUser")!=NULL){UserTabel->Next();

не совсем ясен смысл кода. что за критерий в цикле. конец набора БД?

Автор: A5uKa 16.11.2008, 10:51
Спасибо за пояснение !

А критерий - просто пройти по записям в таблице  smile  да я знаю, что это глупый вопрос, но то что написано не работает...

Автор: mrbrooks 16.11.2008, 11:26
A5uKa, ну тогда что то вроде этого
Код

while (!UserTabel->EoF)
              UserTabel->Next();

Автор: A5uKa 16.11.2008, 12:02
Работает - спасибо  ( только ф маленькая ^_^)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)