Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delfi__Osnovy_programmirovania.doc
Скачиваний:
245
Добавлен:
12.04.2015
Размер:
8.98 Mб
Скачать

9. Программирование в системе Delphi с помощью строк

Целью данного раздела является изучение разновидностей строк, получения навыков описания, ввода, вывода и обработки строк.

Типы строк

Для обработки текстов в Object Pascalиспользуются следующие типы:

  • короткая строкаShortStringилиString[N], где N <= 255;

  • длинная строка StringилиAnsiString;

  • широкая строкаWideString;

  • нуль-терминальная строкаPChar.

Общим для этих типов является то, что каждая строка трактуется как одномерный массив символов, количество символов в котором может меняться в работающей программе: дляShortString– от 0 до 255; дляString[N] длина строки меняется от 0 до N; дляString, WideString иPChar− от 0 до 2 Гбайт.

Тип Stringимеет разный смысл в зависимости от директивы компилятора $H. Если включена директива {$H+} (она включена по умолчанию), тоStringинтерпретируется компилятором как типAnsiString− длинная строка. Если же включить директиву {$H-}, тоStringинтерпретируется компилятором как типShortString− короткая строка.

Если в объявлении типа после ключевого слова Stringследует число символов в квадратных скобках (например,String[4]), то, независимо от директив компилятора, тип трактуется как короткая строка с указанным числом символов.

Для объявления короткой строки максимальной длины может использоваться стандартный тип ShortString (эквивалентно String [255]).

При объявлении короткой строки компилятор выделяет для ее размещения на один байт больше (добавляется нулевой байт) и помещает в нулевой байт текущую длину строки.

В коротких и длинных строках используются однобайтовые символы ANSI. Однобайтный символ связан с одним из 256 возможных значений, которые трактуются в зависимости от установленной вWindowsнациональной страницы. 256 символов вполне достаточно для отображения национального алфавита любого европейского языка.

ВDelphiвведены такжеширокиестроки, объявляемые стандартным типомWideString. По своим свойствам они идентичны длинным строкамString, но отличаются от них тем, что для представления каждого символа используются не один, а два байта.

Для отображения алфавита некоторых азиатских языков 256 символов недостаточно. В этом случае используются двухбайтные символы кода Unicode, в котором младший байт обычно кодируется семибитнымANSI– кодом, а старший указывает, как должен трактоваться этот код. СимволUnicodeв памяти занимает одно двухбайтовое слово, которое имеет 65536 возможных значений. С помощью этого кода можно представить все символы всех языков мира. Двухбайтные символы Unicode объявляются стандартным типомWideChar, а составленные из них строки – типомWideString.

Короткие, длинные и широкие строки нумеруются с 1.

Нуль-терминальные строки представляют собой цепочки символов, ограниченные символом #0. Максимальная длина такой строки лимитируется только доступной памятью и может быть очень большой. Нуль-терминальные строки нумеруются с 0. В нуль-терминальных строках используются однобайтовые символыANSI. Необходимость в нуль-терминальных строках возникает при прямом обращении кАРI-функциям ОС. При работе с компонентамиDelphiв основном используются более удобные длинные строки.

Примеры объявлений строковых типов:

var

swS:WideString; // широкая строка

pcS: PChar; // нуль-терминальная строка

acS: array [0. .1000] of Char; // строка длиной до 1000 символов

ssS: String [250]; // короткая строка длиной до 250 символов

ssMax: ShortString; // короткая строка длиной до 255 символов

stS: String; //длинная строка

При объявлении длинной строки stS компилятор выделит для переменной 4 байта, достаточные для размещения адреса той ячейки памяти, начиная с которой будет фактически располагаться символьная строка. Говорят, что stS ссылается на строку. Такого рода переменные-ссылки называются указателями.

При объявлении переменной pcS типаPCharкомпилятор считает эту переменную указателем и выделит для нее 4 байта.

Операции над строками

К строкам можно применять операцию «+» − конкатенации (сцепление или объединение) строк. Например:

