Основы Object Pascal (551739), страница 5
Текст из файла (страница 5)
end;
В этом примере для определения длины строки используется значение S[0]. Можно также воспользоваться функцией Length.
ПРИМЕЧАНИЕ. Для преобразования значения типа Char в целую величину используется функция Ord. Функция Ord также применяется к перечислимым типам.
Ели это необходимо, первому элементу короткой строки можно присвоить значение длины. Это может потребоваться в некоторых специальных случаях. Отметим, что программное изменение длины строки относится к «продвинутой» технике и начинающим программистам этого делать не стоит.
Длинная строка
Строки этого типа относятся к объектам, которые размещаются в памяти динамически. Размер такой строки ограничен лишь доступным объемом оперативной памяти. Object Pascal выделяет и освобождает память для строк рассматриваемого типа по мере необходимости. Длинные строки – очень гибкий тип данных, но операции над ними требуют большего времени. Это объясняется необходимостью перераспределения памяти когда размер строки изменяется. Несмотря на это, в программах следует использовать строки именно этого типа.
Для объявления длинной строки используется ключевое слово string без спецификации длины:
var
S : string; { динамически размещаемая длинная строка }
Длинные строки не содержат 0–го элемента длины. Попытка прочитать нулевой элемент, обратившись к нему как S[0], будет пресечена на этапе компиляции. Вместо этого надо пользоваться функцией Length чтобы узнать длину строки, или процедурой SetLength – чтобы установить требуемую длину строки. Более подробно об этом – в разделе «Строковые функции».
Расширенная строка
Этот тип применяется при обращении к тем функциям Windows API, которые работают со строками символов Unicode, где каждый символ представлен двухбайтным кодом. Размер строки ограничен только доступным объемом памяти. В основном, строки этого типа необходимы при работе с функциями OLE (Object Linking and Embedding).
Строка с терминальным нулем
Строка с терминальным нулем это массив символов, последним элементом которого является символ #0. Такие строки не содержат нулевого байта длины. Терминальный ноль используется как признак конца строки. Большинство функций Windows API требуют, чтобы их параметры были массивами символов. Строковые типы Pascal к таковым не относятся, следовательно, необходим механизм, позволяющий использовать Pascal–строки в функциях Windows. Таким механизмом является тип PChar. Его можно использовать всюду, где требуются массивы символов.
В качестве примера рассмотрим функцию Windows API MessageBox. Эта функция отображает стандартный диалог сообщения. Ее объявление имеет вид:
function MessageBox(hWnd: HWND; lpText, lpCaption: PChar;
uType: UINT): Integer;
Второй и третий параметры являются указателями на массивы символов: второй параметр указывает на текст сообщения, а третий – на заголовок диалогового окна. Чтобы обратиться к этой функции из Delphi – программы, следует воспользоваться типом PChar:
var
Text : string;
Caption : string;
begin
Text := This is a test;
Caption := Test Message;
MessageBox(0, PChar(Text), PChar(Caption), 0);
end;
Здесь PChar используется для преобразования длинной строки к типу строки с терминальным нулем.
Можно также явно применить переменную типа PChar:
var
Text : PChar;
begin
Text := 'This is a test.';
MessageBox(0, Text, 'Message', 0);
end;
В Pascal–программах тип PChar используется сравнительно редко. В основном, вы будете иметь дело с типом string. При необходимости всегда можно преобразовать этот тип в строку с терминальным нулем так, как это сделано в примерах выше.
Обратите внимание на то, что фактическим параметром типа PChar, передаваемым в функцию Windows API, может быть литерал – строка символов, заключенная в кавычки.
В конце концов, вы можете использовать фактические параметры типа array of Char вместо PChar. Эту возможность иллюстрирует следующий фрагмент кода:
var
Text : array [0..20] of Char;
begin
Text := 'This is a test.';
MessageBox(0, Text, 'Message', 0);
end;
На самом деле не важно, какой способ обеспечения совместимости вы будете применять. Просто поймите то, что нельзя передавать фактические параметры строковых типов языка Pascal в процедуры и функции Windows API, которые «понимают» только строки с терминальным нулем. В таких случаях используйте тип PChar или массив array of Char.
Операции со строками
Слияние
Чаще всего используется операция слияния строк, для чего применяют знак сложения (+):
var
S1 : string;
S2 : string;
begin
S1 := 'Аппаратура;
S2 := 'работает нормально';
Label1.Caption := S1 + ' ' + S2;
end;
Последний оператор этого кода выполняет слияние трех строк – переменной S1, литерала «пробел» и переменной S2. Результат слияния присваивается свойству «заголовок» (Caption) компонента формы типа «надпись».
В операции слияния строк могут присутствовать любые выражения строкового типа, например:
var
X : Integer;
begin
X := 70;
Label1.Caption := IntToStr(X)+ ' секунд – полет нормальный';
end;
Здесь функция IntToStr преобразует числовое значение переменной X в строку, а результат соединяется с литералом.
Извлечение символа
Нумерация символов в строке ведется с единицы. Любой символ строки доступен по его порядковому номеру (индексу) в строке:
var
S1 : string;
S2 : Char;
begin
S1 := 'Hello World!';
S2 := S1[1];
Label1.Caption := S2;
end;
Управляющие символы в строках
В строку можно включить управляющие символы.
Поместите на форму командную кнопку и надпись. Дважды щелкните на кнопке и введите следующий код обработчика события OnClick:
p
rocedure TForm1.Button1Click (Sender: TObject);
var
Line1 : string;
Line2 : string;
Y : integer;
begin
Y := 50;
Line1 := IntToStr(Y) + секунд;
Line2 := Полет нормальный;
Label1.Caption := Line1 + #10 + Line 2;
end;
Выполните программу – увидите две строки надписи. В этом коде в строку вставлен символ возврата каретки (код ASCII 10).
Разбиение литерала по строкам программы
Часто бывает необходимо разместить длинный литерал на нескольких строках текста программы. Например, требуется вывести сообщение, содержащее 200 символов. Максимальная длина одной строки текста в редакторе кода равна 1024 символам. На экране целиком умещается около 80 символов текста в одной строке. Следовательно, напечатать длинный текст в одной строке редактора можно, но читать его – с трудом.
Лучше всего разбить длинный текст – литерал на несколько строк исходной программы. Для этого просто используйте операцию слияния (+)
MessageBox(0, 'Файл изменен, но не был сохранен. ' +
'Сохранить его сейчас ' +
'или снова вернуться в режим редактирования? ',
'Message', 0);
Сравнение строк
Строки можно сравнивать друг с другом с помощью операций сравнения. Операции сравнения перечислены в таблице 1.3.
Таблица 1.3. Операции сравнения строк
Операция | Описание |
= | Равно |
<> | Не равно |
< | Меньше |
> | Больше |
<= | Не больше |
>= | Не меньше |
Сравнение строк основано на анализе кодов ASCII. Две строки считаются равными если они имеют одинаковую длину и содержат одинаковые последовательности символов. Операции «меньше – больше» используют для сортировки строк в алфавитном порядке. Чаще всего в программах применяется операции «равно – не равно»:
if FileName = 'TEST.TXT' then
OpenFile(FileName)
else
ReportError;
Строковые функции
Object Pascal предоставляет большой набор процедур и функций, предназначенных для выполнения различных операций над строками. Наиболее употребительные функции перечислены в таблице 1.4.
Таблица 1.4. Строковые процедуры и функции
Имя | Описание | Пример |
Copy | Возвращает подстроку | S := Copy(Source,Index,Count); S := Copy(’test.txt’,1,4); |
Delete | Удаляет часть строки | Delete(S,Index,Count); Delete(’test.txt’,5,4); |
Format | Форматирует строку | см. пример ниже |
Insert | Вставка подстроки в строку | Insert(Source, SubStr,Index); Insert(’testtxt’,’.’,5); |
IntToStr | Преобразует целое число в строку | Edit1.Text:= IntToStr(Width) |
Length | Возвращает число символов в строке | N := Length(Source); |
LowerCase | Преобразует все буквы строки в строчные | Name := LowerCase(Edit1.Text) |
Pos | Возвращает позицию подстроки в строке | K := Pos(SubStr,Source); K := Pos(’.’,FileName); |
StringOfChar | Возвращает строку, заполненную заданным символом | |
StrPas | Преобразует строку с терминальным нулем (PChar или array of Char) в строку типа string | const T : PChar=’0-строка’; var S : string; . . . . . . . . S := StrToPas(T); |
StrPCopy | Преобразует строку типа string в строку с терминальным нулем | const S = ’Обычная строка’; var T : PChar; T := StrPCopy(S); |
StrToInt | Преобразует строку в целое число | Width := StrToInt(Edit1.Text); |
StrToIntDef | Преобразует строку в целое число. Возвращает значение по умолчанию в случае ошибки | Width:= StrToIntDef(Edit1.Text,’120’); |
StrToXXX | Преобразование строки в специальный тип данных | var D,T : TDateTime; D := StrToDateTime(Edit1.Text) T := StrToTime(Edit1.Text); |
Trim | Удаляет из строки пробелы если они есть в ее начале и в конце | |
UpperCase | Преобразует все буквы строки в заглавные | FileName := UpperCase(Edit1.Text); |
XXXToSTr | Преобразование данных специальных типов в строку | Edit1.Text := DateTimeToStr(T) |
Дадим пояснения к функциям таблицы 1.4.
Функция StrToInt преобразует строку, содержащую текстовое представление целого числа в значение целого типа. Допустим, что на форме приложения имеется компонент редактирования (Edit), с помощью которого пользователь должен ввести значение целого числа. Компонент Edit работает только с текстом. Поэтому получить этот текст как значение целого числа следует так:
StepNo := StrToInt(Edit1.Text);
где StepNo – переменная типа integer.