Строки и преобразоваиня No title

Последнее обновление этого раздела 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