Рядковий тип даних. Робота з символами та рядками. Вставка підрядка у рядок

п»їTrustworthy SEO Agency India Can Increase Revenues of Small Businesses

80% users search на Google і інші search engines перед тим, як purchase і більше 50% inquiries генерується через search engines get converted. Ці дві статистики випливають з важливості Search Engine Optimization. Там є багато таких статей і фактів, що робити clear point: будь-який маленький, мідний або великий простий бізнес потребує професійних SEO послуг. Малі businesses і startups often face budget issues. Вони можуть виявити будь-яке нестерпне SEO SEO агентства від Індії, щоб отримати велику SEO послуг у своєму бюджеті, щоб збільшити свої покарання.
Search holds a great impact on consumers' minds. З огляду на різні статуї shared by major search engine optimization experts on divers authorized website such as Search Engine Land, Moz, SEO Journal, Digital Marketers India, Hubspot, etc. SEO captures majority of the leads. Also, leads coming from the organic search results have higher conversion rate. Ці статки і consumer behavior Make clearer point that best SEO service is not luxury, but a necesity for any business.
Щобперейти до конкуренції і збільшення бізнесу зростає їх організація потребує використання Search Engine Optimization Services. Великі бригади можуть вносити гроші в провідні SEO послуги, що знаходяться в верхньому SEO компанії або SEO specialist, але малого бізнесу власників намагаються відповісти на якість цього сервісу до найменшого бюджету. Це досить значний факт малого бізнесу і startups end up leaving the opportunities, які можуть бути створені з професійним SEO service або використовувати cheap SEO service, які мають не позитивні результати.
Невеликі business owners і startups можуть отримати прибутки професійних SEO послуги навіть в обмеженому бюджеті. The best solution is finding a trustworthy SEO company based out of India. В Індії, є багато SEO фахівців, які працюють з цифровим маркетинговим агентством і забезпечать велику індустрію послуг. Вони можуть забезпечити вам необхідні SEO послуги в своєму бюджеті. Засоби можуть бути невідомі з SEO агентства India до того, щоб отримати послуги на низьких rates. However, Дон'т fall for cheap SEO service, що зменшує ганебні і загрожує, щоб зробити більше, як експертизи, які робили на свій власний капітал. Ви повинні повідомити portfolio або поставити загальні питання перед тим, як затвердити company for your business.
SEO experts в Індії є skilled with best practices search engine optimization. Також, є деякі SEO specialists в India так само як Ash Vyas, які спеціально в створенні кращого search engine optimization strategy for business in stated budget. The SEO profesionales буде створювати чіткий план і буде також share what can be the expected results. Це означає, що може бути приємною мірою для вашого investment and returns. Це helps in making a better business decision.
A good idea є find and contract trustworthy SEO company from India, що offers best SEO послуги як soonest as possible. Ви можете також запустити з маленьким бюджетом і обмеженими діями до запуску отримання ваших WebPages indexed and boosting ваші ключові слова в пошукових інструментах. Don't wait for perfect time or a day when you will have thousands dollars to invest in the best SEO services. Starting early will help you get quicker results when you can go aggressive with your marketing approach. Наскільки брудним SEO компанія заснована на Індії, щоб допомогти вам визначити ваші поточні і майбутні плани на сприятливі результати. Більше indexed pages boosted rankings і credible brand of your business made with continuous professional SEO practices will double inquiries, business, and revenues. Будь-який малий бізнес може запустити з двома digit investment в професійних SEO послуг. Є багато SEO агенцій в Індії, які мають низький бюджет є результат від oriented Search Engine Optimization services.

surveys from exile

  • CraigWew

    12.04.2018

    п'їThe Importance of Establishing Rapport With the Customer в Real Estate and General Sales

    Важливість встановлення rapport with customer.
    Розміщення rapport with customer has to earned and must be approached as very integral part of the sales process.
    У повідомленні, щоб отримати customers and yourself to relate on real one to one basis, involves two things!
    Перший, ви будете думати і бути! Second you must understand that there are two different stages that will occur during this process.
    A-Be there-what does that mean?
    o Most people don’t really listen to another person as they talk. Generally they are so busy formulating their next answer or statement that they couldn't possibly really listen.
    o If this sounds like you, being there means shut up and listen!
    B-What is the first or initial stage?
    o General you have just a few minutes to establish yourself in the customers mind as someone they want to deal with.
    o Коли в цій справі є кращим до перших запитань, що будуть витягнути їх звідти і говорити про нихсам.
    o It is also always safe to appear as a professional-I don't mean stoic or dry, but someone who knows what they are doing and talks and looks the part.
    C-Other stages
    o Як time goes on, through conversation and questions they will have, you will either establish your ability or not.
    o Be aware that they will probably be measuring you for a while. Хороші новини є, що на деякий час, якщо ви повинні бути успішним при встановленні rapport-they буде relax і ви можете бути concentrate on finding або selling the home.
    What else can help me develop rapport?
    o By trying до understand різних типів типів і вони беруть до себе і asking the right questions.
    o Якщо ви маєте гарний rapport (використовувати на тій самій воді, як покупець), то selling є basically over, now it’s just matter of finding the right home or filling out the listing papers.
    What about different personalities
    o Since this is not a book on psychiatry, для котрих є just understand два main types.
    o Там є занедбані і викинуті люди.
    o You know the type. Подумайте про трьох людей, які знають, що fit їх класифікація.
    What sobre body Language and speech patterns?
    o Якщо вони розмовляють швидко або повільно, намагаємося помітити свої частоти.
    o If they talk loud або soft, do the same. Чи є вони підписання або backward?
    o Needless to say, є багато книг, що написані на цьому предметі. Just be aware that it is important factor-especially when you're setting in conference room or at someone's home discussing a $400,000 deal.
    Розвиток rapport is a skill that can be learned and improved upon.
    o Все, що я маю змогу зробити salesson, що я можу скористатися і їсти, щоб бути приємним. The reason is he or she, зробили ви нестерпним комфортом до де ви trusted them.
    How do we develop rapport?
    o Use your eyes and ears and ask questions. To explain
    o Use the eyes:
    o Look at their dress-their car-their індивідуальні поssessions and I mean really look at them and decipher what that tells you about them.
    o Use the ears:
    o Потрібно, щоб вони могли і вирішити питання для того, щоб отримати з їхньої реальної зміни!
    Тепер під час всіх цих речей, вони будуть, можливо, один або два теми, які ви знаєте, що ви маєте в одному з ним. (Family, geographical areas, fishing, etc) Коли ви збираєтеся як загальний персонал, згодом вони знають вашу familiarity і будуть братися до хвилини до розмови з ним.
    What is the Goal?
    o Once they accept you as one of them you're in position to really have a great experience in the sale as you're now working together then as a team-you're no longer the salesman you're now in an advisory position .
    o Remember, the customer either will or will not allow you to enter his world. Якщо ви думаєте про це і реально працює hard to become empathetic with him/her, you can gain a position of trust. In most cases, you will actually see them relax (body language) when this happens you’re on the way.
    o To illustrate this have you ever given speech and noticed that as you finally connected with audience member they will nod in approval. Theth things може all seem trite but they aren’t.
    У closing, якщо ви можете їсти customers trust, selling aproduct or service is much easier and experience can be enoyable for everyone involved.
    Будь-який remember що Win/Win є best situion.

Символ

Символ – це один знак. Будь-який - буква, цифра, арифметичний знак або пробіл, розділовий знак або підкреслення... А також спеціальні символи – перехід на новий рядок, BackSpace, знак долара або відсоток. Тип "символ" у Delphi позначається Char:

ShowMessage("Ви ввели" + c);

ShowMessage("Перехід на новий" + c + "рядок");

Ми вже казали, що символи беруться із таблиці символів ANSIабо UNICODE. Більшість символів використовуються, деякі символи є службовими. Зверніть увагу, що велика літера "А" та маленька "а" - це різні символи! Також різними символами є латинська "с" та російська "с", хоча вони схожі, як дві краплі води.

Нульовий символ не використовується, він зарезервований як нуль. Програмісти знайшли гідне застосування цього символу, використовуючи його у подіях введення тексту, коли потрібно заборонити користувачеві введення будь-яких символів. Службові символи ми не можемо побачити у текстовому поле. Службові символи, це , <Enter>, <Tab> та інші. Кожен символ обробляється комп'ютером як число від 0 до 255, таким чином, слово"ПРИВІТ" у пам'яті машини буде виглядати як набір цифр: "207 208 200 194 197 210".

Функції роботи із символами

Насправді часто доводиться обробляти окремі символи. Змінним символьного типу Char можна надавати значення таким чином:

Оскільки для комп'ютера символ – число, символьні дані можна порівнювати між собою. При цьому більшим буде символ, число якого в таблиці символів більше. Наприклад, "я" буде більше, ніж "а":

if b > c then ShowMessage("Істина!")

else ShowMessage("Брехня!");

При роботі із символьними змінними часто використовують функції Chr() та Ord(). Функція Chr() приймає як параметр число, і повертає символ, який відповідає цьому числу в таблиці ANSI:

функція Chr (X: Byte): Char;

Функція Ord() робить прямо протилежну дію, вона приймає як параметр символ, і повертає число, під яким цей символ зберігається в таблиці ANSI:

функція Ord (C: Char): Byte;

Символьні змінні можна використовувати з цими функціями:

У першому рядку в змінну a ми записали символ "І", якому в таблиці символів відповідає номер 200. У другий, цілу змінну, ми записали число 200, оскільки символ із цим номером був записаний в змінну a, яку ми передали як параметр . Зрештою, у третьому рядку ми в цілу змінну записали число 102, цей номер відповідає символу "f".


Рядок

Рядок – це набір символів. Рядок можна подати у вигляді статичного або динамічного масиву символьних даних. Типи рядків ми вже розбирали в "Керуюча конструкція if, цикл for" : AnsiString – рядок з ANSI– символів, та WideString- Рядок з UNICODE - символів.

Тип String не є окремим типом, за умовчанням він дорівнює AnsiString. Однак його можна переналаштувати і на WideStringхоча в цьому немає необхідності. Тому сміливо вказуйте рядкові змінні, як String:

s:= "Це багаторядкова" + # 13 + "рядок";

Як видно з прикладу, рядок можна складати з кількох підрядків, і навіть додавати до нього окремі символи. У прикладі ми додали символ під номером 13, це символ переходу на новий рядок. В результаті виконання цього коду процедура ShowMessage () виведе на екран повідомлення, розбите на два рядки:

Це багаторядкова

ShortString- короткий рядок з ANSI- Символів. Може містити від 0 до 255 символів. Використовується нечасто. Власне, ви можете оголосити тип String із заздалегідь вказаним розміром:

