678_____________________________________________Глава 12

Приведенный код мало отличается от рассмотренного ранее и не содержит ка-
ких-то новых функций. Основные отличия заключаются в следующем. Во-первых,
вводится переменная i0 — индекс, предшествующий первому символу еще не обр
ботанной части строки S1. Значение i0 изменяется после обработки очередной части
строки. Во-вторых, очередное вхождение строки S2 в S1 определяется не по всей
строке S1, а только по ее еще не обработанной части : Sl.SubStrmg(iO + 1, 255).

Рассмотренную задачу контекстного поиска и замены в строке можно было бы
решить иначе, воспользовавшись функциями Delete и Insert класса AnsiString.
Функция Delete удаляет из строки, начиная с позиции, заданной первым парамет-
ром функции, число символов, заданное вторым параметром функции. Функция
Insert вставляет в строку подстроку, заданную первым параметром функции, в по-
зицию, заданную вторым параметром функции.

Применение этих функций позволяет выполнить контекстную замену с помо-
щью, например, следующего кода:

int i0 = 1, i = Sl.Pos(S2);

while(i > i0)
(

S1.Delete(i,S2.Length());      // удаление вхождения S2

S1.Insert(S3,i);               // вставка S3

i0 = i + S3.Length;) ;

i = i0 - 1 + S1.Substring(i0, 255).Pos(S2);

}

Мы проиллюстрировали применение только малой части методов, имеющих
в классе AnsiString. Полный перечень этих методов вы найдете в соответствую
щем разделе главы 15. В заключение отметим только метод, позволяющий перех
дить от типа AnsiString к типу (char *). Несмотря на то, что применение AnsiS;

ring практически всегда удобнее (char *), такие переходы приходится делать г.:

передаче параметров в некоторые функции, требующие тип параметра (char *;.
Чаще всего это связано с вызовом функций API Windows или функций C+4-Builder,
инкапсулирующих такие функции. Например, на протяжении этой книги много-
кратно использовалась функция Application->MessageBox, требующая в качестве
двух своих первых параметров (сообщения и заголовка окна) тип (char *). Ана;:

гичные преобразования требуются для функции PlaySound для передачи в к
имени файла и для многих других функций.

Преобразование строки AnsiString в строку (char *) осуществляется фу1;

цией c_str() без параметров, возвращающей строку с нулевым символом в кош
содержащую текст той строки AnsiString, к которой она применена. Напримг
если вы имеете строки S1 и S2 типа AnsiString, которые хотите передать в ф\т.
цию Application->MessageBox в качестве сообщения и заголовка окна, то вы;;

Application->MessageBox может иметь вид:

Application->MessageBox(SI.c_str О,S2.c_str(), MB_OK) ;

Возможно и обратное преобразование строки (char *) в строку AnsiString. Д -
этого используется функция

AnsiString(char *S)

которая возвращает строку типа AnsiString, содержащую текст, записанной
строке S, являющейся аргументом функции.

12.5 Перечислимые типы

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