вівторок, 14 лютого 2017 р.

Пошук слів та виділення кольором

Це відео буде доволі насиченим. Головна мета – це змусити програму шукати певні слова у тексті, але крім цього ми розглянемо створення масивів, виділення кольором у тексті, а також познайомимося з регулярними виразами. Отож, почнемо.

Усім нам відома програма «Word», у якій функція пошуку реалізована доволі зручно. Наприклад, текст, який необхідно знайти, виділяється на сторінках жовтим кольором. Ми спробуємо це відтворити.
Вибираємо шаблон «Застосунки Windows Forms», вводимо ім’я нашого проекту (наприклад, «TextEditor») та натискаємо на кнопку «окей».
Нам знадобляться 3 графічні елементи керування: по-перше, кнопка (Button); по-друге, текстове поле, куди користувач буде вводити слова, які необхідно знайти; і по-третє, RichTextBox, в якому буде міститися сам текст.
Одразу слід зазначити, що ми дозволимо користувачу шукати як одне слово, так і декілька. Наприклад, користувач введе два слова для пошуку, розділені комою без пробілу. Щоб шукати кожне з цих слів, необхідно створити масив рядків, в якому кожному рядку відповідатиме одне слово для пошуку.
Тепер почнемо власне програмувати. Натискаємо двічі на кнопку.
Щоб створити масив рядків необхідно ввести тип змінної – «string», а потім поставити квадратні дужки. Тепер вводимо назву масиву і присвоюємо йому значення, в даному випадку – «textBox1.Text». Щоб поділити суцільний рядок на слова, необхідно використати метод Split. Відкриваємо дужку. Тепер необхідно вказати масив символів, які розділяють слова. Оскільки рядок буде поділено на слова лише один раз, то немає необхідності створювати окремий масив символів. Тому введемо ключове слово «new» та тип змінної «char», тобто символ. Відкриваємо-закриваємо квадратні дужки, щоб показати що це масив. Щоб одразу задати значення у масиві, запишемо їх у фігурних дужках (а точніше його, оскільки нам потрібна буде лише кома). Символи, на відміну від рядків, слід записувати не у лапках, а між двома апострофами. Закриваємо фігурну дужку. Ми б могли зараз закрити дужку і поставити крапку з комою, але ми поставимо кому і надрукуємо «StringSplitOptions.RemoveEmptyEntries». Це потрібно для того, щоб прибрати пусті елементи з масиву. Справа в тому, що користувач може ввести дві коми підряд, і тоді програма дарма виконає зайву послідовність подій.

Слова мають бути розділені комою без пробілу