Як бачите, рядок оголошується з числовим індексом, майже як масив. Власне, рядок символіві є масивсимвольних даних, і поводитися з нею можна також. Індексаціясимволів у рядку починається з одиниці, тобто індексу 1 відповідає 1-й символ рядка.

stroka: = "Привіт";

stroka: = "а"; //змінили 5-й символ рядка

ShowMessage(stroka); //Результат: рядок "Приват"

Це теж рядок, і в майбутньому нам доведеться з ним стикатися. Цей рядок працює зовсім інакше, ніж String. РядокString являє собою масивсимволів, у нульовому елементі якого міститься кількість байт, що відводяться під цей рядок. А зміннатипу PChar– це не сам рядок, а покажчикна початок рядка, тобто зміннавказує на перший символ рядка у пам'яті комп'ютера. А де ж тоді PCharзберігає кількість байтв рядку?! А ніде! Ми вже говорили про таблицю символів ANSI, і з'ясували, що нульовий символ – порожній. Ось останній символ PCharякраз і зберігає цей символ, і комп'ютер, знайшовши його, вважає, що рядок закінчено.

З рядками PCharпрацювати дуже незручно, однак нам доведеться це робити, коли ми будемо працювати з функціями WinAPI безпосередньо. Функції WinAPI – це функції самої Windows, а чи не Delphi. Проте Delphi дозволяє їх використовувати. Іноді це буває необхідно, наприклад, коли коштів Delphi замало виконання наміченої завдання. Використання таких функцій не завжди зручне, проте вони виконуються процесором набагато швидше, оскільки містяться в операційній системі. Приклад – функція MessageBox().

Ви вже звикли виводити повідомлення за допомогою функції Delphi ShowMessage()? Звикайте до нової функції!

Application.MessageBox("рядок 1", "рядок 2", [кнопки + тип_вікна]);

· Рядок 1 - виводить текст усередині вікна.

· Рядок 2 – текст у заголовку вікна.

Якщо не вказувати [кнопки + тип_окна], то вийде просте вікно з кнопкою ОК, як у функції ShowMessage().

Робота з рядками та символами

Обробка тексту - одне з найпоширеніших завдань програмування. Якщо потрібно обробити будь-які текстові дані, то без знання того матеріалу, що буде викладено нижче, просто не обійтися. Особливо, якщо дані сформовані не особисто вами, а якоюсь сторонньою програмою або іншою людиною.

Символи

Символ – це одна одиниця тексту. Це буква, цифра, знак. Кодова таблиця знаків складається з 256 позицій, тобто. кожен символ має свій унікальний код від 0 до 255. Символ із деяким кодом N записують так: #N. Так символи і вказуються в коді програми. Оскільки код символу є число трохи більше 255, очевидно, що у пам'яті символ займає 1 байт. Як відомо, менше байта розмірності немає. Точніше, вона є – це біт, але працювати з бітами у програмі ми не можемо: байт – мінімальна одиниця. Переглянути таблицю символів та їх коди можна за допомогою стандартної утиліти "Таблиця символів", що входить у Windows (ярлик розташований в меню Пуск - Програми - Стандартні - Службові). Але незабаром ми й самі напишемо щось подібне.

Рядки

Рядок, вона ж текст - це набір символів, будь-яка їхня послідовність. Відповідно, один символ – це теж рядок, теж текст. Текстовий рядок має певну довжину. Довжина рядка - це кількість символів, які вона містить. Якщо один символ займає 1 байт, то рядок із N символів займає відповідно N байт.

Є й інші кодові таблиці, у яких 1 символ представлений одним байтом, а двома. Це Юнікод (Unicode). У таблиці Юнікод є символи всіх мов світу. На жаль, робота з Юнікодом досить утруднена і його підтримка поки що має лише локальний характер. Delphi не надає можливостей для роботи з Юнікодом. Програмна частина є, але візуальні елементи - форми, кнопки і т.д. не вміють відображати текст у форматі Юнікод. Сподіватимемося, в найближчому майбутньому така підтримка з'явиться. 2 байти також називають словом (word). Звідси і назва відповідного числового типу даних - Word (число, що займає у пам'яті 2 байти, значення від 0 до 65 535). Кількість "осередків" у таблиці Юнікоду становить 65536 і цього цілком достатньо для зберігання всіх мов світу. Якщо ви вирішили, що "1 байт - 256 значень, значить 2 байти - 2*256 = 512 значень", раджу згадати двійкову систему та принцип зберігання даних у комп'ютері.

Типи даних

Перейдемо безпосередньо до програмування. Для роботи із символами та рядками існують відповідні типи даних:

· Char – один символ (тобто 1 байт);

· String – рядок символів, текст (N байт).

Офіційно рядки вміщують лише 255 символів, проте Delphi в рядок можна записати набагато більше. Для зберігання великих текстів та текстів із спеціальними символами існують спеціальні типи даних AnsiString та WideString (останній, до речі, двобайтовий, тобто для Юнікоду).

Для завдання текстових значень Pascal використовуються одинарні лапки (не подвійні!). Тобто. коли ви хочете присвоїти рядковій змінній якесь значення, слід зробити це так:

Символи вказуються аналогічно, тільки в лапках є один-єдиний символ.

Якщо ви хочете жорстко обмежити довжину тексту, що зберігається у рядковій змінній, можна зробити це так:

Оскільки кожен рядок – це послідовність символів, кожен символ має свій порядковий номер. У Pascal нумерація символів у рядках починається з 1. Тобто. у рядку "ABC" символ "A" - перший, "B" - другий тощо.

Порядковий номер символу в рядку придуманий не випадково, адже саме за цими номерами, індексами здійснюються дії над рядками. Отримати будь-який символ з рядка можна вказівкою його номера у квадратних дужках поруч із ім'ям змінної. Наприклад:

var s:string; c: char; ... s:="Hello!"; c:=s; //c = "e"

Трохи пізніше, коли ми вивчатимемо масиви, стане зрозуміло, що рядок - це масив символів. Звідси випливає і форма звернення до окремих символів.

Обробка рядків

Перейдемо до функцій та процедур обробки рядків.

Довжину рядка можна дізнатися за допомогою функції Length(). Функція приймає єдиний параметр - рядок, а повертає його довжину. Приклад:

var Str: String; L: Integer; (...) Str:="Hello!"; L: = Length (Str); // L = 6

Знаходження підрядка у рядку

Невід'ємним завданням є знаходження підрядка у рядку. Тобто. Завдання формулюється так: є рядок S1. Визначити, починаючи з якої позиції до неї входить рядок S2. Без виконання цієї операції жодну обробку уявити неможливо.

Отже, такого знаходження існує функція Pos(). Функція приймає два параметри: перший - підрядок, який потрібно знайти, другий - рядок, в якому потрібно виконати пошук. Пошук здійснюється з урахуванням регістру символів. Якщо функція знайшла входження підрядка в рядок, повертається номер позиції першого входження. Якщо не знайдено входження, функція дає результат 0. Приклад:

var Str1, Str2: String; P: Integer;(...) Str1:="Hi! How do you do?"; Str2:="do"; P: = Pos (Str2, Str1); //P = 9

Видалення частини рядка

Видалити частину рядка можна процедурою Delete(). Слід звернути увагу, що це саме процедура, а не функція - вона чинить дії безпосередньо над тією змінною, яка їй передана. Отже, перший параметр – змінна рядкового типу, з якої видаляється фрагмент (саме змінна! конкретне значення не задається, тому що процедура не повертає результат), другий параметр – номер символу, починаючи з якого потрібно видалити фрагмент, третій параметр – кількість символів для видалення. Приклад:

var Str1: String; (...) Str1:="Hello, world!"; Delete (Str1, 6, 7); // Str1 = "Hello!"

Слід зазначити, що якщо довжина фрагмента, що видаляється, виявиться більше кількості символів у рядку, починаючи з зазначеної позиції (тобто "виліземо за край"), функція нормально відпрацює. Тому якщо потрібно видалити фрагмент з рядка з якогось символу до кінця, не потрібно обчислювати кількість цих символів. Найкращим способом буде задати довжину цього рядка.

Ось приклад. Припустимо, потрібно знайти в рядку першу літеру "a" і видалити наступну частину рядка. Зробимо так: позицію літери в рядку знайдемо функцією Pos(), а фрагмент видалимо функцією Delete().

var Str: String; ( ... ) Str:="This is a test."; Delete(Str,Pos("a",Str),Length(Str));

Спробуємо підставити значення та подивитися, що передається функції Delete. Перша літера "a" у рядку стоїть на позиції 9. Довжина всього рядка - 15 символів. Виклик функції відбувається такий: Delete (Str, 9, 15). Від літери "a" до кінця рядка всього 7 символів... Але функція зробить свою справу, не дивлячись на цю різницю. Результатом, звичайно, буде рядок "This is". Цей приклад одночасно показав і комбінування кількох функцій.

Копіювання (витяг) частини рядка

Ще одним важливим завданням є копіювання частини рядка. Наприклад, витяг із тексту окремих слів. Виділити фрагмент рядка можна видаленням зайвих частин, але цей спосіб незручний. Функція Copy() дозволяє скопіювати з рядка вказану частину. Функція приймає 3 параметри: текст (рядок), звідки копіювати, номер символу, з якого скопіювати і кількість символів для копіювання. Результатом роботи функції буде фрагмент рядка.

Приклад: нехай потрібно виділити із речення перше слово (слова розділені пробілом). На формі розмістимо Edit1 (TEdit), який буде введено пропозицію. Операцію виконуватиме після натискання на кнопку. Маємо:

У цьому випадку з рядка копіюється фрагмент від початку до першого пропуску. Число символів береться на одиницю менше, т.к. в іншому випадку пропуск також буде скопійований.

Вставка підрядка у рядок

Якщо потрібно вставити в рядок, який ви маєте, можна використовувати процедуру Insert(). Перший параметр – рядок для вставки, другий – змінна, що містить рядок, куди потрібно вставити, третій – позиція (номер символу), починаючи з якого буде вставлено рядок. Приклад:

procedure TForm2.Button1Click(Sender: TObject); var S: String; begin S:="1234567890"; Insert("000",S,3); ShowMessage(S) end;

В даному випадку результатом буде рядок "1200034567890".

Приклад "серйозніший"

Приклади, наведені вище, лише демонструють принцип роботи з рядками за допомогою функцій Length(), Pos(), Delete() та Copy(). Тепер вирішимо завдання складніше, яке вимагатиме комбінованого застосування цих функцій.

