Для обробки текстів в Object Pascal використовуються символьні рядки таких типів:
· ShortString або String{N}, де N
255 – короткий рядок;
· String – довгий рядок;
· PChar – нуль-термінальний рядок,
· WideString – широкий рядок.
Приклади опису рядків у програмі:
Var Sk: ShortString; {короткий рядок максимальної} {довжини 255 символів}
Sks: String[5]; {короткий рядок}
{ довжиною до 5 символів}
Ss1, Ss2: String; {довгий рядок}
Sp: Pchar; {нуль-термінальний рядок}
Sw: WideString; {широкий рядок}
Довжина короткого рядка від 0 до 255 байтів, а довгого, нуль-термінального і широкого рядків від 0 до 2 Гбайтів.
Для описаного в програмі короткого рядка Sk компілятор виділить у статичній пам’яті 256 байтів з номерами від 0 до 255, а для Sks відповідно 6 байтів. У нульовому байті знаходиться поточна довжина рядка, а починаючи з першого байта розміщується ланцюжок символів. Так як у байт можна записати максимальне число 255, то довжина короткого рядка не може перевищувати 255. При виконанні оператора Sk:=’Рядок символів’; у нульовий байт буде записана довжина – 14, а з першого байта розміститься ланцюжок символів. Якщо довжина рядка символів перевищує описану довжину, то лишні символи втрачаються. Так, при виконанні оператора Sks:=’Рядок символів’; змінна Sks отримає значення – ’Рядок’
Описаний у програмі довгий рядок Ss1 розміщуватиметься у динамічній пам’яті. При цьому, компілятор виділить для змінної Ss1 у статичній пам’яті 4 байти, в які запишеться адреса виділеної динамічної пам’яті. Тобто, змінна Ss1 буде вказівником на цю пам’ять.
Динамічна пам’ять виділяється операційною системою під час виконання в програмі оператора, який присвоює динамічній змінній значення: рядок символів. Структура цієї пам’яті така: кількість байтів для розміщення рядка символів, байт для символа #0 і чотири байти для лічильника посилань. Наприклад, при виконанні оператора Ss1:=’Рядок символів’; необхідний розмір пам’яті 14+5=19 байтів і операційна система виділить у динамічній пам’яті область із 19 байтів і в змінну Ss1 помістить її адресу. У виділеній пам’яті, починаючи з першого байта, розмістить символи – Рядок символів, термінальний нуль – #0, а в лічильник посилань занесе одиницю.
Лічильник посилань використовується для кешування пам’яті. Так, при виконанні оператора Ss2:=Ss1; пам’ять для розміщення змінної Ss2 не виділяється, а їй присвоюється значення вказівника Ss1 і лічильник посилань збільшується на одиницю. Отже, обидві змінні Ss1 і Ss2 вказуватимуть на одну і ту ж область пам’яті. Якщо після цього змінюється значення змінної Ss1, наприклад, виконується оператор Ss1:=’Це–’ + ’Рядок символів’;, то лічильник посилань зменшиться на одиницю, у динамічній пам’яті виділиться нова область із 19+5=24 байтів і у Ss1 поміститься її адреса. У виділеній пам’яті, починаючи з першого байта, розміститься ланцюжок символів – ’Це – Рядок символів’, термінальний нуль – #0 і лічильник посилань із значенням – 1. Тепер змінні Ss1 і Ss2 вказують на різні області пам’яті, а лічильники посилань будуть містити по одиниці. Виділена для розміщення довгого рядка String область пам’яті звільняється, якщо лічильник посилань стає рівним нулю.
Подібно здійснюється робота з пам’яттю для нуль-термінальних рядків типу Pchar. Лічильник посилань тут не використовується, тому для кожного рядка виділяється окрема область пам’яті. Нуль-термінальні рядки використовуються при зверненні до API-функцій Windows (API – Application Program Interface – інтерфейс прикладних програм). Оскільки компоненти Delphi беруть на себе всі проблеми зв’язку з API-функціями, то програмісту рідко доводиться звертатися до нуль-термінальних рядків.
Однобайтові символи коду ASCII мають 256 можливих значень, достатніх для відображення будь-якої європейської мови, однак для мов народів світу цього недостатньо. Тому міжнародна комісія виробила код Unicode, символи якого займають у пам’яті два байти і мають 65536 можливих значень. Цей код дозволяє зображувати всі символи всіх мов світу. Символи Unicode описуються стандартним типом WideChar, а складені з них рядки – типом WideString. Усі програми, що використовують OLE-технологію обміну рядками, повинні використовувати символи Unicode.
Звернення до окремих символів рядка здійснюється за допомогою індекса. При виконанні операторів
Ss1:=’Рядок символів’; Ss1[4]:=’к’; Ss1[5]:=’и’;
змінна Ss1 отримає значення – ’Рядки символів’. Нумерація символів у коротких і довгих рядках починається з одиниці, а в нуль-термінальних з нуля.
Над символьними рядками можуть виконуватися операції:
· конкатенація (зчеплення рядків) – (+);
· відношення – (=, <>, <, >, <=, >=).
Наприклад, при виконанні оператора
Ss1:=’Це – ’ + ’Рядок’ + ’символів’;
змінна Ss1 отримає значення – ’Це – Рядок символів’.
Операції відношення виконуються над двома рядками посимвольно, зліва направо з урахуванням внутрішнього кодування символів. Якщо один рядок коротший, то він доповнюється символами #0. Результат операції відношення бульового типу. Наприклад,
‘A’ < ‘B’ – true;
‘A’ < ‘1’ – false;
‘Object’ < ‘Object Pascal’ – true;
‘Пас’ > ‘Pascal’ – true.
Всі останні дії над рядками і символами реалізуються за допомогою стандартних процедур і функцій, які наведені в додатку.
Приклад. Задано текст, слова в якому розділені пробілами і розділовими знаками. Розробити програму, яка вилучає з цього тексту всі слова з подвоєнням літер.
Для розв’язання задачі командою File|New Application створимо новий проект. На екрані з’явиться чиста форма з заголовком Form1. Присвоїмо цій формі заголовок Caption = Символьні дані.. Тепер командою File!Save All запишемо програмний модуль під іменем ULAB7_1.pas, а проект – PLAB7_1.dpr.
На формі розмістимо один компонент Edit для введення початкових даних і другий для виведення результатів.
Крім цього, розмістимо на формі дві керуючих кнопки (компонент Button) з написами Виконати та Вихід Рис. 7.1.
Обробник кнопки Виконати міститься у програмному модулі ULAB7_1:

