Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Belova_TM

.pdf
Скачиваний:
56
Добавлен:
06.05.2015
Размер:
2.46 Mб
Скачать

Программирование в системе 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.Можно ли работать со строкой как с одномерным символьным массивом?