Завдання: текст, введений у полі Memo, розбити на слова та вивести їх у ListBox по одному на рядку. Слова відокремлюються один від одного пробілами, точками, комами, знаками оклику і знаки питання. Крім цього вивести загальну кількість слів у тексті та найдовше з цих слів.

Ось так... Завдання зовсім не просте. По-перше, ви одразу маєте здогадатися, що потрібно використовувати цикли. Без них ніяк, адже ми не знаємо, який текст буде передано програмі для обробки. По-друге, слова відокремлюються різними символами – це створює додаткові труднощі. Що ж, ходімо по порядку.

Інтерфейс: Memo1 (TMemo), Button1 (TButton), ListBox1 (TListBox), Label1, Label2 (TLabel).

Спочатку перенесемо введений текст до змінної. Для того, щоб разом взяти весь текст із Memo, звернемося до властивості Lines.Text:

var Text: string; begin Text:=Memo1.Lines.Text; end;

Тепер перейдемо до обробки. Перше, що потрібно зробити – розібратися із символами-розділювачами. Справа в тому, що такі символи можуть запросто йти поспіль, адже після ком, крапок та інших знаків ставиться пробіл. Обійти цю проблему можна таким простим способом: всі символи, що розділяють, замінимо на якийсь один, наприклад на кому. Для цього пройдемо всі символи та зробимо необхідні заміни. Щоб визначити, чи є символ роздільником, запишемо всі роздільники в окрему змінну (константу), а потім будемо шукати в цьому рядку кожен символ функцією Pos(). Всі ці заміни будуть проводитися в змінній, щоб оригінальний текст в Memo (тобто на екрані) не торкнувся. Тим не менш, для перевірки проміжних результатів роботи є сенс виводити оброблений текст будь-куди. Наприклад, в іншому полі Memo. Щоб пройти всі символи, скористаємося циклом FOR, де змінна пройде порядкові номери символів, тобто. від 1 до довжини рядка тексту:

procedure TForm1.Button1Click(Sender: TObject); const DelSym = ".,!?"; var Text: string; i: integer; if Pos(Text[i],DelSym) > 0 then Text[i]:=","; Memo2.Text:=Text; end;

Тепер потрібно усунути перешкоди. По-перше, перший символ не може бути роздільником, тобто. якщо перший символ - кома, його потрібно видалити. Далі, якщо поспіль йдуть кілька ком, їх потрібно замінити на одну. І нарешті, щоб коректно обробити весь текст, останнім символом має бути кома.

if Text = "," then Delete(Text,1,1); while Pos(",",Text) > if Text<>"," Text:=Text+",";

Тут заміна проведена наступним чином: організований цикл, в якому одна з ком видаляється, але відбувається це доти, поки в тексті є дві коми, що йдуть поспіль.

Ну от тепер у тексті не залишилося нічого зайвого - тільки слова, розділені комами. Спочатку досягнемо того, щоб програма витягла з тексту перше слово. Для цього знайдемо першу кому, скопіюємо слово від початку тексту до цієї коми, після чого видалимо це слово з тексту разом із комою. Видалення робиться для того, щоб далі можна було, проробивши ту ж операцію, вирізати наступне слово.

var Word: string; (...)

Тепер у змінній Word у нас слово з тексту, а в змінній Text вся решта тексту. Вирізане слово тепер додаємо в ListBox, викликаючи ListBox.Items.Add(рядок_додавання).

Тепер нам потрібно організувати такий цикл, який би дозволив вирізати з тексту всі слова, а не тільки перше. У цьому випадку підійде швидше REPEAT, ніж WHILE. Як умову слід зазначити Length(Text) = 0, тобто. завершити цикл тоді, коли текст стане пустим, тобто. коли ми виріжемо з нього усі слова.

repeat Word:=Copy(Text,1,Pos(",",Text)-1); Delete(Text,1,Length(Word)+1); ListBox1.Items.Add(Word); until Length(Text) = 0;

Отже, зараз маємо:

procedure TForm1.Button1Click(Sender: TObject); const DelSym = ".,!?"; var Text,Word: string; i: integer; begin Text:=Memo1.Lines.Text; for i:= 1 to Length(Text) do if Pos(Text[i],DelSym) > 0 then Text[i]:=","; if Text = "," then Delete(Text,1,1); while Pos(",",Text) > 0 do Delete(Text,Pos(",",Text),1); repeat Word:=Copy(Text,1,Pos(",",Text)-1); Delete(Text,1,Length(Word)+1); ListBox1.Items.Add(Word); until Length(Text) = 0; end;

Якщо ви зараз запустите програму, то побачите, що все добре працює. За винятком одного моменту – у ListBox наприкінці з'явилися якісь порожні рядки... Виникає питання: звідки вони взялися? Про це ви дізнаєтеся в наступному розділі уроку, а поки що реалізуємо необхідне до кінця.

Кількість слів у тексті визначити дуже просто – не потрібно заново нічого писати. Т.к. слова у нас занесені до ListBox, досить просто дізнатися, скільки там рядків – ListBox.Items.Count.

Тепер потрібно знайти найдовше з усіх слів. Алгоритм знаходження максимального числа такий: приймаємо як максимальне перше з чисел. Потім перевіряємо решту числа таким чином: якщо число більше того, яке зараз записано як максимальне, робимо максимальним це число. У нашому випадку слід шукати максимальну довжину слова. Для цього можна додати код до циклу вирізання слів з тексту або зробити пошук після додавання всіх слів до ListBox. Зробимо другим способом: організуємо цикл рядками ListBox. Слід зазначити, що рядки нумеруються з нуля, а чи не з одиниці! В окремій змінній зберігатимемо найдовше слово. Здавалося б, треба ще зберігати максимальну довжину слова, щоб було з чим порівнювати ... Але не потрібно заводити для цього окрему змінну, адже ми завжди можемо дізнатися довжину слова функцією Length (). Отже, припустимо, що перше слово найдовше...

Чому цикл до ListBox.Items.Count-1, а не просто до Count, розберіться самостійно:-)

Ось тепер все готове!

procedure TForm1.Button1Click(Sender: TObject); const DelSym = ".,!?"; var Text,Word,LongestWord: string; i: integer; begin Text:=Memo1.Lines.Text; for i:= 1 to Length(Text) do if Pos(Text[i],DelSym) > 0 then Text[i]:=","; if Text = "," then Delete(Text,1,1); while Pos(",",Text) > 0 do Delete(Text,Pos(",",Text),1); Text:=AnsiReplaceText(Text,Chr(13),""); Text:=AnsiReplaceText(Text,Chr(10),""); repeat Word:=Copy(Text,1,Pos(",",Text)-1); Delete(Text,1,Length(Word)+1); ListBox1.Items.Add(Word); until Length(Text) = 0; Label1.Caption:="Кількість слів у тексті: "+IntToStr(ListBox1.Items.Count); LongestWord:=ListBox1.Items; for i:= 1 to ListBox1.Items.Count-1 do if Length(ListBox1.Items[i]) > Length(LongestWord) then LongestWord:=ListBox1.Items[i]; Label2.Caption:="Найдовше слово: "+LongestWord+" ("+IntToStr(Length(LongestWord))+" літер)"; end;

Робота із символами

Власне, робота із символами зводиться до використання двох основних функцій - Ord() та Chr(). З ними ми зустрічалися. Функція Ord() повертає код вказаного символу, а функція Chr() - навпаки, повертає символ із вказаним кодом.

Пам'ятаєте "Таблицю символів"? Давайте зробимо її самі!

Висновок здійснимо в TStringGrid. Цей компонент є таблицею, де в кожному осередку записано текстове значення. Компонент розташований на вкладці Additional (за промовчанням слідує прямо за Standard). Насамперед налаштуємо нашу табличку. Нам потрібні лише дві колонки: в одній відображатимемо код символу, а в іншій - сам символ. Кількість колонок задається як логічна назва ColCount. 2. За замовчуванням у StringGrid заданий один фіксований стовпець і один фіксований рядок (вони відображаються сірим кольором). Стовпець нам не потрібний, а ось рядок дуже доречний, тому ставимо FixedCols = 0, а FixedRows залишаємо = 1.

Заповнення здійснимо при запуску програми, тобто. не ставитимемо жодних кнопок. Отже, створюємо обробник події OnCreate() форми.

