C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
char * to AnsiString, Помогите эмигранту с Delphi
starling13
Отправлено: 17.04.2005, 22:26


Не зарегистрирован







Здравствуйте. Почти нет опыта практической работы с Builder. (Если не считать институтских поделок).
Очень нужно "съедать" символы, вводимые в поле, постепенно формируя строку.
CODE

...
char * HiddenString = NULL;//Строка для хранения
short HiddenStringLength = 0;//длина
...

//Обработчик нажатия клавишы в поле
void __fastcall TLoginBox::TextFieldKeyPress(TObject *Sender, char &Key)
{
       char * OldKeyValue = &Key;

       HiddenString = (char *)realloc(HiddenString, (HiddenStringLength+1)*sizeof(char));
       HiddenString[HiddenStringLength] = *OldKeyValue;
       HiddenStringLength++;

       *OldKeyValue = '\x0';
}
...
//Пытаюсь просмотреть, что получилось
Application->MessageBoxA((const char*)HiddenString, "", MB_OK);


Получается какая-то ерунда. Меньше трёх символов в строке не выводит, и иногда лепит в конце что нибудь.
FataLL
Отправлено: 17.04.2005, 23:48


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Не знаю, как срабатывает реаллок на пустой указатель, но памяти ты выделяешь на 1 байт меньше (строку же надо еще нулем закрывать). Перепишем так:
CODE

void __fastcall TLoginBox::TextFieldKeyPress(TObject *Sender, char &Key)
{
      HiddenString = (char *)realloc(HiddenString, (HiddenStringLength+2)*sizeof(char));
      HiddenString[HiddenStringLength] = Key;
      HiddenStringLength++;
      HiddenString[HiddenStringLength] = '\0';
}

Это все во-первых, а во-вторых, чем тебе не нравится AnsiString? Вся эта байда выглядела бы так:
CODE

...
AnsiString HiddenString = "";//Строка для хранения
...

//Обработчик нажатия клавишы в поле
void __fastcall TLoginBox::TextFieldKeyPress(TObject *Sender, char &Key)
{
   HiddenString += Key;
}
...
//Пытаюсь просмотреть, что получилось
Application->MessageBoxA(HiddenString.c_str(), "", MB_OK);

wink.gif
Большое апасибо.
Отправлено: 18.04.2005, 15:26


Не зарегистрирован







Да, непростительно забыть о замыкающем нуль-символе...

А вариант с AnsiString не пробовал — показалось неправильным вот так взять
и прибавить char * к AnsiString.

Ещё раз спасибо.

Вернуться в Вопросы программирования в C++Builder