Так виглядає введення необхідних слів для пошуку. Потім користувач має натиснути на кнопку. Втім, візуально ще нічого не відбувається. Повернімося до коду.
Щоб пошук, який буде реалізовано пізніше, не починався щоразу з початку, треба запам’ятати позицію, з якої слід починати пошук. Тому створимо числову змінну «pos» (тобто позиція) = 0.
Оскільки програма виділятиме знайдені слова кольором, перед цим необхідно прибрати кольорове виділення, що могло вже бути в тексті до натиску на кнопку. Спочатку виділимо весь текст: «richTextBox1.SelectAll();» Після цього змінити колір фону виділеного тексту на білий. «richTextBox1.SelectionBackColor». Присвоїмо колір із колекції кольорів Color: «Color.White», який є стандартним кольором фону.
Тепер необхідно створити цикл, який виконається стільки разів, скільки є слів для пошуку. Вводимо: «foreach (string word in SearchWords)». Саму послідовність подій запишемо у фігурних дужках. В них створимо ще один цикл foreach. Другий цикл виконується стільки разів, скільки раз у тексті зустрічається конкретне слово для пошуку, наприклад перше слово зустрілось п’ять разів, друге – десять разів. Таким чином, перший цикл виконується два рази, а другий цикл – п’ятнадцять разів. Відкриваємо дужку. Зараз я швидко представлю інформацію про регулярні вирази.
Регулярний вираз (від англ. regular expression, скорочено Regex) — це рядок, що описує або збігається з множиною рядків, відповідно до набору спеціальних синтаксичних правил. Іншими словами, це шаблон для пошуку, за допомогою якого легко знайти необхідний відрізок тексту. Регулярний вираз у мові C# – це клас Regex, а результат окремого збігу регулярного виразу представлений класом Match.
Тому пишемо після дужки Match. Зараз виводиться помилка, оскільки за замовчанням простір імен для регулярних виразів не міститься у проекті. Натискаємо ПКМ – «Разрешить» – using System.Text.RegularExpressions;
Тепер проект розпізнає цей клас з простору імен регулярних виразів, який ми щойно додали у проект.
Вводимо будь-яку назву, наприклад «match», ключове слово «in», клас Regex.Matches. Matches – це колекція усіх збігів заданого шаблону в конкретному тексті. Відкриваємо дужку і вказуємо текст, у якому необхідно шукати (richTextBox1.Text). Ставимо кому і вводимо шаблон регулярного виразу для зіставлення. Друкуємо: @"\b
Равлик позначає, що рядок слід сприймати саме так, як він написаний. Це корисно, якщо у рядку є знаки форматування, такі як перенесення на новий рядок, табуляція тощо. \b означає, що для цього шаблону збіг має починатися з початку слова. Продовжуємо писати: (" + word + @")\b"))
Тепер розберемо, що ми написали: з таким шаблоном збіг у тексті починається на початку слова, яке необхідно було знайти, і закінчується з кінцем слова. Тобто, якщо ми шукаємо слово «то», в слові «ескалатор» не буде збігу. Простими словами, ми шукаємо лише ціле слово.
У фігурних дужках запишемо код, що виконається у циклі. pos = match.Index; Ми записуємо у змінну, що відповідає за позицію для наступного пошуку, позицію у тексті, де був знайдений збіг – це і є властивість Index.
Тепер скористаємося вже вбудованим методом richTextBox.Find, що знайде та виділить необхідний відрізок тексту. У дужках надрукуємо слово, яке необхідно знайти – word. Ставимо кому, пишемо pos – позиція з якої слід шукати. Ставимо кому і друкуємо: RichTextBoxFinds.WholeWord);
RichTextBoxFinds задає параметри пошуку тексту в елементі керування RichTextBox. WholeWord вказує, що слід знайти лише ціле слово.
Тепер, нарешті, виділимо кольором знайдений текст. richTextBox1.SelectionBackColor = Color.Yellow;
Завдяки жовтому кольору стає зрозуміло, що відповідає критеріям пошуку, а що ні. Наприклад, частина слова, чи навіть лише одна літера з нього не буде вважатися збігом, оскільки ми задали такі параметри.
Може здатися, що для того, щоб шукати не лише цілі слова, достатньо просто не вказувати параметр RichTextBoxFinds. Втім, це обов’язково, оскільки ми вказуємо позицію для пошуку, а її можна вказати у методі Find лише тоді, коли третім аргументом методу є певний параметр RichTextBoxFinds. Тому слід лише замінити  WholeWord після RichTextBoxFinds. на None. Тепер перевіримо, чи буде збіг у частині слова.
Програма й досі шукає лише цілі слова. Можна подумати, що слід обрати інший параметр RichTextBoxFinds чи взагалі просто не використовувати його. Але, як вже було сказано, без нього не обійтись. Та й проблема не в ньому. Саме в цьому випадку вирішальну роль грає шаблон регулярного виразу. Позиція для пошуку у RichTextBox береться з індексу збігу цього шаблону з текстом. Оскільки шаблон знаходить лише цілі слова, то й позиція для пошуку у RichTextBox знаходиться лише перед цілими словами.
Просто слід прибрати у шаблоні символи \b.
Тепер, коли ви знаєте, як налаштувати пошук на ціле слово або лише його частину. Оберіть той шаблон, що підходить саме Вам.
Цей проект, на відміну від попередніх, краще зберегти, оскільки пошук використовується дуже часто. І щоб не проходити цей процес кожного разу, Ви можете використати цей код як заготовку, змінюючи його відповідно до нових потреб. Крім того, у наступному відео буде використаний саме цей проект.

Я дякую Вам за увагу, шановні читачі!

середа, 8 лютого 2017 р.

Facebook та YouTube

Окрім самого блогу, також програмуванню на C# для початківців присвячені спільнота на Facebook та канал на YouTube.

вівторок, 7 лютого 2017 р.

Рядок стану та його графічні піделементи і властивості

У цьому відео я познайомлю Вас із графічним елементом StatusStrip – це рядок стану. Спочатку розглянемо приклад втілення RichTextBox та StatusStrip на прикладі програми «Блокнот».


 Біле текстове поле – це RichTextBox, який я розглянув у попередньому відео. Нижче ви можете бачити StatusStrip. В даному випадку рядок стану відображає поточний рядок та стовпець, тобто позицію курсору в даний момент. Зараз ми створимо дещо подібне.


 Вибираємо шаблон «Застосунки WindowsForms» та натискаємо на кнопку «окей».