Кількість символів у кодовій таблиці 256 плюс заголовок - всього 257. Задамо число рядків програмно (хоча можна задати і в Інспекторі Об'єкта):

procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.RowCount:=257; end;

Висновок робиться вкрай просто – за допомогою циклу. Просто проходимо числа від 0 до 255 та виводимо відповідний символ. Також виводимо написи у заголовок. Доступ до осередків StringGrid здійснюється за допомогою властивості Cells: Cells [номер_стовпця, номер_рядка]. У квадратних дужках зазначаються номери стовпця та рядки (починаються з нуля). Значення текстові.

Запускаємо, дивимось.

Спеціальні символи

Якщо ви уважно подивіться на нашу таблицю, побачите, що багато символів відображаються у вигляді квадратиків. Ні, це не значки. Так відображаються символи, які не мають візуального відображення. Тобто. символ, наприклад, з кодом 13 існує, але невидимий. Ці символи використовуються для додаткових цілей. Наприклад, символ #0 (тобто символ із кодом 0) часто застосовується для вказівки відсутності символу. Існують також рядки, які називають null-terminated - це рядки, що закінчуються символом #0. Такі рядки використовуються у мові Сі.
За кодами можна впізнати натискання кнопок. Наприклад, кнопка Enter має код 13, Escape - 27, пропуск - 32, Tab - 9 і т.д.

Давайте додамо до нашої програми можливість дізнатися код будь-якої клавіші. Для цього обробимо подію форми OnKeyPress(). Щоб цей механізм працював, необхідно встановити форму KeyPreview = True.

Тут ми виводимо віконце з текстом. Подія має змінну Key, в якій зберігається символ, відповідний натиснутій клавіші. За допомогою функції Ord() дізнаємося код цього символу, а потім функцією IntToStr() перетворимо це число на рядок.

Приклад "серйозніший" - продовження

Повернемося до нашого прикладу. Настав час з'ясувати, звідки до ListBox беруться порожні рядки. Справа в тому, що вони не зовсім порожні. Так, візуально вони порожні, але насправді в кожній із них по 2 спеціальні символи. Це символи з кодами 13 та 10 (тобто рядок #13#10). У Windows така послідовність цих двох не візуальних символів означає кінець поточного рядка та початок нового рядка. Тобто. у будь-якому файлі і взагалі будь-де перенесення рядків - це два символи. А весь текст відповідно залишається безперервною послідовністю символів. Ці символи можна (і навіть потрібно) використовувати у випадках, коли потрібно вставити перенесення рядка.

Доведемо нашу програму пошуку слів до логічного кінця. Отже, щоб позбавитися порожніх рядків, нам потрібно видалити з тексту символи #13 і #10. Зробити це можна за допомогою циклу, за аналогією з тим, як ми робили заміну двох ком на одну:

while Pos(Chr(13),Text) > 0 do Delete (Text, Pos (Chr (13), Text), 1); while Pos(Chr(10),Text) > 0 do Delete (Text, Pos (Chr (10), Text), 1);

Ну ось – тепер програма повністю працездатна!

Додаткові функції для роботи з рядками – модуль StrUtils

Додатковий модуль StrUtils.pas містить додаткові функції для роботи з рядками. Серед цих функцій багато корисних. Ось короткий опис функцій, що часто використовуються:

PosEx(Підстрока, рядок, відступ) - функція, аналогічна функції Pos(), але виконує пошук із зазначеної позиції (тобто з відступом від початку рядка). Наприклад, якщо ви хочете знайти в рядку другий пробіл, а не перший, без цієї функції вам не обійтися. Щоб зробити пошук другого пропуску вручну, потрібно попередньо вирізати частину вихідного рядка.

AnsiReplaceStr, AnsiReplaceText(рядок, текст_1, текст_2) - функції виконують заміну рядка рядка текст_1 на текст_2. Функції відрізняються лише тим, що перша веде заміну з урахуванням регістру символів, а друга без нього.

У нашій програмі можна використовувати ці функції для вирізання з рядка символів #13 і #10 - для цього як текст для заміни слід вказати порожній рядок. Ось рішення в один рядок коду:

Text:=AnsiReplaceText(AnsiReplaceText(Text,Chr(13),""),Chr(10),"");

DupeString(Рядок, число_повторень) - формує рядок, що складається з рядка рядком шляхом повторення її задану кількість разів.

ReverseString(Рядок) - інвертує рядок ("123" -> "321").

Також слід згадати у функціях перетворення регістру.

UpperCase(Рядок) - перетворює рядок у верхній регістр; LowerCase(Рядок) - перетворює рядок в нижній регістр.

Для перетворення окремих символів слід використовувати ці функції.

Детальну інформацію про кожну функцію можна отримати, ввівши її назву в будь-якому місці редактора коду, встановивши курсор на цю назву (або виділивши його) та натиснувши F1.

Скріншоти програм, описаних у статті

Висновок

Довгий вийшов урок. Отже, сьогодні ми познайомилися з рядками та символами та навчилися з ними працювати. Вивчені прийоми використовують практично повсюдно. Не бійтеся експериментувати – самостійно підвищуйте свій рівень навичок програмування!

Слово «символ» багатозначне; зокрема, під символом у програмі Adobe Illustrator розуміється векторний об'єкт, який зберігається на панелі Symbols(Символи) (рис. 1), що відкривається командою Window=>Symbols(Вікно=>Символи), і призначений для багаторазового використання. Робота із символами дещо нагадує клонування об'єктів, але тільки на перший погляд, оскільки це принципово різні технології з різними можливостями та призначенням. Загальне полягає лише в тому, що будь-який символ із палітри Symbolsможе бути багаторазово розмножений.

Серед можливостей роботи з символьними об'єктами Adobe Illustrator не лише багаторазова вставка того чи іншого символу з палітри Symbols, а й різноманітні маніпуляції з нею. Символи можна розпорошувати, як фарбу з балончика, збільшувати, зменшувати та повертати, можна змінювати розташування символів у групі, щільність символьних об'єктів, ступінь прозорості та тонування тощо. Для цих цілей у програмі є група спеціальних символьних інструментів Symbol Tool, до якої входять інструменти Symbol Sprayer(Розпилювач символів), Symbol Shifter(Зсув символів), Symbol Scruncher((Щільність об'єктів), Symbol Sizer(Розмір символів), Symbol Spinner(Обертання символів), Symbol Stainer(Тонування символів), Symbol Screener(Прозорість символів) та Symbol Styler(Стилізація символів) (рис. 2). І що найголовніше - зміна символу при необхідності можна миттєво оновити всі його копії на зображенні, що створюється; причому зовсім неважливо, наскільки значними були зроблені вами зміни.

Варто зазначити, що використання у зображеннях символьних об'єктів має чимало переваг: завдяки тому, що символи є подібними один одному до об'єктів (це означає, що кожен елемент у малюнку посилається на свій оригінальний зразок-символ), відбувається зменшення загального обсягу зображення, що актуально як при створенні web-графіки, так і при розробці анімації, картографічних зображень та ін. Крім того, суттєво спрощується робота із зображенням, оскільки будь-яка зміна символу на палітрі Symbols автоматично призводить до відповідного редагування всіх побудованих на його основі графічних об'єктів у зображенні, що істотно прискорює розробку. Останнє особливо важливо для дизайнерів, які займаються розробкою картографічних об'єктів карт, схем і діаграм, що містять велику кількість однотипних елементів, що відіграють роль умовних позначень. Це позбавляє дизайнерів багаторазових операцій копіювання та вставки, а також редагування кожного однотипного символу вручну. Технічно весь процес розробки, наприклад, карти значно спрощується, а кількість необхідних кроків зменшується. У результаті створення картографічного зображення досить розмістити об'єкти-символи у потрібних місцях, проте інші їх характеристики можна налаштувати пізніше, причому одночасно всім задіяних у зображенні однотипних елементів.

Символи, що входять у поставку, знаходяться в декількох бібліотеках (правда, загальна їх кількість не велика (рис. 3)), а доступ до потрібної бібліотеки можна отримати за допомогою команди Window=>Symbols Library(Вікно=>Бібліотека символів). Кількість символів може бути багаторазово збільшена як за рахунок завантаження необхідних у роботі символів з Інтернету, так і шляхом власноручного створення нових символів. Власне, будь-який об'єкт, група об'єктів або зображення в цілому може бути збережено як символ незалежно від того, чи воно містить намальовані елементи, текст, впроваджені зображення або комбінацію перерахованих елементів. Це дуже зручно, тому що дозволяє поповнити бібліотеку. Symbolsтими графічними елементами, які часто використовуються у конкретній розробці.

Робота з окремими символами панелі Symbols

Розміщення окремих символів у документі

Наприклад розглянемо найпростішу ситуацію, коли якийсь алгоритм необхідно у вигляді схеми. Створіть новий документ та відкрийте бібліотеку символів Charts, скориставшись командою Window=>Symbols Library=>Charts(Вікно=>Бібліотека символів=>Карта). Потім послідовно перетягуйте потрібні символи з палітри символів у схему, що створюється, і розміщуйте їх потрібним чином. Є й інший спосіб переміщення символу в зображення можна вибрати символ і клацнути на кнопці Place Symbol Instance(Помістити екземпляр символу) палітри Symbols, що призведе до появи одного екземпляра символу у центрі зображення. Потім так само вставлений символ можна буде перемістити, попередньо виділивши інструментом Selection(Виділення) або Direct Selection(Часткове виділення).

Після закінчення роботи, щоб досягти певної симетричності елементів схеми, потрібно послідовно виділяти інструментом Direct Selection при натиснутій клавіші Shiftсимволи, які потрібно розмістити по центру документа або на одній горизонталі або по одній вертикалі, і клацати на відповідних кнопках палітри Align(Вирівнювання). Результат може нагадувати рис. 4.

Якщо розміри якихось об'єктів вас не влаштовують, їх легко змінити, виділивши конкретний символьний об'єкт інструментом Selection, що автоматично призведе до укладання об'єкта в габаритний контейнер, і відкоригувавши розмір звичайним чином перетягуванням одного з маркерів контейнера (рис. 5).

Якщо необхідно змінити варіант оформлення всіх або лише деяких символів, то найпростіше скористатися одним із вбудованих стилів. Для цього виділіть інструменти, що редагуються. Selection(рис. 6) і клацніть на відповідному стилі на панелі Styles(Стилі) у цьому прикладі було обрано стиль Blue Goo(Мал. 7).

Якщо жоден із стилів оформлення в даній ситуації вам не підходить, тоді потрібно буде розірвати зв'язок із символьними елементами палітри. Symbolsвиділивши об'єкти зображення інструментом Selectionі клацнувши на кнопці Break Link to Symbol Symbols. Зовнішній вигляд виділеної області відразу зміниться - символи виявляться ув'язненими в габаритні контейнери і перетворяться на звичайні векторні об'єкти (рис. 8). Це означатиме, що у будь-якого елемента можна буде змінити особливості заливки та межі, наприклад, встановивши градієнтну заливку, та виконати з ними будь-які інші перетворення (рис. 9).

Мал. 8. Зміна характеру виділення елементів схеми після розриву зв'язків

Копіювання символів у документі

Символьні об'єкти також легко копіювати, як і звичайні векторні, при натиснутій клавіші Alt. Наприклад перетягніть будь-який із символів з палітри Symbolsна робочий лист. У разі потреби скоригуйте його розмір та натиснувши клавішу Altбагато разів, починайте дублювати, переміщуючи мишу при натиснутій лівій кнопці (рис. 10).

Редагування окремих символів у документі

Впроваджені у зображення символьні елементи можна трансформувати (змінювати розміри, повертати, відображати тощо), як і звичайні векторні об'єкти, вирівнювати, користуючись кнопками палітри Align(Вирівнювання), змінювати прозорість та режим змішування на панелі Transparency(Прозорість) (рис. 11 та 12) та оформляти різними стилями з палітри Styles(Стилі).

Мал. 12. Результат впровадження у растрове зображення серії символів з подальшою їх трансформацією, зміною ступеня прозорості та режиму змішування

Завдяки наявності спеціальних символьних інструментів із групи Symbol Toolредагувати окремі символи можна і зовсім іншим способом – у деяких випадках це виявляється зручніше, ніж, наприклад, класичні варіанти трансформації. Щоб оцінити можливості інструментів із групи Symbol Toolтрохи поекспериментуємо з ними на прикладі створення нового зображення. Для початку перемістимо з палітри Symbolsсимвол вогню (рис. 13). На панелі інструментів активізуємо інструмент Symbol Sizer(Розмір символів) і кілька разів натисніть на впровадженому символі, поки розмір зображення не стане досить великим (рис. 14). Певна перевага застосування Symbol Sizerв порівнянні зі звичайним виділенням об'єкта інструментом Selectonі наступним зміною розміру шляхом переміщення граничних точок габаритного контейнера у тому, що з пропорційного зміни розмірів немає необхідності утримувати клавішу Shift, оскільки за замовчуванням інструмент налаштований саме на пропорційну зміну розмірів.

Після цього візьмемо інструмент Symbol Shifter(Зсув символів) і перетягнемо символ у правий нижній кут (рис. 15). За допомогою інструменту Symbol Spinner(Обертання символів) злегка повернемо символьний об'єкт (рис. 16), додамо на передній план ще один символ із бібліотеки символів Nature, для відкриття якої скористайтесь командою Window=>Symbols Library=>Nature(Вікно => Бібліотека символів => Природа) (рис. 17). Потім змінимо тональність кольорів символу-вогню інструментом Symbol Stainer(Тонування символів) для цього виділимо символ інструментом Selecton, встановимо відповідний колір у вікні Fill(Заливка) і натисніть на символ. У результаті зовнішній вигляд зображення миттєво зміниться: колірні переходи збережуться, але їх тональність стане іншою, наблизившись до кольору, заданого у вікні Fill(Рис. 18). Зверніть увагу, що за допомогою символьних інструментів можна змінити тональність, але не кольору заливки і не межі символьних об'єктів останнє можливе лише після здійснення розриву зв'язку між символом на палітрі Symbolsта його копією у зображенні (команда Break Link to SymbolРозірвати зв'язок із символом).

На закінчення трохи зменшимо прозорість символу-вогню. Для цього виділимо символ, оберемо інструмент Symbol Screener(Прозорість символів) і змінимо спочатку його параметри, оскільки за умовчанням він дуже зменшує прозорість. Двічі клацніть на інструменті Symbol Screenerі знизимо інтенсивність впливу інструменту, зменшивши значення у полі Intensity(інтенсивність) з 8, наприклад, до 2 (рис. 19). Клацніть на символі вогню, і отриманий результат може нагадувати рис. 20.

А тепер перетворимо зображення на малюнок олівцем, змінивши стилізацію об'єктів за допомогою інструмента Symbol Styler(Стилізація символів). Виділіть обидва символи інструментом Selection, увімкніть інструмент Symbol Styler, а потім активізуйте потрібний стиль в даному прикладі був обраний стиль 1-pt Outside Stroke(Рис. 21).

Мал. 21. Олівцевий малюнок, сформований на основі символьних об'єктів

Створення нових символів

Як уже було зазначено, символи можуть бути створені з будь-яких об'єктів, які використовуються у програмі Adobe Illustrator, включаючи прості та складові контури, текстові об'єкти, імпортовані піксельні зображення, градієнтні сітки та групи об'єктів, а також символи.

Формування нового символу зі складного об'єкта з градієнтною заливкою

Допустимо, у вас вже є векторний об'єкт у вигляді кнопки з градієнтною сіткою (рис. 22). Щоб створити на його основі символ і розмістити його на панелі Symbols, необхідно виділити об'єкт інструментом Selectionі перетягнути його на палітру або клацнути на кнопці New Symbol(Новий символ) на панелі Symbols(Рис. 23). Так само створимо ще одне ідентичне зображення - аналогічну кнопку, але зеленого кольору (обидва символи нам будуть потрібні в подальшій роботі) (рис. 24). Якщо необхідно, щоб одночасно цей символ став символом і на зображенні, тобто щоб виник зв'язок між символом і відповідним символьним об'єктом на малюнку, то при перетягуванні необхідно утримувати натиснутою клавішу Shift.

Мал. 22. Вихідне зображення (кнопка та відповідна їй палітра Layers)

Нічого страшного, якщо символ, поміщений у палітру, виявився невдалим - його нескладно видалити, виділивши на палітрі Symbolsі клацнувши на кнопці Delete Symbol(Видалити символ) цієї панелі.

Слід мати на увазі, що при відкритті або створенні нового зображення палітра, що відкрилася Symbolsматиме початковий вигляд, тобто створені нові символи там не будуть. Тому необхідно зберегти зображення з новими символами на панелі звичайним чином за допомогою команди File=>Save(Файл=>Зберегти) з розширенням *ai. Після цього збережену палітру можна буде відкривати як відповідну бібліотеку та використовувати у роботі.

Тепер спробуємо скористатися створеним символом з прикладу формування картографічного зображення. Відкрийте вихідну карту (рис. 25), на яку необхідно додати у вигляді спеціальних значків місця розташування міст та курортів. Відкриємо палітру Symbolsіз щойно створеними символами командою Window=>Symbols Library=>Other Library(Вікно=>Бібліотека символів=>Інші бібліотеки), а потім послідовно розмістимо блакитні кнопки в місцях знаходження міст (рис. 26), зелені курортів (рис. 27).

Мал. 27. Остаточний зовнішній вигляд створеного картографічного зображення із зазначеними містами та курортами

Якщо у створеному зображенні, що містить численні копії символів, потрібно змінити якісь із них, наприклад зменшити прозорість деяких із символів (вони відповідатимуть менш дорогим курортам), то ця дія виконується у два етапи. Спочатку потрібно виділити на зображенні інструментом Direct Selectionредаговані символьні об'єкти, а потім зменшити їх непрозорість на панелі Transparency(Рис. 28). Так само можна змінити у символьних елементів розмір, викликавши команду Transform=>Scale(Трансформація=>Розмір) зі спливаючого меню (рис. 29), та ряд інших параметрів. У разі потреби більш серйозних змін, наприклад, для зміни заливки, доведеться спочатку перетворювати символ на векторний об'єкт і лише потім проводити його редагування.

Мал. 28. Результат одночасної зміни прозорості у кількох символьних об'єктів (зображення та палітра Transparency)

Мал. 29. Результат одночасної зміни розміру у кількох символьних об'єктів (зображення та вікно Scale)

Формування нового символу із застосуванням Blend-переходу

А тепер розглянемо складніший варіант. Припустимо, наше завдання полягає в тому, щоб створити карту - схему проїзду, наприклад, до офісу компанії (сьогодні подібні схеми є в Інтернеті на багатьох сайтах). Якщо під час підготовки такої карти не враховувати різноманітність архітектури, а всі будівлі відображати у вигляді деяких стилізованих типових будов, то за допомогою символьних об'єктів у програмі Adobe Illustrator це можна реалізувати досить швидко.

Для створення типової будівлі сформуємо два прямокутні векторні контури та зв'яжемо їх за допомогою Blend-переходу, встановивши для нього варіант Smooth Color(Згладжений колірний перехід) (рис. 30), в результаті вийде паралепіпед, який і відображатиме будинок. Потім додамо до нього вікна, а з огляду на те, що вікон доведеться малювати досить багато, простіше буде попередньо створити відповідний символ і розмістити його на палітрі Symbols(Рис. 31). Після цього додамо до стилізованої будівлі вікна шляхом перетаскування символу вікна на будівлю (рис. 32).

Як уже було сказано, передбачувана карта-схема складатиметься з абсолютно однакових будівель, внаслідок чого створену будівлю варто зберегти у вигляді символу на палітрі Symbols, попередньо виділивши його інструментом Selection(Рис. 33). Після цього приступити до створення карти вже не важко буде достатньо вставляти символи-будинки в потрібні частини карти, вирівнювати їх щодо центру (кнопка Vertical Align Centerпалітри Align) і щодо один одного (кнопки Vertical Distribute Centerі Horizontal Distribute Centerпалітри Align), додавати до будинків номери, а між ними створювати вулиці та зелені масиви. Можливо, на початку роботи карта-схема матиме приблизно такий вигляд, як на рис. 34.

Формування нового символу з пензля

На наступному етапі створення схеми необхідно вказати шлях до офісу, що найзручніше зробити за допомогою стрілок. Можна просто створити контур такого шляху і оформити його відповідним пензлем у вигляді стрілки, проте даний варіант має два «але»: по-перше, шлях часто виглядає переривчасто (зокрема, доводиться пропускати назви вулиць тощо), в результаті чого потрібно створювати декілька контурів і при створенні кожного контуру коригувати налаштування пензля, що незручно, а по-друге, цілком можливо, що безпосередньо скористатися пензлем у вигляді стрілки вам просто не захочеться, так як оформлений контур вийде недостатньо привабливим.

Можна, звичайно, на основі відповідного пензля створити новий, але є й інший спосіб, причому більш швидкий і зручний створити на основі кисті у вигляді стрілки спеціальний символ і підредагувати його за своїм смаком. Розглянемо цей варіант докладно: з бібліотеки пензлів відкрийте палітру Arrow Sample, застосувавши команду Window=>Brush Library=>Arrow Sample(Вікно=>Бібліотека символів=>Зразки стрілок), виберіть потрібний пензель (в даному випадку задіяний пензель Arrow 144) і сформуйте фрагмент стрілки (рис. 35). Перетягніть її на палітру Symbolsпри натиснутій клавіші Shift, щоб зразок на малюнку автоматично перетворився на символ – це буде тимчасовий символ « Стрілка». Потім звичайним чином зменшіть її розмір, розірвіть зв'язок із палітрою Symbols, клацнувши на кнопці Break Link to Symbol(Розірвати зв'язок із символом), що знаходиться внизу палітри Symbols, і додайте до стрілки, наприклад, кордон (можна застосувати і щось цікавіше накласти відповідний фільтр, створити Blend-перехід і т.п.). Після цього знову перетягніть її на палітру Symbols, а тимчасовий символ «Стрілка» видаліть, виділивши його та клацнувши на кнопці Delete Symbol(Видалити символ) цієї палітри (рис. 36). На завершення намалюйте шлях до офісу із застосуванням щойно створеного символу. Стрілка». Не забувайте, що розмножувати символи швидше буде не шляхом багаторазового перетягування з палітри Symbols, а шляхом переміщення малюнку символу при натиснутій клавіші Alt. Можливо, що в результаті зображення набуде такого вигляду, як представлений на рис. 37.

Автоматична заміна символів на малюнку

Якщо у створеному зображенні вже використані якісь символи (з числа вхідних у поставку або створених вручну) і в ході роботи виявилося, що деякі з них необхідно замінити на інші, що є на панелі Symbols, то ця дія займе лічені секунди. Для цього на раніше створеному рис. 27 виділіть інструментом Direct Selectionсимволи, що замінюються, на палітрі Symbol s виділіть символ, на який потрібно замінити, і виберіть з меню панелі команду Replace Symbol(Замінити символ) (рис. 38) всі виділені символи будуть замінені.

Мал. 38. Результат заміни кількох символьних об'єктів (зображення та палітра Symbols)

Редагування символів на панелі Symbols

Припустимо, що один із символів палітри Symbols(незалежно від того, входить він до однієї з бібліотек або був створений вами) необхідно кардинально змінити. Це можливо лише після здійснення розриву зв'язку, тому виберіть один із уже створених нами символів у вигляді кнопки та клацніть на кнопці Break Link to Symbol(Розірвати зв'язок із символом), що знаходиться внизу палітри Symbols. Символ знову стане звичайним векторним об'єктом і його нескладно змінити. Поміняємо, наприклад, колір кнопки із зеленого на червоний (рис. 39).