Рис. 7.1. Форма Символьні дані
{ Обробник кнопки Виконати }
procedure Tform1.Button1Click(Sender: TObject);
CONST m=[' ',',',';','.','!','?',':'];
VAR s: string;
p, i, j: integer;
f: boolean;
BEGIN
{Введення початкових даних}
s:=Edit1.Text;
{Пошук і вилучення слів з подвоєнням букв}
i:=1;
repeat
{Пошук початку слова}
while (s[i] in m) and (i <= length (s)) do
i:=i+1;
if i > length (s) then Continue;
p:=i;
{Пошук кінця слова}
while not (s[i] in m) and (i <= length (s)) do
i:=i+1;
{Перевірка умови подвоєння букв}
j:=p; f:=false;
while (j <= i-2) and (not f) do
if s[j]=s[j+1] then f:=true else j:=j+1;
{Вилучення слів з подвоєнням букв }
{Корекція параметра циклу і}
if f then begin delete (s, p, i-p); i:=p; end;
until i >= length (s);
{Виведення перетвореного тексту}
Edit2.Text:=s;
end;
Розробка програми завершена. Тепер командою Run|Run проект можна запустити на виконання. Після завершення компіляції потрібно ввести початкові дані і натиснути кнопку Виконати. Для завершення роботи програми потрібно натиснути кнопку Вихід.