Відкриваємо панель елементів, шукаємо елемент StatusStrip і перетягуємо його на нашу форму. Також нам знадобиться такий елемент керування, як RichTextBox.
Одразу слід сказати, що додати графічні елементи на рядок стану дуже легко. Натискаємо на стрілку та вибираємо потрібний елемент, в даному випадку – StatusLabel. Сюди буде виводитися кількість символів у текстовому полі. Додаємо другий StatusLabel, що відображатиме кількість рядків.
Текст в рядку стану повинен оновлюватися, коли змінюється текст у полі редагування. Тому слід використати подію TextChanged.
Перевіримо як називається елемент у рядку стану. Введемо: toolStripStatusLabel1.Text = richTextBox1. Довжина тексту RichTextBox зберігається у властивості TextLength. Тепер налаштуємо відображення кількості рядків. toolStripStatusLabel2.Text = richTextBox.Lines; Зараз рядок позначений як неправильний, оскільки Lines – це ціла колекція текстових значень, а не одне. Потрібна лише довжина колекції. Пишемо .Length; В обох рядках зараз помилка, оскільки ми присвоюємо властивості Text числові значення. Необхідно їх перевести у текстові за допомогою методу ToString();
Перевіримо.
Кількість відображається, але для користувача необхідно зробити пояснення перед цими числами. Після знаку дорівнює у лапках надрукуємо для кожного з елементів відповідне слово. Після цього ставимо знак плюс, що поєднає у властивості Text пояснення та число.
Тепер додамо у рядок стану інший елемент керування – SplitButton. За замовчання, на кнопці відображається малюнок, але ми замінимо його на текст. У властивості DisplayStyle виберемо Text замість Image. Тепер це більше схоже на звичайну кнопку. Зараз відредагуємо її текст. Припустімо, вона відповідає за масштабування. Введемо: Zoom. До її дочірніх елементів також будуть додані 2 кнопки. Просто почніть редагувати текстове поле. Дозволимо користувачу обирати між 2 варіантами: масштабування 100% або 50%. Натиснемо двічі на кнопку.
Пишемо: richTextBox.ZoomFactor = вводимо значення. Зауважте, ця властивість приймає значення float, тобто число з плаваючою точкою, а одиниця – це 100%. Отже, 50 – це 5 тис. %. Це нас не влаштовує, тому напишемо дробове число 0,5; Друге зауваження: для нецілих чисел потрібно використовувати крапку, а не кому. Третє зауваження: щоб значення сприймалося як float, необхідно вкінці дописати малу англійську літеру f;
Тепер дозволимо користувачу повернути масштабування за замовчанням. Напишемо аналогічний рядок коду, але значення можна задати просто як одиницю, тобто 100%.
Тепер розглянемо властивості StatusStrip. Перш за все, це властивість. що дозволяє або забороняє користувачу при натиску клавіші ALT змінювати порядок елементів у рядку стану. За замовчанням, це не дозволено. Встановимо значення true.
Затискаємо ALT.


Як бачимо, ми можемо змінювати порядок розташування.
Рядок стану має вже знайому вам властивість BackColor. Краще задати йому колір відмінний від того, що в текстовому полі.


Як бачите, цей елемент керування має значну кількість властивостей, що Ви вже бачили в інших графічних елементах. Наприклад, Font, Location, RightToLeft тощо.
Властивість SizingGip визначає наявність у рядку стану інструменту змінення розміру, що відображається у правому нижньому куті. За замовчанням, цей інструмент наявний, оскільки властивість дорівнює true.
Властивість Text хоч і наявна, але візуально не представлена.
Інший графічний елемент у рядку стану – DropDownButton, ще один різновид кнопки. За замовчанням, також відображається зображення, а не текст.
Ця кнопка буде містити дві дочірні. Введемо просто BUTTON. Дві інші кнопки – лише демонстративні, тому також назвемо їх просто: button1 та button2. Поглянемо, як це виглядає.


Як бачите, візуально, DropDownButton дещо відрізняється від SplitButton. Ще більше ця кнопка відрізняється від двох вже доданих лейблів.
Сам StatusStrip ми розглянули. Цей графічний елемент керування бажано використовувати у редакторі тексту.

Я дякую Вам за увагу, шановні читачі!