Мал. 39. Видозмінена палітра Symbols із впровадженими символами-кнопками та відредагованим символом у вигляді векторного об'єкта (це видно за маркерами виділення)

Щоб замінити символ на панелі Symbolsйого відредагованою версією, виділіть змінений символ, активізуйте вихідний символ на панелі Symbolsа потім з меню панелі виберіть команду Redefine Symbol(Перевизначити символ) (рис. 40) Це призведе до зміни символу на палітрі (рис. 41). Зверніть увагу, що якщо редагування символу ви проводили у зображенні, де він був задіяний, у нашому випадку, наприклад, у зміненій палітрі Symbols(див. рис. 27), то перевизначення символу автоматично призведе не тільки до його заміни на палітрі Symbols, а й до оновлення всіх його копій на зображенні (рис. 42).

Мал. 42. Картографічне зображення після перевизначення символу, використаного раніше для позначення курортів, відповідно до палітри Symbols

Робота з групами символів

Якщо йдеться про одночасне розміщення та подальшу обробку не одного, а відразу кількох примірників одного і того ж символу (тобто групи символів), то будуть потрібні спеціальні символьні інструменти Symbol Tool: Symbol Sprayer(Розпилювач символів), Symbol Shifter(Зсув символів), Symbol Scruncher((Щільність об'єктів), Symbol Sizer(Розмір символів), Symbol Spinner(Обертання символів), Symbol Stainer(Тонування символів), Symbol Screener(Прозорість символів) та Symbol Styler(Стилізація символів). Кожен інструмент цієї групи має власні налаштування, які визначаються в діалоговому вікні Symbolism Tool Options(Параметри інструмента "Символьні об'єкти"), що викликається подвійним клацанням миші.

Такі групи символів являють собою єдиний об'єкт (рис. 43), і всі наступні можливі щодо перетворення: трансформація, зміна насиченості, кольору, розташування, розміру, повороту, прозорості і накладання стилів застосовуються відразу до всіх елементів групи.

Розпорошення групи символів

Для прикладу відкриємо зображення (рис. 44) і спробуємо розпорошити на ньому сніжинки. Придатний зразок сніжинки є в бібліотеці символів Nature. У порівнянні з розміром вихідного зображення зразок сніжинки занадто великий, тому спочатку вставте його єдиний екземпляр, перетягнувши з палітри на малюнок (рис. 45). Потім активуйте інструмент Selectionі, не знімаючи виділення зі сніжинки, зменшіть розмір до прийнятного (рис. 46) при натиснутій клавіші Shift, щоб зберегти пропорції. Перетягніть новий зразок символу-сніжинки на палітру Symbolsі залиште його там як активний символ.

Після цього виберіть інструмент Symbol Sprayerі прикрасьте зображення, розпорошивши по малюнку сніжинки, це нескладно, тим більше що технологія роботи з Symbol Sprayerдуже нагадує роботу з розпилювачем у будь-якому графічному пакеті. Цілком можливо, що частина сніжинок опиниться за межами малюнка (рис. 47), у цьому випадку виділіть інструментом Selection усю групу сніжинок і змініть її розміри звичайним чином (рис. 48).

Мал. 47. В результаті розпилення символів інструментом Symbol Sprayer частина сніжинок виявилася поза малюнком

Якщо параметри налаштування інструменту Symbol Sprayerвас не влаштовують (за замовчуванням для всіх його налаштувань беруться середні значення), їх нескладно скоригувати, двічі клацнувши на інструменті і внісши відповідні коригування у вікні Symbolism Tool Options. Вважатимемо, наприклад, що нас не влаштовує колір сніжинок і щільність їх розташування. Для зміни кольору, а точніше, щоб символи створювалися з урахуванням кольору, вибраного у вікні Fill(Заливка), у списку Stain(Забарвлення) потрібно встановити варіант User Defined(Визначений користувачем). А для збільшення густини слід збільшити значення параметра Symbol Set Density(Щільність набору символів), наприклад, як на рис. 49. Результат може нагадувати рис. 50.

Мал. 50. Після створення додаткових символьних об'єктів сніжинки розпилюються щільніше і мають темніший відтінок відповідно до кольору, встановленого у вікні Fill (Заливка)

У числі налаштувань можна змінювати такі параметри:

  • Scrunch(Щільність об'єктів) - відносна щільність об'єктів з урахуванням вихідного розміру символу;
  • Size(Розмір) розмір розпорошуваних символів з урахуванням вихідного розміру символу;
  • Spin(Обертання) визначення поворотів генерованих символів з урахуванням переміщення курсору миші;
  • Screen(Прозорість) ¨ облік ступеня прозорості символів;
  • Style(Стиль) ¨ визначення характеру оформлення символів з урахуванням параметрів активного стилю.

Для кожного з цих параметрів можливі два варіанти установок: Average(Середній) додає новий екземпляр символу із середнім значенням параметрів, а User Defined(Визначений користувачем) забезпечує створення символів з урахуванням конкретних налаштувань користувача.

В полі Diameter(Діаметр) встановлюється діаметр кола впливу інструмента, в полі Intensity(Інтенсивність) визначається ступінь зміни генерованих символів чим більше значення, тим більше ступінь зміни.

Крім того, краще працювати з увімкненим прапорцем Show Brush Size and Intensity(Відображати розмір пензля та інтенсивність) у цьому випадку на екрані у вигляді кола відображається розмір розпилювача символів, що визначає площу впливу інструмента.

Редагування групи символів

Як вихідне зображення візьмемо рис. 51, розпорошимо в його нижній частині символи трави з бібліотеки символів Natureі відредагуємо розмір отриманої групи символів відповідно до розміру вихідного зображення (рис. 52). Потім, щоб збільшити щільність об'єктів у цій групі символів, викличемо меню інструмента Symbol Scruncher(Щільність об'єктів), двічі клацнувши на інструменті, і збільшимо значення параметра Symbol Set Density(Щільність набору символів), наприклад, як на рис. 53. Далі клацніть на виділеній групі символів, що призведе до їх ущільнення (рис. 54).

Доповнимо зображення, розпорошивши ще кілька груп символів трави, і додамо два символьні об'єкти у вигляді каменів. Перемістимо останні під траву для цього потрібно виділити кожен з об'єктів, клацнути на ньому правою кнопкою миші і вибрати команду Arrange=>Send Backward (Перемістити=>Перемістити назад (рис. 55).

Мал. 55. Зображення після додавання кількох груп символів та двох одиничних символів

Зробимо траву в нижньому правому куті зображення темніше за допомогою інструмента Symbol Stainer(Тонування символів). Виділимо відповідну групу символів інструментом Selecton, встановимо темно-зелений колір у вікні Fill(Заливка) і клацніть на групі символів (мал. 56) Для більшого ефекту можна перемістити мишу по символьній групі, що призведе до подальшого поступового перефарбовування символів. В результаті символи трави збережуться, але їх колірний тон зміниться відповідно до кольору, визначеного у вікні Fill(Рис. 57).

Мал. 56. Вплив інструментом Symbol Stainer (Тонування символів) на групу символів

Після цього висвітлимо траву в лівому верхньому кутку. Це можна зробити як вищеописаним способом, попередньо встановивши в палітрі світло-зелений колір, так і змінюючи рівень прозорості відповідної групи символів інструментом Symbol Screener(Прозорість символів). Скористаємося другим способом, тобто виділимо групу символів і клацнімо на групі (або проведемо по ній від цього залежить, скільки символів і в якій мірі будуть піддані впливу) інструментом Symbol Screener(Рис. 58). Можливо, що після перетворень зображення буде схожим на рис. 59.

Мал. 58. Вплив інструментом Symbol Screener (Прозорість символів) на групу символів

Вступ

Обробка тексту - одне з найпоширеніших завдань програмування. Якщо потрібно обробити будь-які текстові дані, то без знання того матеріалу, що буде викладено нижче, просто не обійтися. Особливо, якщо дані сформовані не особисто вами, а якоюсь сторонньою програмою або іншою людиною.

Символи

Символ – це одна одиниця тексту. Це буква, цифра, знак. Кодова таблиця символів складається з 256 позицій, тобто. кожен символ має свій унікальний кодвід 0 до 255. Символ із деяким кодом Nзаписують так: #N. Так символи і вказуються в коді програми. Так як код символу є числом не більше 255, то очевидно, що в пам'яті символ займає 1 байт. Як відомо, менше байта розмірності немає. Точніше, вона є – це біт, але працювати з бітами у програмі ми не можемо: байт – мінімальна одиниця. Переглянути таблицю символів та їх коди можна за допомогою стандартної утиліти " Таблиця символів", що входить у Windows (ярлик розташований у меню Пуск - Програми - Стандартні - Службові). Але незабаром ми й самі напишемо щось подібне.

Рядки

Рядок, вона ж текст- це набір символів, будь-яка їхня послідовність. Відповідно, один символ – це теж рядок, теж текст. Текстовий рядок має певну довжину. Довжина рядка - це кількість символів, які вона містить. Якщо один символ займає 1 байт, то рядок із N символів займає відповідно N байт.
Є й інші кодові таблиці, у яких 1 символ представлений одним байтом, а двома. Це Юнікод (Unicode). У таблиці Юнікод є символи всіх мов світу. На жаль, робота з Юнікодом досить утруднена і його підтримка поки що має лише локальний характер. Delphi не надає можливостей для роботи з Юнікодом. Програмна частина є, але візуальні елементи - форми, кнопки і т.д. не вміють відображати текст у форматі Юнікод. Сподіватимемося, в найближчому майбутньому така підтримка з'явиться. 2 байти також називають словом (слово). Звідси і назва відповідного числового типу даних - Word(Число, що займає в пам'яті 2 байти, значення від 0 до 65535). Кількість "осередків" у таблиці Юнікоду становить 65536 і цього цілком достатньо для зберігання всіх мов світу. Якщо ви вирішили, що "1 байт - 256 значень, значить 2 байти - 2*256 = 512 значень", раджу згадати двійкову систему та принцип зберігання даних у комп'ютері.

Типи даних

Перейдемо безпосередньо до програмування. Для роботи із символами та рядками існують відповідні типи даних:

Char – один символ (тобто 1 байт);
String – рядок символів, текст (N байт).

Офіційно рядки вміщують лише 255 символів, проте Delphi в рядок можна записати набагато більше. Для зберігання великих текстів та текстів із спеціальними символами існують спеціальні типи даних AnsiStringі WideString(Останній, до речі, двобайтовий, тобто для Юнікоду).

Для завдання текстових значень у Pascal використовуються одинарні лапки(Не подвійні!). Тобто. коли ви хочете присвоїти рядковій змінній якесь значення, слід зробити це так:

S:="text" ;

Символи вказуються аналогічно, тільки в лапках є один-єдиний символ.

Якщо ви хочете жорстко обмежити довжину тексту, що зберігається у рядковій змінній, можна зробити це так:

var s: string [10];

У дужках вказується максимальна довжина рядка.

Операції з рядками

Основною операцією з рядками є додавання. Подібно до числа, рядки можна складати. І якщо в числах стільці з апельсинами складати не можна, то в рядках можна. Складання рядків - це їх об'єднання. Приклад:

var s: string; ... s :="123" + "456" ; //s = "123456"

Оскільки кожен рядок – це послідовність символів, кожен символ має свій порядковий номер. У Pascal нумерація символів у рядках починається з 1. Тобто. в рядку " ABC"символ" A"- перший," B- другий і т.д.
Порядковий номер символу в рядку придуманий не випадково, адже саме за цими номерами, індексами здійснюються дії над рядками. Отримати будь-який символ з рядка можна вказівкою його номера у квадратних дужках поруч із ім'ям змінної. Наприклад:

var s: string; c: char; ... s :="Hello!" ; c: = s [2]; //c = "e"

Трохи пізніше, коли ми вивчатимемо масиви, стане зрозуміло, що рядок - це масив символів. Звідси випливає і форма звернення до окремих символів.

Обробка рядків

Перейдемо до функцій та процедур обробки рядків.

Довжина рядка

Довжину рядка можна дізнатися за допомогою функції Length(). Функція приймає єдиний параметр - рядок, а повертає його довжину. Приклад:

var Str:String; L: Integer; ( ... ) Str :="Hello!" ; L: = Length (Str); // L = 6

Знаходження підрядка у рядку

Невід'ємним завданням є знаходження підрядка у рядку. Тобто. завдання формулюється так: є рядок S1. Визначити, починаючи з якої позиції до неї входить рядок S2. Без виконання цієї операції жодну обробку уявити неможливо.
Отже, для такого знаходження існує функція Pos(). Функція приймає два параметри: перший - підрядок, яку потрібно знайти, другий - рядок, у якій потрібно здійснити пошук. Пошук здійснюється з урахуванням регістру символів. Якщо функція знайшла входження підрядка в рядок, повертається номер позиції першого входження. Якщо не знайдено входження, функція дає результат 0. Приклад:

var Str1, Str2: String; P: Integer; ( ... ) Str1:="Hi! How do you do?" ; Str2:="do" ; P:=Pos (Str2, Str1); //P = 9

Видалення частини рядка

Видалити частину рядка можна процедурою Delete(). Слід звернути увагу, що це саме процедура, а не функція - вона чинить дії безпосередньо над тією змінною, яка їй передана. Отже, перший параметр – змінна рядкового типу, з якої видаляється фрагмент (саме змінна! конкретне значення не задається, тому що процедура не повертає результат), другий параметр – номер символу, починаючи з якого потрібно видалити фрагмент, третій параметр – кількість символів для видалення. Приклад:

var Str1: String; ( ... ) Str1:="Hello, world!" ; Delete (Str1, 6, 7); // Str1 = "Hello!"

Слід зазначити, що якщо довжина фрагмента, що видаляється, виявиться більше кількості символів у рядку, починаючи з зазначеної позиції (тобто "виліземо за край"), функція нормально відпрацює. Тому якщо потрібно видалити фрагмент з рядка з якогось символу до кінця, не потрібно обчислювати кількість цих символів. Найкращим способом буде задати довжину цього рядка.

Ось приклад. Допустимо, потрібно знайти в рядку першу букву " aі видалити наступну за нею частину рядка. Зробимо наступним чином: позицію літери в рядку знайдемо функцією Pos(), а фрагмент видалимо функцією Delete().

var Str:String; ( ... ) Str :="This is a test." ; Delete (Str, Pos ("a", Str), Length (Str));

Спробуємо підставити значення та подивитися, що передається функції Delete. Перша буква " a" у рядку стоїть позиції 9. Довжина всього рядка - 15 символів. Значить виклик функції відбувається такою: Delete(Str,9,15). Видно, що з букви " a" до кінця рядка всього 7 символів ... Але функція зробить свою справу, не дивлячись на цю різницю. Результатом, звичайно, буде рядок " This isДаний приклад одночасно показав і комбінування кількох функцій.

Копіювання (витяг) частини рядка

Ще одним важливим завданням є копіювання частини рядка. Наприклад, витяг із тексту окремих слів. Виділити фрагмент рядка можна видаленням зайвих частин, але цей спосіб незручний. Функція Copy()дозволяє скопіювати з рядка вказану частину. Функція приймає 3 параметри: текст (рядок), звідки копіювати, номер символу, з якого скопіювати і кількість символів для копіювання. Результатом роботи функції буде фрагмент рядка.

Приклад:нехай потрібно виділити з речення перше слово (слова розділені пропуском). На формі розмістимо Edit1 (TEdit), до якого буде введено пропозицію. Операцію виконуватиме після натискання на кнопку. Маємо:

procedure TForm1.Button1Click (Sender: TObject); var s,word: string; begin s:=Edit1.Text ; word:=Copy (s,1,Pos("",s)-1); ShowMessage("Перше слово: "+word); end;

У цьому випадку з рядка копіюється фрагмент від початку до першого пропуску. Число символів береться на одиницю менше, т.к. в іншому випадку пропуск також буде скопійований.

Вставка підрядка у рядок

Якщо потрібно вставити рядок в наявний рядок, можна використовувати процедуру Insert(). Перший параметр – рядок для вставки, другий – змінна, що містить рядок, куди потрібно вставити, третій – позиція (номер символу), починаючи з якого буде вставлено рядок. Приклад:

procedure TForm2.Button1Click (Sender: TObject) ; var S: String; begin S:="1234567890"; Insert("000", S,3); ShowMessage(S) end;

В даному випадку результатом буде рядок "1200034567890".

Приклад "серйозніший"

Приклади, наведені вище, лише демонструють принцип роботи з рядками за допомогою функцій Length(), Pos(), Delete()і Copy(). Тепер вирішимо завдання складніше, яке вимагатиме комбінованого застосування цих функцій.

Завдання:текст, введений у полі Memo, розбити на слова та вивести їх у ListBox по одному на рядку. Слова відокремлюються один від одного пробілами, точками, комами, знаками оклику і знаки питання. Крім цього вивести загальну кількість слів у тексті та найдовше з цих слів.

Ось так... Завдання зовсім не просте. По-перше, ви одразу маєте здогадатися, що потрібно використовувати цикли. Без них ніяк, адже ми не знаємо, який текст буде передано програмі для обробки. По-друге, слова відокремлюються різними символами – це створює додаткові труднощі. Що ж, ходімо по порядку.

Інтерфейс: Memo1 (TMemo), Button1 (TButton), ListBox1 (TListBox), Label1, Label2 (TLabel).

Спочатку перенесемо введений текст до змінної. Для того, щоб разом взяти весь текст із Memo, звернемося до властивості Lines.Text:

procedure TForm1.Button1Click (Sender: TObject); var Text: string; begin Text:=Memo1.Lines .Text ; end;

Тепер перейдемо до обробки. Перше, що потрібно зробити – розібратися із символами-розділювачами. Справа в тому, що такі символи можуть запросто йти поспіль, адже після ком, крапок та інших знаків ставиться пробіл. Обійти цю проблему можна таким простим способом: всі символи, що розділяють, замінимо на якийсь один, наприклад на кому. Для цього пройдемо всі символи та зробимо необхідні заміни. Щоб визначити, чи є символ роздільником, запишемо всі роздільники в окрему строкову змінну (константу), а потім шукатимемо в цьому рядку кожен символ функцією Pos(). Всі ці заміни будуть проводитися в змінній, щоб оригінальний текст в Memo (тобто на екрані) не торкнувся. Тим не менш, для перевірки проміжних результатів роботи є сенс виводити оброблений текст будь-куди. Наприклад, в іншому полі Memo. Щоб пройти всі символи, скористаємося циклом FOR, де змінна пройде порядкові номери символів, тобто. від 1 до довжини рядка тексту:

procedure TForm1.Button1Click (Sender: TObject); const DelSym = ".,!?" ; var Text: string; i: integer; begin Text:=Memo1.Lines .Text ; for i:= 1 до Length (Text) до if Pos (Text[ i] ,DelSym) > 0 then Text[ i] :="," ; Memo2.Text :=Text; end;

Тепер потрібно усунути перешкоди. По-перше, перший символ не може бути роздільником, тобто. якщо перший символ - кома, його потрібно видалити. Далі, якщо поспіль йдуть кілька ком, їх потрібно замінити на одну. І нарешті, щоб коректно обробити весь текст, останнім символом має бути кома.

if Text [1] = "," then Delete (Text, 1, 1); while Pos (",", Text) > 0 do Delete (Text, Pos (",", Text), 1); if Text[ Length (Text) ]<>"," then Text:=Text+"," ;

Тут заміна проведена наступним чином: організований цикл, в якому одна з ком видаляється, але відбувається це доти, поки в тексті є дві коми, що йдуть поспіль.

Ну от тепер у тексті не залишилося нічого зайвого - тільки слова, розділені комами. Спочатку досягнемо того, щоб програма витягла з тексту перше слово. Для цього знайдемо першу кому, скопіюємо слово від початку тексту до цієї коми, після чого видалимо це слово з тексту разом із комою. Видалення робиться для того, щоб далі можна було, проробивши ту ж операцію, вирізати наступне слово.

var Word: string; (...) Word:=Copy (Text,1 ,Pos ("," ,Text) -1 ) ; Delete (Text,1, Length (Word) +1);

Тепер у змінній Wordу нас слово з тексту, а у змінній Textрешта тексту. Вирізане слово тепер додаємо в ListBox, викликаючи ListBox.Items.Add(рядок_для_додавання).

Тепер нам потрібно організувати такий цикл, який би дозволив вирізати з тексту всі слова, а не тільки перше. В даному випадку підійде швидше REPEATчим WHILE. Як умову слід вказати Length(Text) = 0, тобто. завершити цикл тоді, коли текст стане пустим, тобто. коли ми виріжемо з нього усі слова.

repeat Word:=Copy (Text,1, Pos (",",Text) -1); Delete (Text,1, Length (Word) +1); ListBox1.Items .Add (Word); until Length (Text) = 0;

Отже, зараз маємо:

procedure TForm1.Button1Click (Sender: TObject); const DelSym = ".,!?" ; var Text,Word: string; i: integer; begin Text:=Memo1.Lines .Text ; for i:= 1 до Length (Text) до if Pos (Text[ i] ,DelSym) > 0 then Text[ i] :="," ; if Text [1] = "," then Delete (Text, 1, 1); while Pos (",", Text) > 0 do Delete (Text, Pos (",", Text), 1); repeat Word :=Copy (Text,1 ,Pos ("," ,Text) -1 ) ; Delete (Text,1, Length (Word) +1); ListBox1.Items .Add (Word); until Length (Text) = 0; end;

Якщо ви зараз запустите програму, то побачите, що все добре працює. За винятком одного моменту – у ListBox наприкінці з'явилися якісь порожні рядки... Виникає питання: звідки вони взялися? Про це ви дізнаєтеся в наступному розділі уроку, а поки що реалізуємо необхідне до кінця.

Кількість слів у тексті визначити дуже просто – не потрібно заново нічого писати. Т.к. слова у нас занесені до ListBox, досить просто дізнатися, скільки там рядків - ListBox.Items.Count.

Label1.Caption := "Кількість слів у тексті: "+ IntToStr (ListBox1.Items .Count);

Тепер потрібно знайти найдовше з усіх слів. Алгоритм знаходження максимального числа такий: приймаємо як максимальне перше з чисел. Потім перевіряємо решту числа таким чином: якщо число більше того, яке зараз записано як максимальне, робимо максимальним це число. У нашому випадку слід шукати максимальну довжину слова. Для цього можна додати код до циклу вирізання слів з тексту або зробити пошук після додавання всіх слів до ListBox. Зробимо другим способом: організуємо цикл рядками ListBox. Слід зазначити, що рядки нумеруються з нуля, а чи не з одиниці! В окремій змінній зберігатимемо найдовше слово. Здавалося б, треба ще зберігати максимальну довжину слова, щоб було з чим порівнювати ... Але не потрібно заводити для цього окрему змінну, адже ми завжди можемо дізнатися довжину слова функцією Length (). Отже, припустимо, що перше слово найдовше...

var LongestWord: string ; (...) LongestWord:=ListBox1.Items [0]; for i:= 1 to ListBox1.Items .Count -1 до if Length (ListBox1.Items [ i] ) > Найдовше слово:+LongestWord+" (" +IntToStr (Length (LongestWord) ) + "літер)" ;

Чому цикл до ListBox.Items.Count-1, а не просто до Count, розберіться самостійно:-)

Ось тепер все готове!

procedure TForm1.Button1Click (Sender: TObject); const DelSym = ".,!?" ; var Text,Word ,LongestWord: string ; i: integer; begin Text:=Memo1.Lines .Text ; for i:= 1 до Length (Text) до if Pos (Text[ i] ,DelSym) > 0 then Text[ i] :="," ; if Text [1] = "," then Delete (Text, 1, 1); while Pos (",", Text) > 0 do Delete (Text, Pos (",", Text), 1); Text:=AnsiReplaceText(Text,Chr(13),""); Text:=AnsiReplaceText(Text,Chr(10),""); repeat Word :=Copy (Text,1 ,Pos ("," ,Text) -1 ) ; Delete (Text,1, Length (Word) +1); ListBox1.Items .Add (Word); until Length (Text) = 0; Label1.Caption := "Кількість слів у тексті: "+ IntToStr (ListBox1.Items .Count); LongestWord:=ListBox1.Items [0]; for i:= 1 to ListBox1.Items .Count -1 до if Length (ListBox1.Items [ i] ) > Length (LongestWord) then LongestWord:=ListBox1.Items [ i] ; Label2.Caption := Найдовше слово:+LongestWord+" (" +IntToStr (Length (LongestWord) ) + "літер)" ; end;

Робота із символами

Власне, робота із символами зводиться до використання двох основних функцій. Ord()і Chr(). З ними ми зустрічалися. Функція Ord()повертає код вказаного символу, а функція Chr()- навпаки, повертає символ із зазначеним кодом.

Пам'ятайте Таблиця символів"? Давайте зробимо її самі!"

Висновок здійснимо в TStringGrid. Цей компонент є таблицею, де в кожному осередку записано текстове значення. Компонент розташований на вкладці Additional(за замовчуванням слід прямо за Standard). Насамперед налаштуємо нашу табличку. Нам потрібні лише дві колонки: в одній відображатимемо код символу, а в іншій - сам символ. Кількість колонок задається у властивості з логічною назвою ColCount. Встановлюємо його рівним 2. За замовчуванням у StringGridвстановлено один фіксований стовпець і один фіксований рядок (вони відображаються сірим кольором). Стовпець нам не потрібний, а ось рядок дуже доречний, тому ставимо FixedCols= 0, а FixedRowsзалишаємо = 1.

Заповнення здійснимо при запуску програми, тобто. не ставитимемо жодних кнопок. Отже, створюємо обробник події OnCreate()форми.

Кількість символів у кодовій таблиці 256 плюс заголовок - всього 257. Задамо число рядків програмно (хоча можна задати і в Інспекторі Об'єкта):

procedure TForm1.FormCreate (Sender: TObject); begin StringGrid1.RowCount :=257 ; end;

Висновок робиться вкрай просто – за допомогою циклу. Просто проходимо числа від 0 до 255 та виводимо відповідний символ. Також виводимо написи у заголовок. Доступ до осередків StringGridздійснюється за допомогою властивості Cells: Cells[номер_стовпця,номер_рядка]. У квадратних дужках зазначаються номери стовпця та рядки (починаються з нуля). Значення текстові.

procedure TForm1.FormCreate (Sender: TObject); var i: Integer; begin StringGrid1.RowCount :=257 ; StringGrid1.Cells [0,0]: = "Код"; StringGrid1.Cells [1,0]: = "Символ"; for i:= 0 to 255 do begin StringGrid1.Cells [ 0 ,i+1 ] :=IntToStr (i) ; StringGrid1.Cells [1, i + 1]: = Chr (i); end; end;

Запускаємо, дивимось.

Спеціальні символи

Якщо ви уважно подивіться на нашу таблицю, побачите, що багато символів відображаються у вигляді квадратиків. Ні, це не значки. Так відображаються символи, які не мають візуального відображення. Тобто. символ, наприклад, з кодом 13 існує, але невидимий. Ці символи використовуються для додаткових цілей. Наприклад, символ #0 (тобто символ із кодом 0) часто застосовується для вказівки відсутності символу. Існують також рядки, які називають null-terminated- Це рядки, що закінчуються символом #0. Такі рядки використовуються у мові Сі.
За кодами можна впізнати натискання кнопок. Наприклад, кнопка Enter має код 13, Escape - 27, пропуск - 32, Tab - 9 і т.д.
Давайте додамо до нашої програми можливість дізнатися код будь-якої клавіші. Для цього обробимо подію форми OnKeyPress(). Щоб цей механізм працював, необхідно встановити у форми KeyPreview = True.

procedure TForm1.FormKeyPress (Sender: TObject; var Key: Char); begin ShowMessage( "Код натиснутої кнопки: "+ IntToStr (Ord (Key))); end;

Тут ми виводимо віконце з текстом. У події є змінна Key, в якій зберігається символ, який відповідає натиснутій клавіші. За допомогою функції Ord()дізнаємося код цього символу, а потім функцією IntToStr()перетворимо це число на рядок.

Приклад "серйозніший" - продовження

Повернемося до нашого прикладу. Настав час з'ясувати, звідки до ListBox беруться порожні рядки. Справа в тому, що вони не зовсім порожні. Так, візуально вони порожні, але насправді в кожній із них по 2 спеціальні символи. Це символи з кодами 13 та 10 (тобто рядок #13#10). У Windows така послідовність цих двох невізуальних символів означає кінець поточного рядка та початок нового рядка. Тобто. у будь-якому файлі і взагалі будь-де перенесення рядків - це два символи. А весь текст відповідно залишається безперервною послідовністю символів. Ці символи можна (і навіть потрібно) використовувати у випадках, коли потрібно вставити перенесення рядка. Докладніше про це можна прочитати у статті. Знань, здобутих у всіх попередніх уроках, і в тому числі цілком достатньо для розуміння цієї статті - вона зовсім невелика.

Доведемо нашу програму пошуку слів до логічного кінця. Отже, щоб позбавитися порожніх рядків, нам потрібно видалити з тексту символи #13 і #10. Зробити це можна за допомогою циклу, за аналогією з тим, як ми робили заміну двох ком на одну:

while Pos (Chr (13), Text) > 0 do Delete (Text, Pos (Chr (13), Text), 1); while Pos (Chr (10), Text) > 0 do Delete (Text, Pos (Chr (10), Text), 1);

Ну ось – тепер програма повністю працездатна!

Додаткові функції для роботи з рядками – модуль StrUtils

Додатковий модуль StrUtils.pasмістить додаткові функції для роботи з рядками. Серед цих функцій багато корисних. Докладніше деякі з функцій розглянуті у статті. А ось короткий опис функцій, що часто використовуються:

PosEx(підрядок, рядок, відступ) - функція, аналогічна функції Pos()але виконує пошук із зазначеної позиції (тобто з відступом від початку рядка). Наприклад, якщо ви хочете знайти в рядку другий пробіл, а не перший, без цієї функції вам не обійтися. Щоб зробити пошук другого пропуску вручну, потрібно попередньо вирізати частину вихідного рядка.

AnsiReplaceStr, AnsiReplaceText (рядок, текст_1, текст_2) - функції виконують заміну в рядку рядокрядки текст_1на текст_2. Функції відрізняються лише тим, що перша веде заміну з урахуванням регістру символів, а друга без нього.
У нашій програмі можна використовувати ці функції для вирізання з рядка символів #13 і #10 - для цього як текст для заміни слід вказати порожній рядок. Ось рішення в один рядок коду:

Text:=AnsiReplaceText(AnsiReplaceText(Text,Chr(13),""),Chr(10),"");

DupeString(рядок, число_повторень) - формує рядок, що складається з рядка рядокшляхом повторення її задану кількість разів.

ReverseString(рядок) - інвертує рядок (" 123 " -> "321 ").

Також слід згадати у функціях перетворення регістру.

UpperCase(рядок) - перетворює рядок у верхній регістр; LowerCase(рядок) - перетворює рядок на нижній регістр.

Для перетворення окремих символів слід використовувати ці функції.

Детальну інформацію про кожну функцію можна отримати, ввівши її назву в будь-якому місці редактора коду, встановивши курсор на цю назву (або виділивши його) та натиснувши F1.

Скріншоти програм, описаних у статті