stS:= ‘a’ +’b’; //stSсодержит "ab"

stS:=stS+ ‘c’; //stSсодержит "abc"

Операции отношения =, <>, >, <, >=, <= выполняются над двумя строками посимвольно, слева направо, с учетом внутренней кодировки символов. Если одна строка меньше другой по длине, недостающие символы более короткой строки заменяются значениемChr(0). ФункцияChr(0) преобразует целочисленный аргумент к эквивалентному символу в соответствии с кодовой таблицей. ФункцияChr(0) и #0 обозначают один и тот же символ. Результаты операций отношения приведены ниже (табл.9.1).

Таблица 9.1

Операции отношения со строками

Значение S

Значение S1

S>S1

S>=S1

S<S1

S<=S1

S=S1

S<>S1

abc’

abc’

false

true

false

true

true

false

abcd’

abc’

true

true

false

false

false

true

bac’

abc’

true

true

false

false

false

true

Текущую длину строки можно получить с помощью функции Length. Со строками можно работать как с одномерными символьными массивами:

n:=0;

for k:=1 to Length(s) do

if s[k] in [0..9] then n:=n+1;

В данном примере осуществляется подсчет количества символов цифр в строке. Операция inпроверяет принадлежность символа строкиs[k] множеству целых чисел [0..9].

В следующем примере уничтожаются все ведомые (хвостовые) пробелы в длинной строкеstS:

while (Length(stS) <> 0) and (stS [Length(stS)] = ’ ‘) do

SetLength (stS, Length (stS) –1);

Стандартная процедура SetLength устанавливает новую длину строки stS.

Многострочные окна редактирования Memo и RichEdit

Компоненты MemoиRichEditявляются окнами редактирования многострочного текста. Они так же, как и компонентаEdit, снабжены многими функциями, свойственными большинству редакторов. При редактировании текста можно использовать «горячие» клавиши:

  1. Ctrl-C– копирование выделенного текста в буфер обмена;

  2. Ctrl-X– вырезание выделенного текста в буфер обмена;

  3. Ctrl-V– вставка текста из буфера обмена;

  4. Ctrl-Z– отмена последней команды редактирования.

В компоненте Memoтекст выравнивается с помощью свойстваAligment, значения которого могут быть следующими:

  1. taLeftJustify; // выравнивается по левой границе (по умолчанию);

  2. taСenter; // выравнивается по центру;

  3. taRightJustify;// выравнивается по правой границе.

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

Для доступа ко всему содержимому Memo используется свойствоTextтипаTString. Для доступа к отдельным строкам используется свойствоLinesтипаTstring:

Memo1.Lines[5]:=’abc’;

Очистить Memo можно методомClear:

Memo1.Clear;

Добавить строку можно с помощью метода Add:

Memo1.Lines.Add(‘abc’);

Компонента Memoможет реагировать на нажатие клавиши <Enter> при значении свойстваWantReturns типа Boolean,равное True. Это значение установлено по умолчанию. Число строк вMemo хранится в свойствеCount(свойство только для чтения).

Компонента RichEditработает с текстом в обогащенном форматеRTF. При желании изменить атрибуты вновь вводимого фрагмента текста можно задать свойствоSelAttributes. Это свойство типаTTextAttributes, которое в свою очередь имеет подсвойства:Color(цвет),Name(имя шрифта),Size(размер),Style(стиль) и др. В компоненте имеется также свойствоDefAttributes, содержащее атрибуты по умолчанию. Эти атрибуты действуют до того момента, когда изменяются атрибуты в свойствеSelAttributes. Но значения атрибутов вDefAttributesсохраняются и в любой момент могут быть методомAssignприсвоены атрибутам свойстваSelAttributes, чтобы вернуться к прежнему стилю. За выравнивание, отступы и т.д. в пределах текущего абзаца отвечает свойствоParagraphтипаTParaAttributes. Этот тип в свою очередь имеет ряд свойств, которые можно задавать только в процессе выполнения приложения, например в обработчике события при щелчке на какой-нибудь кнопке. Значение подсвойств свойстваParagraphотносятся к тому абзацу, в котором находится курсор. Например, каждый из следующих операторов осуществит соответствующее выравнивание текущего абзаца:

RichEdit1. Paragraph. Aligment:=taLeftJustify; // влево

RichEdit1. Paragraph. Aligment:=taСenter; // по центру

RichEdit1. Paragraph. Aligment:=taRightJustify; // вправо

Основное свойство окон Memo и RichEditLines, содержащее текст окна в виде списка строк и имеющее тип TStrings. Начальное значение текста можно установить в процессе проектирования, нажав кнопку с многоточием около свойстваLinesв окне Инспектора объектов. Перед вами откроется окно редактирования списка строк. Вы можете редактировать и вводить текст непосредственно в этом окне либо нажать кнопкуCodeEditorи работать в обычном окне Редактора кода. В этом случае, завершив работу с текстом, выберите из контекстного меню, всплывающего при щелчке правой кнопки мыши, команду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; index, Count: integer): String;

Копирует из строки St Count символов, начиная с символа с номером Index

procedure Delete (St: String; index, Count: Integer);

Удаляет Count символов из строки St, начиная с символа с номером Index

procedure Insert (SubSt: String; St, index: Integer);

Вставляет подстроку SubSt в строку St, начиная с символа с номером Index

function Length (St: String) : integer;

Возвращает текущую длину строки St

function Pos (SubSt, St: String): integer;

Отыскивает в строке St первое вхождение подстроки SubSt и возвращает номер позиции, с которой она начинается. Если подстрока не найдена, возвращается ноль

procedure SetLength (St: String; NewLength: Integer);

Устанавливает новую (меньшую) длину NewLengh строки St. Если NewLengh больше текущей длины строки, обращение к SetLength игнорируется

Таблица 9.3

Подпрограммы преобразования строк в другие типы

Процедура или функция

Пояснение

function StrToCurr (St: String): Currency;

Преобразует символы строки St в число типа Currency. Строка не должна содержать ведущих или ведомых пробелов

function StrToDate (St: String): 'ГdateTime;

Преобразует символы строки St в дату. Строка должна содержать два или три числа, разделенных правильным для Windows разделителем даты (в русифицированной версии таким разделителем является <.>). Первое число – правильный день, второе – правильный месяц. Если указано третье число, оно должно задавать год в формате XX или ХХХХ. Если символы года отсутствуют, дата дополняется текущим годом. Например, DateToStr(StrToDate ('28.06')) даст строку '28 .06. 09'

function StrTоDateTime (St: String): TdateTime;

Преобразует символы строки St в дату и время. Строка должна содержать правильную дату (см. StrToDate) и правильное время (см. StrToTime), разделенные пробелом, например:

StrToDateTime('28.06 18:23')

function StrToFloat (St: String): Extended;

Преобразует символы строки St в вещественное число. Строка не должна содержать ведущих или ведомых пробелов

function StrToInt (St: String): Integer;

Преобразует символы строки St в целое число. Строка не должна содержать ведущих или ведомых пробелов

function StrTolntDef (St: String; Default: Integer): Integer;

Преобразует символы строки St в целое число. Если строка не содержит правильного представ­ления целого числа, возвращается значение Default

functiton StrTOIntRange (St: String; Min, Max: LongInt) : LongInt;

Преобразует символы строки St в целое число и возбуждает исключение ERangeError, если число выходит из заданного диапазона Min...Max

Окончание табл. 9.3

Процедура или функция

Пояснение

function StrToTime (St: String): TdateTime;

Преобразует символы строки St во время. Строка должна содержать два или три числа, разделенных правильным для Windows, разделителем времени (для русифицированной версии таким разделителем является < >). Числа задают часы, минуты и, возможно, секунды. За последним числом через пробел могут следовать символы <am> или <pm>, указывающие на 12-часовой формат времени

