Строки и преобразоваиня
Последнее обновление этого раздела FAQ: November 3, 2006
СТРОКИ И ПРЕОБРАЗОВАНИЯ
1.Строки.Краткая информация.
2.Создание строки
3.Получение символа из строки
4.Получение символьного массива, содержащего значение AnsiString
5.Копирование значения AnsiString в символьный массив Unicode
6.Как узнать, сколько символов в строке?
7. Как удалить в строке концевые пробелы?
8. Работа с фрагментами строки
9.Как зарезервировать строке определенный размер
10.AnsiString в целочисленный тип(int,long)
11.AnsiString в число с плавающей точкой(float,double)
12.AnsiString <-> цвет(TColor)
13.AnsiString <-> курсор(TCursor)
14.Как перевести строку из Windows-кодировки в OEM-кодировку?
15.Как перевести строку из OEM-кодировки в Windows-кодировку?
16.Как получить
шестнадцатеричное представление числа?
17.Проверка буфера обмена на наличие в нем текста
18.Как добавить стpокy в RichEdit, чтобы пpи этом кypсоp
остался в конце той же стpоки?
1.Строки.Краткая информация.
AnsiString - класс динамической строки емкостью до 232-1 символов.
Базой для создания этого класса послужил паскалевский тип String, который был
расширен в соответствии с возможностями C++.
Особенностью его является то, что два экземпляра этого класса могут физически
занимать один и тот же участок памяти. Экземпляр этого класса содержит счетчик
ссылок к нему, когда этот счетчик обнуляется, экземпляр автоматически уничтожается.
Если попытаться изменить экземпляр, к которому имеется более одной ссылки, то
будет создана новая копия этой строки, которая и будет изменяться. Это уменьшает
портебность программы в памяти, но и уменьшает скорость обработки.
Наследием Паскаля является также то, что символы в нем нумеруются с 1, а не
с 0, как это принято в C/C++
2.Создание строки
Благодаря наличию перегруженных конструкторов строку можно создавать из большого
количества базовых типов языка C++, например:
AnsiString empty_string; /* пустая строка
*/
AnsiString one = 1; /* строка one будет содержать "1"
*/
AnsiString one_and_half = 1.5; /* в one_and_half содержится
строка "1.5" */
AnsiString one_charachter = 'a'; /* в one_charachter содержится
строка "a" */
AnsiString dup_string = AnsiString::StringOfChar('A',5); /*
dup_string получит значение "AAAAA" */
AnsiString simply_string = "string";
AnsiString shorten("Длинная строка",7); /* в shorten
попадут только первые 7 символов */
3.Получение символа из строки
Получить символ из строки типа AnsiString можно с помощью индексного оператора:
AnsiString ansi_string = "Строка";
char character = ansi_string[1]; /* получаем
самый первый символ */
ansi_string[6] = 'и'; /* заменим 6-й на букву 'и' */
4.Получение символьного массива, содержащего значение AnsiString
Функции библиотеки исполнения C и функции WinAPI требуют, чтобы строки передавались
им в виде символьных массивов. В AnsiString для этого предназначены функции
c_str и data. Разница между ними в том, что для пустой строки c_str возвращает
"", а data - NULL. Это отличие может быть проиллюстрировано следующим
примером:
AnsiString ansi_string;
char * str1 = ansi_string.c_str();
char * str2 = (char *)ansi_string.data();
5.Копирование значения AnsiString в символьный массив Unicode
Для этого предназначена функция WideChar, а размер требуемого массива можно
узнать, воспользовавшись функцией WideCharBufSize
AnsiString ansi_string = "Строка AnsiString";
/* наша строка */
wchar_t * UnicodeString = new wchar_t[ansi_string.WideCharBufSize()];
/* массив-получатель */
ansi_string.WideChar(UnicodeString,ansi_string.WideCharBufSize());
// используем полученную строку, затем удаляем
delete [] UnicodeString;
6.Как узнать, сколько символов в строке?
Для этого надо воспользоваться функцией Length.
String s="Превед Медвед!";
int i=s.Length(); //в i запишется количество символов в s.
7. Как удалить в строке концевые пробелы?
Это делают функции Trim, TrimLeft и TrimRight соответственно с обоих концов,
только с начала и только с конца.
8. Работа с фрагментами строки
AnsiString предоставлякт возможность поиcка(Pos), вставки(Insert), удаления(Delete)
и получения копии(SubString) фрагмента текста в строке:
AnsiString ansi_string = "Строка";
int index = ansi_string.Pos("ка"); /*
найдем окончание слова */
if( index != 0 )
{
ansi_string.Insert("чеч",index); /* теперь строка имеет вид
"Строчечка" */
ansi_string.Delete(index,2); /* а теперь - "Строчка" */
}
9.Как зарезервировать строке определенный размер
Иногда бывает нужно зарезервировать для строки пространство, достаточное для
хранения определенного количества символов. Сделать это можно при помощи функции
SetLength
10.AnsiString в целочисленный тип(int,long)
AnsiString int_as_AnsiString = "123";
int int_as_int_1 = int_as_AnsiString.ToInt();
int int_as_int_2 = StrToInt(int_as_AnsiString);
11.AnsiString в число с плавающей точкой(float,double):
AnsiString float_as_AnsiString = "3.14";
float float_as_float_1 = float_as_AnsiString.ToDouble();
float float_as_float_2 = StrToFloat(float_as_AnsiString);
12.AnsiString <-> цвет(TColor):
AnsiString ansi_string = "clBtnText";
TColor color = StringToColor(ansi_string); /* цвет в строку */
AnsiString color_string = ColorToString(clWhite); /* строку в цвет
*/
13.AnsiString <-> курсор(TCursor):
AnsiString ansi_string = "crHandPoint";
TCursor cursor = StringToCursor(ansi_string); /* строка в курсор */
AnsiString cursor_string = CursorToString(crHelp); /* курсор в строку
*/
14.Как перевести строку из Windows-кодировки в OEM-кодировку?
Для перевода строки из Windows-кодировки в OEM-кодировку воспользуйтесь следующей
функцией:
AnsiString __fastcall StringToOEMi(const AnsiString
ASourceString)
{
char *TempString = new char[ASourceString.Length()];
AnsiString ResultString;
CharToOemBuff(ASourceString.c_str(), TempString,
ASourceString.Length());
ResultString = TempString;
delete [] TempString;
return ResultString;
}
15.Как перевести строку из OEM-кодировки в Windows-кодировку?
Для перевода строки из OEM-кодировки в Windows-кодировку воспользуйтесь следующей
функцией:
AnsiString __fastcall StringToAnsi(const AnsiString
ASourceString)
{
char *TempString = new char[ASourceString.Length()];
AnsiString ResultString;
OemToCharBuff(ASourceString.c_str(), TempString,
ASourceString.Length());
ResultString = TempString;
delete [] TempString;
return ResultString;
}
16.Как получить шестнадцатеричное представление числа?
Для перевода числа в шестнадцатеричную систему
счисления воспользуйтесь функцией IntToHex() из модуля Sysutils.hpp. Первый
параметр функции - исходное число, второй параметр - количество знаков в шестнадцатеричном
представлении числа. Функция возвращает строку, представляющую число в шестнадцатеричной
системе счисления. Вот код:
int Number = 12;
AnsiString HexNumber = IntToHex(Number, 8);
В HexNumber будет содержаться "0000000С".
17.Проверка буфера обмена на наличие в нем текста
Чтобы проверить буфер обмена на наличие в нем текста, вы должны подключить в
свою программу файл Clipbrd.hpp и написать следующий код:
if (Clipboard()->HasFormat(CF_TEXT))
// обработка при наличии текста в буфере
обмена
else
// текста в буфере обмена не существует
Метод HasFormat(CF_TEXT) вернет true, если в буфере обмена содержится текстовый
фрагмент.
18.Как добавить стpокy в RichEdit, чтобы пpи этом кypсоp остался в конце
той же стpоки?
Чтобы при добавлении строки в RichEdit (TRichEdit) курсор остался в конце добавленной
строки, напишите следуюзий код:
RichEdit1->Lines->Add("тестовая строка");
RichEdit1->SelStart = RichEdit1->SelStart - 1;
Author of article - MA F*CKA CREW 2006
www.builderhelper.3dn.ru
builder.helper@rambler.ru