Belova_TM
.pdfПрограммирование в системе Delphi с помощью строк |
161 |
выберите из контекстного меню, всплывающего при щелчке правой кнопки мыши, команду Close Page и ответьте утвердительно на вопрос, хотите ли вы сохранить текст в соответствующем свойстве окна редактирования.
Сохранение текста в файле осуществляется методом SaveToFile, а загрузка текста из файла – LoadFromFile:
Memo1.SaveToFile (‘myfile.txt’);
Memo1. LoadFromFile (‘myfile.txt’);
RichEdit1.SaveToFile (‘myfile1.rtf’);
RichEdit1.LoadFromFile (‘myfile1.rtf’);
Справочные данные
Действия над строками и символами реализуются с помощью большого набора стандартных процедур и функций. В таблицах 9.2 – 9.6 приведены описания процедур и функций (в квадратных скобках указываются необязательные параметры).
|
Таблица 9.2 |
Процедуры и функции для работы со строками |
|
|
|
Процедура или функция |
Пояснение |
|
|
function Concat (SI [ , S2, ..., |
Возвращает строку, представляющую собой |
SN] : String) : String; |
сцепление строк-параметров S1, S2, ..., SN |
function Copy (St: String; |
Копирует из строки St Count символов, начи- |
index, Count: integer): String; |
ная с символа с номером Index |
procedure Delete (St: String; |
Удаляет Count символов из строки St, начиная |
index, Count: Integer); |
с символа с номером Index |
procedure Insert (SubSt: String; |
Вставляет подстроку SubSt в строку St, начи- |
St, index: Integer); |
ная с символа с номером Index |
function Length (St: String) : |
Возвращает текущую длину строки St |
integer; |
|
function Pos (SubSt, St: |
Отыскивает в строке St первое вхождение |
String): integer; |
подстроки SubSt и возвращает номер позиции, |
|
с которой она начинается. Если подстрока не |
|
найдена, возвращается ноль |
procedure SetLength (St: |
Устанавливает новую (меньшую) длину |
String; NewLength: Integer); |
NewLengh строки St. Если NewLengh больше |
|
текущей длины строки, обращение к |
|
SetLength игнорируется |
162 |
Программирование в системе Delphi с помощью строк |
|
Таблица 9.3 |
|
Подпрограммы преобразования строк в другие типы |
||
|
|
|
Процедура или функция |
Пояснение |
|
|
|
|
function StrToCurr (St: |
Преобразует символы строки St в число типа |
|
String): Currency; |
Currency. Строка не должна содержать веду- |
|
|
щих или ведомых пробелов |
|
|
|
|
function StrToDate (St: |
Преобразует символы строки St в дату. Строка |
|
String): 'ГdateTime; |
должна содержать два или три числа, разде- |
|
|
ленных правильным для Windows разделите- |
|
|
лем даты (в русифицированной версии таким |
|
|
разделителем является <.>). Первое число – |
|
|
правильный день, второе – правильный месяц. |
|
|
Если указано третье число, оно должно зада- |
|
|
вать год в формате XX или ХХХХ. Если сим- |
|
|
волы года отсутствуют, дата дополняется те- |
|
|
кущим годом. Например, DateToStr(StrToDate |
|
|
('28.06')) даст строку '28 .06. 09' |
|
|
|
|
function StrTоDateTime (St: |
Преобразует символы строки St в дату и время. |
|
String): TdateTime; |
Строка должна содержать правильную дату |
|
|
(см. StrToDate) и правильное время (см. |
|
|
StrToTime), разделенные пробелом, например: |
|
|
StrToDateTime('28.06 18:23') |
|
|
|
|
function StrToFloat (St: |
Преобразует символы строки St в веществен- |
|
String): Extended; |
ное число. Строка не должна содержать веду- |
|
|
щих или ведомых пробелов |
|
|
|
|
function StrToInt (St: |
Преобразует символы строки St в целое число. |
|
String): Integer; |
Строка не должна содержать ведущих или ве- |
|
|
домых пробелов |
|
|
|
|
function StrTolntDef (St: |
Преобразует символы строки St в целое число. |
|
String; Default: Integer): In- |
Если строка не содержит правильного пред- |
|
teger; |
ставления целого числа, возвращается значение |
|
|
Default |
|
functiton StrTOIntRange (St: |
Преобразует символы строки St в целое число |
|
String; Min, Max: LongInt) : |
и возбуждает исключение ERangeError, если |
|
LongInt; |
число выходит из заданного диапазона |
|
|
Min...Max |
|
|
Программирование в системе Delphi с помощью строк |
163 |
|
|
|
|
Окончание табл. 9.3 |
||
|
Процедура или функция |
Пояснение |
|
|
|
|
|
|
|
|
function StrToTime (St: |
Преобразует символы строки St во время. |
|
|
|
String): TdateTime; |
Строка должна содержать два или три числа, |
|
|
|
|
разделенных правильным для Windows, разде- |
|
|
|
|
лителем времени (для русифицированной вер- |
|
|
|
|
сии таким разделителем является < >). Числа |
|
|
|
|
задают часы, минуты и, возможно, секунды. За |
|
|
|
|
последним числом через пробел могут следо- |
|
|
|
|
вать символы <am> или <pm>, указывающие |
|
|
|
|
на 12-часовой формат времени |
|
|
|
Procedure Val (St: String; |
Преобразует строку символов во внутреннее |
|
|
|
var X;Code: lnteger); |
представление целой или вещественной пере- |
|
|
|
|
менной X, которое определяется типом этой |
|
|
|
|
переменной. Параметр Code содержит ноль, |
|
|
|
|
если преобразование прошло успешно, и тогда |
|
|
|
|
в Х помещается результат преобразования, в |
|
|
|
|
противном случае он содержит номер позиции |
|
|
|
|
в строке St, где обнаружен ошибочный символ, |
|
|
|
|
и в этом случае содержимое X не меняется. В |
|
|
|
|
строке St могут быть ведущие и/или ведомые |
|
|
|
|
пробелы |
|
|
|
Таблица 9.4 |
|
Подпрограммы обратного преобразования |
||
|
|
|
Процедуры и функции |
Пояснения |
|
|
|
|
function DateToStr (Value: |
Преобразует дату из параметра Value в строку |
|
TDateTime): String; |
символов |
|
function DateTimeToStr |
Преобразует дату и время из параметра Value в |
|
(Value: TdateTime): String; |
строку символов |
|
procedure DateTimeToString |
Преобразует дату и время из параметра Value в |
|
(var St: String; Format: |
строку St в соответствии со спецификаторами |
|
String; Value: TdataTime); . |
параметра Format |
|
function FormatDateTime |
Преобразует дату и время из параметра Value в |
|
(Format: String; Value: |
строку символов в соответствий со специфика- |
|
TDateTime): String; |
торами параметра Format |
|
function FloatToStr (Value: |
Преобразует вещественное значение Value в |
|
Extended): String; |
строку символов |
|
164 |
Программирование в системе Delphi с помощью строк |
|
|
|
Окончание табл. 9.4 |
|
|
Процедуры и функции |
Пояснения |
||
function FloatToStrF (Value: Ex- |
Преобразует вещественное значение |
|||
tended; Format: TFIoatFormat; |
Value в строку символов с учетом форма- |
|||
Precision, Digits: Integer): String; |
та Format и параметров Precision и Digits |
|||
function FormatFloat (Format: |
Преобразует вещественное значение Value в |
|||
String; Value: |
|
строку символов с учетомспецификаторов |
||
Extended): String; |
|
формата Format (см. пояснения ниже) |
||
function IntToStr (Value: Integer) : |
Преобразует целое значение Value в стро- |
|||
String; |
|
ку символов. |
||
function TimeToStr (Value: |
Преобразует время из параметра Value в |
|||
TdateTime): String; |
строку символов |
|||
procedure Str(X [:Width |
Преобразует число X любого веществен- |
|||
[:Decimals]]; var St: String); |
ного или целого типа в строку символов |
|||
|
|
|
St; параметры Width и Decimals, если они |
|
|
|
|
присутствуют, задают формат преобразо- |
|
|
|
|
вания: Width определяет общую ширину |
|
|
|
|
поля, выделенного под соответствующее |
|
|
|
|
символьное представление вещественного |
|
|
|
|
или целого числа X, a Decimals − количе- |
|
|
|
|
ство символов в дробной части (этот па- |
|
|
|
|
раметр имеет смысл только в том случае, |
|
|
|
|
когда X − вещественное число) |
|
|
В примерах таблицы 9.5 показаны строки для времени 19 ч |
|||
45 мин и даты 8 июня 2009 г. |
|
|
||
|
|
|
Таблица 9.5 |
|
|
Спецификаторы формата даты/времени |
|||
|
|
|
|
|
|
Спецификаторы |
|
Пояснения |
|
|
c |
Отображает сначала дату в формате дд.мм.гг, затем через |
|
|
|
пробел время в формате чч.мм.сс: 08.06.09 19:45 |
|
||
|
|
|
||
|
d |
Отображает день без ведущего нуля: 8 |
|
|
|
dd |
Отображает день с ведущим нулем: 08 |
|
|
|
dddd |
Отображает день недели: воскресенье (для нерусифици- |
|
|
|
рованной версии-Windows-sunday) |
|
||
|
|
|
||
|
ddddd |
Отображает дату в формате дд.мм.гг: 08.06.09 |
|
|
|
dddddd |
Отображает дату в формате день Месяц год: 8 Июнь 2009 |
|
|
|
(для нерусифицированной версии Windows – 8 June 2009) |
|
||
|
|
|
Программирование в системе Delphi с помощью строк |
165 |
|
|
Окончание табл. 9.5 |
|
Спецификаторы |
Пояснения |
|
|
|
|
m |
Отображает число месяца без ведущего нуля: 6 |
|
mm |
Отображает число месяца с ведущим нулем: 06 |
|
|
|
|
mmm |
Отображает сокращенное название месяца: июнь |
|
mmmm |
Отображает полное название месяца: Июнь |
|
|
|
|
у или yy |
Отображает две последние цифры года: 09 |
|
|
|
|
yyy или yyyy |
Отображает все цифры года: 2009 |
|
|
|
|
h |
Отображает час без ведущего нуля: 19 |
|
|
|
|
hh |
Отображает час с ведущим нулем: 19 |
|
n |
Отображает минуты без ведущего нуля: 45 |
|
|
|
|
nn |
Отображает минуты с ведущим нулем: 45 |
|
|
|
|
s |
Отображает секунды без ведущего нуля: 0 |
|
|
|
|
ss |
Отображает секунды с ведущим нулем: 00 |
|
|
|
|
t |
Отображает время в формате чч:мм: 19: 45 |
|
|
|
|
tt |
Отображает время в формате чч:мм:сс: 19: 45: 00 |
|
|
Отображает время в 12-часовом формате (am – до полуд- |
|
am/pm |
ня, рm – после полудня). Для спецификаторов hh: mm |
|
|
am/pm получим 07: 45 pm |
|
|
|
|
|
Отображает время в 12-часовом формате, но без указания |
|
ampm ' |
до/после полудня. Для спецификаторов hh:mm ampm по- |
|
|
лучим 07: 45 |
|
|
Отображает время в 12-часовом формате а – до полудня, |
|
a/p |
p – после полудня). Для спецификаторов hh:mm a/p полу- |
|
|
чим 07: 45 p. |
|
|
|
|
/ |
Отображает используемый в Windows разделитель даты. |
|
Для спецификаторов d/m/y получим 8.6.09 |
|
|
|
|
|
: |
Отображает используемый в Windows разделитель време- |
|
ни. Для спецификаторов h:n:m получим 19:45:0 |
|
|
|
|
|
|
|
|
Любые другие символы, указанные в строке Format, а также заключенные в апострофы или кавычки специальные символыспецификаторы помещаются в выходную строку без преобразования, поэтому спецификаторы ‘h час n мин' дадут строку 19 час 45 мин, а 'h час «n мин» − 19 час n мин.
|
166 |
Программирование в системе Delphi с помощью строк |
|
|
|
|
|
Таблица 9.6 |
|
|
|
Подпрограммы для работы с нуль-терминальными строками |
|
|
|
|
|
|
|
|
Процедура или функция |
Пояснение |
|
|
|
|
|
|
|
|
function CharToOem (Str, |
Преобразует символы строки Str из кодировки |
|
|
|
OemStr: Pchаr): Bool; |
ANSI в кодировку DOS и помещает результат в |
|
|
|
|
|
OemStr. Всегда возвращает True |
|
|
function ChàrToOemBuff |
Преобразует не более MaxLen символов cтроки |
|
|
|
(Str, OemStr: PChàr; Mаx- |
Str из кодировки ANSI в кодировку DOS и поме- |
|
|
|
Len: LongInt): Bool; |
щает результат в OemStr. Всегда возвращает True |
|
|
|
function StrCаt(Dest, |
Копирует строку Source в конец строки Dest и |
|
|
|
Source: PChаr): PChаr; |
возвращает указатель на строку Dest |
|
|
|
function StrComp (Strl, |
Побайтно сравнивает строку Str1 со строкой Str2 |
|
|
|
Str2: PChаr): Integer; |
и возвращает следующий результат: =0 для |
|
|
|
|
|
Str1=Str2; > 0 для Str1 > Str2; < 0 для Str1 < Str2 |
|
|
function StrCopy(Dest, |
Копирует строку Source в строку Dest и возвра- |
|
|
|
Source: PChаr): PChаr; |
щает указатель на Dest. StrCopy не проверяет ре- |
|
|
|
|
|
альный размер памяти, связанный с Dest (он дол- |
|
|
|
|
жен быть не меньше StrLen (Source )+1) |
|
|
procedure StrDispose (Str: |
Удаляет строку Str из памяти. Строка должна |
|
|
|
PChаr); |
быть предварительно помещена в память функ- |
|
|
|
|
|
цией StrNew. Если Str=NlL, процедура ничего не |
|
|
|
|
делает |
|
|
function StrECopy(Dest, |
Объединяет строки. Эта функция работает в |
|
|
|
Source: Pchаr): PChàr; |
точности как StrCat, но возвращает указатель |
|
|
|
|
|
на конец сцепленных строк, т.е. на терминаль- |
|
|
|
|
ный ноль |
|
|
function StrEnd (Str: |
Функция возвращает указатель на терминальный |
|
|
|
PChàr): Pchàr;. |
ноль строки Str |
|
|
|
function StrIComp(Strl, |
Функция сравнивает строки, игнорируя возмож- |
|
|
|
Str2: PChаr): Pchаr; |
ную разницу в высоте букв. Возвращает такой же |
|
|
|
|
|
результат, как и StrComp. Функция правильно ра- |
|
|
|
|
ботает лишь с латиницей. Для кириллицы ее |
|
|
|
|
нужно модифицировать |
|
|
function StrLCаt(Dest, |
Копирует символы строки Source в конец строки |
|
|
|
Source: PChàr; MaxLen: |
Dest до тех пор, пока не будут скопированы все |
|
|
|
Word): PChàr; |
символы или когда длина сцепленной строки Dest |
|
|
|
|
|
не достигнет MaxLen. Возвращает указатель на |
|
|
|
|
сцепленную строку. В отличие от StrCopy эта |
|
|
|
|
функция блокирует возможное переполнение об- |
|
|
|
|
ласти памяти, связанной с Dest. Обычно в качестве |
|
|
|
|
MaxLen используется выражение SizeOf(Dest)-l |
|
Программирование в системе Delphi с помощью строк |
167 |
|
|
Продолжение табл. 9.6 |
|
|
|
|
Процедура или функция |
Пояснение |
|
function StrLComp(Dest, |
В отличие от StrComp сравнивает не более |
|
Source: Pchаr; MaxLen: |
MaxLen символов строк. Возвращаемый резуль- |
|
Word): Pchаr; |
тат такой же, как и у StrComp |
|
function StrLCopy ( Dest, |
Копирует символы из строки Source в строку Dest |
|
Source: PChàr; MàxLen: |
до тех пор, пока не будет скопирована вся строка |
|
Word): PChаr; |
или пока не будет скопировано МaxLеn симво- |
|
|
лов. В отличие от StrCopy блокирует возмож- |
|
|
ность переполнения области памяти, связанной с |
|
|
Dest. В качестве MaxLen обычно используется |
|
|
выражение SizeOf(Dest)-l |
|
function StrLen(Str: |
Возвращает длину строки |
|
PChаr): Cardinal; |
|
|
function StrLIComp(Strl, |
Сравнивает не более MaxLen символов строк, |
|
Str2: PChаr; MаxLen: |
проверяя точное соответствие высоты букв. Воз- |
|
Word): PChаr; |
вращаемый результат см. StrСomр. Функция пра- |
|
|
вильно работает только с латиницей. |
|
function StrLower(Str: |
Преобразует заглавные буквы строки Str к строч- |
|
PChàr): PChаr; |
ным и возвращает указатель на результат. Функ- |
|
|
ция правильно работает только с латиницей |
|
function StrMove(Dest, |
Копирует точно Count символов строки Source в |
|
Source: PChаr; Count: |
строку Dest и возвращает указатель на результат. |
|
Word): Pchàr; |
Функция игнорирует действительные размеры |
|
|
строк и может выйти за их пределы |
|
function StrNew(Str: |
Помещает строку в память |
|
PChаr): Pchar; |
|
|
function StrPas(Str: PChàr): |
Преобразует нуль-терминальную строку в строку |
|
String; |
String |
|
function StrPCopy(Str: |
Преобразует строку String в нуль-терминальную |
|
PChаr; S: String); PChar; |
строку. Возвращает указатель на Str |
|
function StrPos(Strl, Str2: |
Ищет подстроку Str2 в строке Str1 и возвращает |
|
PChàr): PChàr; |
указатель на первое вхождение Str2 или NIL, если |
|
|
подстрока не найдена |
|
function StrRScan(Str: |
Ищет символ Ch в строке Str и возвращает указа- |
|
PChar; Ch: Chàr): PChàr;. |
тель на последний обнаруженный символ Ch или |
|
|
NIL, если символ не найден |
|
function StrScan(Str: |
Ищет символ Ch в строке Str и возвращает указа- |
|
PChar; Ch: Char): Pchar; |
тель на первый обнаруженный символ Ch или |
|
|
NIL, если символ не найден |
|
168 |
Программирование в системе Delphi с помощью строк |
|
|
|
Окончание табл. 9.6 |
Процедура или функция |
Пояснение |
|
function StrUpper (Str: |
Преобразует строчные буквы строки Str к заглав- |
|
PChar): PChаr; |
ным и возвращает указатель на результат. Функ- |
|
|
|
ция правильно работает только с латиницей |
function OemToChаr |
Преобразует символы из кодировки DOS в коди- |
|
(OEMStr, Str: Pchar): Bool; |
ровку ANSI и возвращает Truе |
|
function OemToCharBuff |
Преобразует не более MaxLen символов строки |
|
(OEMStr, Str: PChаr; |
OemStr из кодировки DOS в кодировку ANSI и |
|
MaxLen: LongInt): Bool; |
помещает результат в Str. Всегда возвращает True |
Пример программирования с использованием строк
Задание. Дана последовательность из 50 литер (строчных латинских букв, цифр). Напечатать этот текст, заменяя все цифры «9»– русской «x», а остальные входящие в него цифры – звездочкой.
Значения используемых компонент для программного интерфейса показаны ниже (табл. 9.7).
|
|
|
Таблица 9.7 |
|
|
Используемые компоненты |
|||
|
|
|
|
|
Компонента |
|
Свойство |
Значение |
|
Form1: TForm |
|
Name |
Form1 |
|
|
|
Caption |
Работа со строками |
|
Button1: TButton |
|
Name |
Button1 |
|
|
|
Caption |
Преобразовать |
|
Button2: TButton |
|
Name |
Button1 |
|
|
|
Caption |
Выход |
|
Label1: TLabel |
|
Name |
Label1 |
|
|
|
Caption |
Введите строку |
|
Edit1: TEdit |
|
Name |
Edit1 |
|
|
|
Text |
отсутствует |
|
Edit2: TEdit |
|
Name |
Edit2 |
|
|
|
Text |
отсутствует |
|
1. Разработка алгоритма (рис. 9.1):
а) исходные данные: str – строка символов;
б) промежуточные данные: i – переменная целого типа, счетчик цикла;
в) результат: str – преобразованная строка.
Программирование в системе Delphi с помощью строк |
169 |
Str
Нет
Pos(‘9’,Str)>0
Да
Str[Pos(‘9’,
Str)]:=’x’
i:=1,length(Str)
Нет
Str[i] in [‘0’..’8’]
Да
Str[i]:=’*’
Str
Рис. 9.1. Схема алгоритма решения задачи
2. Текст программы: Unit Unit1;
Interface
Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls
type
TForm1=class (TForm)
Label1: TLabel; |
//комментарий к полю ввода |
Edit1: TEdit; |
//поле ввода строки |
Label2: TLabel; |
//комментарий к полю вывода |
Edit2: TEdit; |
//поле вывода измененной строки |
Button1: TButton; |
//кнопка «выполнить» |
Button2: TButton; |
//кнопка «выход» |
170 |
Программирование в системе Delphi с помощью строк |
Procedure Button2Click(Sender: TObject); //процедура, вызы-
ваемая
при щелчке на Button2
Procedure Button1Click(Sender: TObject); // процедура, вызы-
ваемая
при щелчке на Button1 private
{Private declarations} public
{Public declarations };
end;
var Form1: TForm1; implementation {$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject); begin
Close end;
procedure TForm1.Button1Click(Sender: TObject); { процедура,
заменяющая цифры '9' буквой 'х', а остальные символы – на '*'} var str: string;
i: integer;
begin
str:= Edit1.Text;
while pos (‘9’, str) > 0 do str[pos(‘9’, str)]:= ’х’;
for i=1 to Length(str) do
if str[i] in [‘0’..’8’] then str[i]:= ’*’;
Edit2.Text:= str; end;
end.
Контрольные вопросы к главе 9
1.Какие виды строк существуют в Delphi?
2.Опишите короткую строку, состоящую из 10 символов.
3.Можно ли работать со строкой как с одномерным символьным массивом?