Procedure Val (St: String; var X;Code: lnteger);

Преобразует строку символов во внутреннее представление целой или вещественной переменной X, которое определяется типом этой переменной. Параметр Code содержит ноль, если преобразование прошло успешно, и тогда в Х помещается результат преобразования, в противном случае он содержит номер позиции в строке St, где обнаружен ошибочный символ, и в этом случае содержимое X не меняется. В строке St могут быть ведущие и/или ведомые пробелы

Таблица 9.4

Подпрограммы обратного преобразования

Процедуры и функции

Пояснения

function DateToStr (Value: TDateTime): String;

Преобразует дату из параметра Value в строку символов

function DateTimeToStr (Value: TdateTime): String;

Преобразует дату и время из параметра Value в строку символов

procedure DateTimeToString (var St: String; Format: String; Value: TdataTime); .

Преобразует дату и время из параметра Value в строку St в соответствии со спецификаторами параметра Format

function FormatDateTime (Format: String; Value: TDateTime): String;

Преобразует дату и время из параметра Value в строку символов в соответствий со спецификаторами параметра Format

function FloatToStr (Value: Extended): String;

Преобразует вещественное значение Value в строку символов

Окончание табл. 9.4

Процедуры и функции

Пояснения

function FloatToStrF (Value: Extended; Format: TFIoatFormat; Precision, Digits: Integer): String;

Преобразует вещественное значение Value в строку символов с учетом формата Format и параметров Precision и Digits

function FormatFloat (Format: String; Value: Extended): String;

Преобразует вещественное значение Value в строку символов с учетом спецификаторов формата Format (см. пояснения ниже)

function IntToStr (Value: In­teger) : String;

Преобразует целое значение Value в строку символов.

function TimeToStr (Value: TdateTime): String;

Преобразует время из параметра Value в строку символов

procedure Str(X [:Width [:Decimals]]; var St: String);

Преобразует число X любого вещественного или целого типа в строку символов 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)

Окончание табл. 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

am/pm

Отображает время в 12-часовом формате (am – до полудня, рm – после полудня). Для спецификаторов hh: mm am/pm получим 07: 45 pm

ampm '

Отображает время в 12-часовом формате, но без указания до/после полудня. Для спецификаторов hh:mm ampm получим 07: 45

a/p

Отображает время в 12-часовом формате а – до полудня, 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 мин.

Таблица 9.6

Подпрограммы для работы с нуль-терминальными строками

Процедура или функция

Пояснение

function CharToOem (Str, OemStr: Pchаr): Bool;

Преобразует символы строки Str из кодировки ANSI в кодировку DOS и помещает результат в OemStr. Всегда возвращает True

function ChàrToOemBuff (Str, OemStr: PChàr; MаxLen: LongInt): Bool;

Преобразует не более MaxLen символов cтроки Str из кодировки ANSI в кодировку DOS и помещает результат в OemStr. Всегда возвращает True

function StrCаt(Dest, Source: PChаr): PChаr;

Копирует строку Source в конец строки Dest и возвращает указатель на строку Dest

function StrComp (Strl, Str2: PChаr): Integer;

Побайтно сравнивает строку Str1 со строкой Str2 и возвращает следующий результат: =0 для Str1=Str2; > 0 для Str1 > Str2; < 0 для Str1 < Str2

function StrCopy(Dest, Source: PChаr): PChаr;

Копирует строку Source в строку Dest и возвращает указатель на Dest. StrCopy не проверяет реальный размер памяти, связанный с Dest (он должен быть не меньше StrLen (Source )+1)

procedure StrDispose (Str: PChаr);

Удаляет строку Str из памяти. Строка должна быть предварительно помещена в память функцией 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: PChàr; MaxLen: Word): PChàr;

Копирует символы строки Source в конец строки Dest до тех пор, пока не будут скопированы все символы или когда длина сцепленной строки Dest не достигнет MaxLen. Возвращает указатель на сцепленную строку. В отличие от StrCopy эта функция блокирует возможное переполнение области памяти, связанной с Dest. Обычно в качестве MaxLen используется выражение SizeOf(Dest)-l

Продолжение табл. 9.6

Процедура или функция

Пояснение

function StrLComp(Dest, Source: Pchаr; MaxLen: Word): Pchаr;

В отличие от StrComp сравнивает не более MaxLen сим­волов строк. Возвращаемый результат такой же, как и у StrComp

function StrLCopy ( Dest, Source: PChàr; MàxLen: Word): PChаr;

Копирует символы из строки Source в строку Dest до тех пор, пока не будет скопирована вся строка или пока не будет скопировано МaxLеn символов. В отличие от StrCopy блокирует возможность переполнения области памяти, связанной с Dest. В качестве MaxLen обычно используется выражение SizeOf(Dest)-l

function StrLen(Str: PChаr): Cardinal;

Возвращает длину строки

function StrLIComp(Strl, Str2: PChаr; MаxLen: Word): PChаr;

Сравнивает не более MaxLen символов строк, проверяя точное соответствие высоты букв. Возвращаемый результат см. StrСomр. Функция правильно работает только с латиницей.

function StrLower(Str: PChàr): PChаr;

Преобразует заглавные буквы строки Str к строчным и возвращает указатель на результат. Функция правильно работает только с латиницей

function StrMove(Dest, Source: PChаr; Count: Word): Pchàr;

Копирует точно Count символов строки Source в строку Dest и возвращает указатель на результат. Функция игнорирует действительные размеры строк и может выйти за их пределы

function StrNew(Str: PChаr): Pchar;

Помещает строку в память

function StrPas(Str: PChàr): String;

Преобразует нуль-терминальную строку в строку String

function StrPCopy(Str: PChаr; S: String); PChar;

Преобразует строку String в нуль-терминальную строку. Возвращает указатель на Str

function StrPos(Strl, Str2: PChàr): PChàr;

Ищет подстроку Str2 в строке Str1 и возвращает указатель на первое вхождение Str2 или NIL, если подстрока не найдена

function StrRScan(Str: PChar; Ch: Chàr): PChàr;.

Ищет символ Ch в строке Str и возвращает указатель на последний обнаруженный символ Ch или NIL, если символ не найден

function StrScan(Str: PChar; Ch: Char): Pchar;

Ищет символ Ch в строке Str и возвращает указатель на первый обнаруженный символ Ch или NIL, если символ не найден

Окончание табл. 9.6

Процедура или функция

Пояснение

function StrUpper (Str: PChar): PChаr;

Преобразует строчные буквы строки Str к заглавным и возвращает указатель на результат. Функция правильно работает только с латиницей

function OemToChаr (OEMStr, Str: Pchar): Bool;

Преобразует символы из кодировки DOS в кодировку ANSI и возвращает Truе

function OemToCharBuff (OEMStr, Str: PChаr; MaxLen: LongInt): Bool;

Преобразует не более MaxLen символов строки OemStr из кодировки DOS в кодировку ANSI и помещает результат в Str. Всегда возвращает True

Пример программирования с использованием строк

Задание. Дана последовательность из 50 литер (строчных латинских букв, цифр). Напечатать этот текст, заменяя все цифры «9» – русской «x», а остальные входящие в него цифры – звездочкой.

Значения используемых компонент для программного интерфейса показаны ниже (табл. 9.7).

Таблица 9.7

Используемые компоненты

Компонента

Свойство

Значение

Form1: TForm

Name

Caption

Form1

Работа со строками

Button1: TButton

Name

Caption

Button1

Преобразовать

Button2: TButton

Name

Caption

Button1

Выход

Label1: TLabel

Name

Caption

Label1

Введите строку

Edit1: TEdit

Name

Text

Edit1

отсутствует

Edit2: TEdit

Name

Text

Edit2

отсутствует

1. Разработка алгоритма (рис. 9.1):

а) исходные данные: 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; //кнопка «выход»

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]