Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лекція 6 Шрифти та рядки У цій лекції ви ознайомитеся зі строковим типом даних клас String а також з управл

Работа добавлена на сайт samzan.net:


Лекція №6. Шрифти та рядки

У цій лекції ви ознайомитеся зі строковим типом даних (клас String), а також з управлінням відображення текстової інформації в програмах Juce (клас Font).

Мета лекції: Дати базові уявлення про роботу з текстом в Juce

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

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

Для роботи зі шрифтами в Juce існує спеціальний клас, Font. Ми вже використовували його в попередніх лекціях. Об'єкт цього класу передається як параметр в метод setFont () різних компонентів (Label, TextEditor, HyperlinkButton та ін.) Клас Component методу setFont () не має.

Основні властивості комп'ютерних шрифтів запозичені з типографського справи. Ними є наступні:

• Typeface - гарнітура або зовнішній вигляд шрифту, який визначається набором символів, що мають стилістична єдність. Повертається методом Typeface * Font :: getTypeface () const. Якщо потрібно отримати не сам об'єкт гарнітури, а тільки її назву для поточного шрифту (рядок), то можна скористатися методом const String & Font :: getTypefaceName () const throw ().

• Висота шрифту в пікселях. Повертається методом float Font :: getHeight () const throw ().

• Стиль шрифту: нормальний, напівжирний, курсив і підкреслений. Клас Font включає нумерований список enum FontStyleFlags {plain = 0, bold = 1, italic = 2, underlined = 4}, елементи якого відповідають вищепереліченим стилям.

• Якщо програма Juce не може знайти шрифт із заданою комбінацією властивостей, то використовується інший шрифт, далеко не завжди близький за властивостями. Тому можна скористатися методами класу Font для отримання назв гарнітур шрифтів, що використовуються за умовчанням в даній операційній системі:

• static const String Font :: getDefaultMonospacedFontName () - повертає ім'я гарнітури моношириного рубаного шрифту, використовуваного за замовчуванням;

• static const String Font :: getDefaultSerifFontName () - повертає ім'я гарнітури шрифту з засічками (Serif), використовуваного за замовчуванням;

• static const String Font :: getDefaultSansSerifFontName () - повертає ім'я гарнітури рубаного шрифту (Sans), використовуваного за замовчуванням.

За замовчуванням для всіх компонентів Juce задається нормальний (стиль plain) шрифт гарнітури Sans розміром 15 пікселів.

В більшості текстових редакторів задається кегль шрифту - розмір висоти символів, вимірюваний в типографських пунктах. У Juce висота шрифту, що задається методом void Font :: setHeight (float newHeight), як згадувалося, вимірюється в пікселях. Отримати її, виходячи з заданого користувачем кегля в типографських пунктах, можна за формулою:

Висота (пікселі) = Кегль (пункти) ? DPI / 72,

де DPI (dots per inch) - кількість пікселів на дюйм, залежне від характеристик монітора.

Розглянемо роботу зі шрифтами на прикладі демонстраційного додатка (рис. 6.1).

Рис. 6.1. Демонстраційний додаток властивостей шрифту

У додатку текст з поля введення (TextEditor * pFontViewer) відображається шрифтом, гарнітура і розмір якого вибираються користувачем з випадаючих списків (ComboBox * pFontsBox і ComboBox * pFontSizeBox, відповідно). Стиль шрифту задається перемиканням радокнопок: ToggleButton * pNormalButton - для нормального стилю, ToggleButton * pBoldButton - для напівжирного стилю, ToggleButton * pItalicButton - для курсиву. Поточний шрифт, використовуваний для відображення тексту в полі введення, будемо зберігати в закритому члені класу компонента вмісту, Font CurrentFont (приклад 6.1).

#ifndef _TCentralComponent_h_

#define _TCentralComponent_h_

//-------------------------------------------------------

#include "../JuceLibraryCode/JuceHeader.h"

//-------------------------------------------------------

// Клас компонента вмісту.

// Успадковує класи слухачів випадаючих списків і кнопок

class TCentralComponent  : public Component,

         public ComboBoxListener,

         public ButtonListener

{

public:

 TCentralComponent();

 ~TCentralComponent();

 void paint(Graphics&);

 void resized();

 // Функція, що відслідковує зміни у випадних списках

 void comboBoxChanged(ComboBox*);

 // Функція, що відслідковує клацання по кнопці

 void buttonClicked(Button*);

private:

 // Поточний шрифт тексту, відображуваного

в TextEditor

 Font CurrentFont;

 

 // Багаторядкове поле введення

 TextEditor* pFontViewer;

 Label* pFontNameLabel;

 // Вибір гарнітури шрифту

 ComboBox* pFontsBox;

 Label* pFontSizeLabel;

 // Вибір розміру (кегля) шрифту

 ComboBox* pFontSizeBox;

 Label* pFontStyleLabel;

 GroupComponent* pFontGroup;

 // Радіокнопка вибору стилю нормального шрифту

 ToggleButton* pNormalButton;

 // Радіокнопка вибору стилю напівжирного шрифту

 ToggleButton* pBoldButton;

 // Радіокнопка вибору стилю курсиву

 ToggleButton* pItalicButton;

 // Запобігає створення копії конструктора і оператора =

 TCentralComponent(const TCentralComponent&);

 const TCentralComponent& operator= (const TCentralComponent&);

};

//----------------------------------------------------

#endif

Лістинг 6.1. Оголошення класу компонента вмісту TCentralComponent (файл TCentralComponent.h)

Реалізація класу компонента вмісту досить велика, тому розглянемо її по частинах. У конструкторі класу додамо і зробимо видимими поле введення, ярлики, випадаючі списки, груповий блок (GroupComponent * pFontGroup), об'єднуючий раніше згадувані радіокнопки (приклад 6.2).

#include "TCentralComponent.h"

//--------------------------------------------------------

#define tr(s) String::fromUTF8(s)

//--------------------------------------------------------

TCentralComponent::TCentralComponent() : Component("Central Component"),

          pFontViewer(0),

          pFontNameLabel(0),

          pFontsBox(0),

          pFontSizeLabel(0),

          pFontSizeBox(0),

          pFontStyleLabel(0),

          pFontGroup(0),

          pNormalButton(0),

          pBoldButton(0),

          pItalicButton(0)

{

 pFontViewer = new TextEditor("FontViewer");

 // Поле введення - багаторядкові

 pFontViewer->setMultiLine(true);

 // Новий рядок при натисканні клавіші <ENTER>

 pFontViewer->setReturnKeyStartsNewLine(true);

 // Заборона на редагування

 pFontViewer->setReadOnly(true);

 // Показати смуги прокрутки

 pFontViewer->setScrollbarsShown(true);

 pFontViewer->setText(tr("З'їж ж ще цих м'яких французьких булок да випий чаю\n1234567890\n`~@#$%^&*()-_=+\\|{[]};:'\"/?"));

 addAndMakeVisible(pFontViewer);

 pFontNameLabel = new Label("FontNameLabel", tr("Гарнітура (вид) шрифту

"));

 pFontNameLabel->setFont(Font(15.0000f, Font::plain));

 pFontNameLabel->setJustificationType(Justification::centredLeft);

 pFontNameLabel->setEditable(false, false, false);

 pFontNameLabel->setColour(Label::textColourId, Colours::black);

 pFontNameLabel->setColour(Label::backgroundColourId,

         Colour(Colours::azure));

 addAndMakeVisible(pFontNameLabel);

 

 pFontsBox = new ComboBox("FontsBox");

 // Заборона на редагування тексту у випадному списку

 pFontsBox->setEditableText(false);

 // Вирівнювання тесту по лівому краю і центру віджета

 pFontsBox->setJustificationType(Justification::centredLeft);

 pFontsBox->setTextWhenNothingSelected(tr("Стандартний шрифт"));

 // Встановлюємо в якості слухача списку

 // сам компонент-контейнер

 pFontsBox->addListener (this);

 addAndMakeVisible(pFontsBox);

 

 // Отримуємо імена системних шрифтів, зберігаємо їх 

 // в строковому масиві...

 StringArray sSystemFonts = Font::findAllTypefaceNames();

 // і додаємо в список, що випадає

 for(int i = 0; i < sSystemFonts.size(); i++)

 {

   pFontsBox->addItem(sSystemFonts[i], i + 1);

 }

 pFontSizeLabel = new Label("FontSizeLabel", tr("Розмір (кегль) шрифта"));

 pFontSizeLabel->setFont(Font(15.0000f, Font::plain));

 pFontSizeLabel->setJustificationType(Justification::centredLeft);

 pFontSizeLabel->setEditable(false, false, false);

 pFontSizeLabel->setColour(Label::textColourId, Colours::black);

 pFontSizeLabel->setColour(Label::backgroundColourId,

         Colour(Colours::azure));

 addAndMakeVisible(pFontSizeLabel);

 

 pFontSizeBox = new ComboBox("FontSizeBox");

 pFontSizeBox->setEditableText(false);

 pFontSizeBox->setJustificationType(Justification::centredLeft);

 pFontSizeBox->setTextWhenNothingSelected(tr("Розмер по умолчанию"));

 pFontSizeBox->addItem("8", 1);

 pFontSizeBox->addItem("9", 2);

 pFontSizeBox->addItem("10", 3);

 pFontSizeBox->addItem("11", 4);

 pFontSizeBox->addItem("12", 5);

 pFontSizeBox->addItem("13", 6);

 pFontSizeBox->addItem("14", 7);

 pFontSizeBox->addItem("15", 8);

 pFontSizeBox->addItem("16", 9);

 pFontSizeBox->addItem("17", 10);

 pFontSizeBox->addItem("18", 11);

 pFontSizeBox->addItem("19", 12);

 pFontSizeBox->addItem("20", 13);

 // Встановлюємо в якості слухача списку

 // сам компонент-контейнер

 pFontSizeBox->addListener (this);

 addAndMakeVisible(pFontSizeBox);

 

 pFontStyleLabel = new Label("FontStyleLabel", tr("Стиль шрифту"));

 pFontStyleLabel->setFont(Font(15.0000f, Font::plain));

 pFontStyleLabel->setJustificationType(Justification::centredLeft);

 pFontStyleLabel->setEditable(false, false, false);

 pFontStyleLabel->setColour(Label::textColourId, Colours::black);

 pFontStyleLabel->setColour(Label::backgroundColourId,

         Colour(Colours::azure));

 addAndMakeVisible(pFontStyleLabel);

 

 pFontGroup = new GroupComponent("FontGroup", tr("Шрифт"));

 pFontGroup->setTextLabelPosition(Justification::centredLeft);

 addAndMakeVisible(pFontGroup);

 

 pNormalButton = new ToggleButton("NormalButton");

 pNormalButton->setButtonText(tr("Нормальний"));

 // Встановлюємо в якості слухача кнопки

 // сам компонент-контейнер

 pNormalButton->addListener(this);

 // радіокнопка відзначена

 pNormalButton->setToggleState(true, false);

 pNormalButton->setRadioGroupId(1234);

 addAndMakeVisible(pNormalButton);

 

 pBoldButton = new ToggleButton("BoldButton");

 pBoldButton->setButtonText(tr("Полужирний"));

 pBoldButton->addListener(this);

 // радіокнопка відзначена

 pBoldButton->setToggleState(false, false);

 pBoldButton->setRadioGroupId(1234);

 addAndMakeVisible(pBoldButton);

 

 pItalicButton = new ToggleButton("ItalicButton");

 pItalicButton->setButtonText(tr("Курсив"));

 pItalicButton->addListener(this);

 pItalicButton->setToggleState(false, false);

 pItalicButton->setRadioGroupId(1234);

 addAndMakeVisible(pItalicButton);

 setSize (600, 400);

}

//------------------------------------------------------

Лістинг 6.2. конструктор класу  TCentralComponent (файл TCentralComponent.cpp)

Назви гарнітур системних шрифтів ми отримуємо за допомогою методу static const StringArray Font :: findAllTypefaceNames (), який повертає масив рядків (клас StringArray Juce), що містить ці назви. Число елементів масиву повертається його методом int StringArray :: size () const throw (). У циклі

for (int i = 0; i <sSystemFonts.size (); i + +)

{

    pFontsBox-> addItem (sSystemFonts [i], i + 1);

}

ми перебираємо по одному елементи списку і додаємо їх в якості елементів випадаючого списку pFontsBox.

Елементи списку розміру шрифтів (pFontSizeBox) додаємо в діапазоні від 8 до 20 пунктів.

Зауважимо, що в Juce груповий блок служить виключно у якості елемента оформлення; радіокнопки, що малюються на його поверхні, не є його нащадками, а являють собою самостійні віджети. Для того, щоб об'єднати їх в одну групу, необхідно скористатися методом void Button :: setRadioGroupId (int newGroupId). Якщо метод у декількох радіокнопок приймає як параметр якесь одне, відмінне від нуля, число, то ці кнопки починають діяти як єдина радіогрупа, тобто можливе включення однієї і тільки однієї кнопки з набору. В якості ID для нашої радіогрупи використовується число 1234.

Деструктор та методи перемальовування і завдання розмірів нашого класу наведені в лістингу 6.3.

TCentralComponent::~TCentralComponent()

{

 // Видаляємо дочірні віджети

 // і обнуляем їх покажчики

 deleteAllChildren();

}

//-------------------------------------------------

void TCentralComponent::paint(Graphics& Canvas)

{

 Canvas.fillAll(Colours::azure);

}

//-------------------------------------------------

void TCentralComponent::resized()

{

 pFontViewer->setBounds(proportionOfWidth(0.5505f), 8,    

           proportionOfWidth(0.4192f),

           proportionOfHeight(0.9507f));

 pFontNameLabel->setBounds(8, 8,       

           roundFloatToInt((proportionOfWidth(0.4192f)) *  

           1.2048f), 25);

 pFontsBox->setBounds(8, 38,

           roundFloatToInt((proportionOfWidth(0.4192f)) *

           1.2048f), 25);

 pFontSizeLabel->setBounds (8, 68,

           roundFloatToInt((proportionOfWidth(0.4192f)) *

           1.2048f), 25);

 pFontSizeBox->setBounds(8, 96,

           roundFloatToInt((proportionOfWidth(0.4192f)) *

           1.2048f), 25);

 pFontStyleLabel->setBounds(8, 126,

            roundFloatToInt((proportionOfWidth(0.4192f)) *

            1.2048f), 25);

 pFontGroup->setBounds(8, 156,

            roundFloatToInt((proportionOfWidth(0.4192f)) *

            1.2048f), 196);

 pNormalButton->setBounds(32, 185, 150, 25);

 pBoldButton->setBounds(32, 216, 150, 25);

 pItalicButton->setBounds(32, 248, 150, 25);

}

Лістинг 6.3. Деструктор та методи paint і resize класу TCentralComponent (файл TCentralComponent.cpp 

Для завдання відносних горизонтальних розмірів віджетів ми використовували вже знайому функцію int Component :: proportionOfWidth (float proportion) const throw (). Для перетворення чисел з плаваючою точкою, одержуваних після розрахунку координат компонентів, в цілі використана функція з juce_MathsFunctions.h int roundFloatToInt (const float value) throw ().

Як видно з рисунку 6.1, гарнітура і розмір шрифту тексту, відображуваного в багаторядковому текстовому полі TextEditor * pFontViewer, вибираються користувачем з випадаючих списків. Оскільки сам компонент-контейнер TCentralComponent є слухачем змін списків (ComboBoxListener), в його класі ми перевизначати наслідувану від класу linstener'а віртуальну функцію virtual void ComboBox :: Listener :: ComboBoxChanged (ComboBox * ComboNoxThatHasChanged), яка відповідає за реакцію програми на вибір користувача . Її реалізація приведена в лістингу 6.4.

void TCentralComponent::comboBoxChanged(ComboBox* pComboBox)

{

 // Змінено випадаючий список гарнітури шрифту

 if(pComboBox == pFontsBox)

 {

   // Встановлюємо в якості шрифту тексту поля введення

   // шрифт, вибраний користувачем зі списку

   CurrentFont.setTypefaceName(pFontsBox->getText());

 }

 // Змінено випадаючий список розміру шрифту

 else if(pComboBox == pFontSizeBox)

 {

   // Обчислюємо розмір шрифту в пікселях,

   // виходячи з обраного користувачем кегля в типографських пунктах

   float fFontHeight = pFontSizeBox->getText().getFloatValue() * 96

   / 72;

   // Встановлюємо розмір шрифту

   CurrentFont.setHeight(fFontHeight);

 }

 // Задаємо шрифт для відображення тексту

 pFontViewer->applyFontToAllText(CurrentFont);

}

Лістинг 6.4. Реалізація функції void ComboBoxChanged (ComboBox *) класу компонента вмісту TCentralComponent (файл TCentralComponent.cpp)

Після того, як користувач вибрав який не будь пункт у випадаючому списку, що відображає текст віджета змінюється відповідно до напису обраного пункту. Отримати цей текст можна за допомогою функції const String ComboBox :: getText () const. У разі першого списку (pFontsBox) це буде назва вибраної користувачем гарнітури шрифту.

Цю назву передаємо в якості параметра в функцію void void Font :: setTypefaceName (const String & faceName). Як зрозуміло з назви, вона встановлює гарнітуру викликав шрифту (об'єкт класу Font) з назвою, відповідним рядку-параметру. Якщо гарнітура з такою назвою не буде знайдена (шрифт не встановлений на комп'ютері), то буде використовуватися шрифт за умовчанням. У нашому випадку такого відбуватися не повинно, тому що користувач вибирає з раніше знайдених назв шрифтів, встановлених в системі.

У другому випадаючому списку, pFontSizeBox, користувач вибирає розмір (кегль) шрифту в друкарських пунктах. Як уже згадувалося, функція const String ComboBox :: getText () const повертає рядок поточного тексту списку, об'єкт класу String. Для того, щоб перетворити рядок в текст, досить викликати метод float String :: getFloatValue () const throw (), який перетворює рядок у число із плаваючою крапкою. Після цього можна розрахувати висоту шрифту в пікселях, виходячи з згадуваної вище формули і задати її для використовуваного шрифту за допомогою функції void Font :: setHeight (float newHeight)

Тепер можна використовувати шрифт із заданими користувачем параметрами для відображення тексту в багаторядковому полі введення pFontViewer. У класу TextEditor є для цього два методи:

• void TextEditor :: setFont (const Font & newFont), який встановлює шрифт для знову доданого в поле тексту;

• void TextEditor :: applyFontToAllText (const Font & newFont), який застосовує параметри шрифту до всього тексту поля введення.

Зрозуміло, що в нашому випадку підходить саме другий метод

Задати стиль тексту в нашій демонстраційній програмі користувач може за допомогою трьох радіокнопок, які ми віднесли до однієї групи з ID 1234. Це забезпечує вибір однієї і тільки однієї радіокнопки.

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

• void Font :: setBold (bool shouldBeBold) - задає напівжирне накреслення шрифту;

• void Font :: setItalic (bool shouldBeItalic) - задає курсивне накреслення шрифту;

• void Font :: setUnderline (bool shouldBeUnderline) - задає підкреслене накреслення шрифту.

Значення прийнятого параметра, рівне true, задає відповідний стиль шрифту, а рівне false - його скасовує. Спеціальною функцію для завдання нормального стилю шрифту в Juce немає; для того, щоб шрифт відображався нормальним накресленням, необхідно відмінити всі інші стилі за допомогою вищенаведених функцій.

Для того, щоб дізнатися, який стиль використовується шрифтом, в класі Font бібліотеки Juce є наступні методи:

• bool Font :: isBold () const throw ();

• bool Font :: isItalic () const throw ();

• bool Font :: isUnderlined () const throw ().

У тому випадку, якщо функція повертає істину, накреслення шрифту є напівжирним, курсивним або підкресленим, відповідно.

Спробуємо застосувати ці відомості в нашій програмі (див. перший варіант реалізації функції void TCentralComponent :: buttonClicked (Button * pButton) в (приклад 6.5).

void TCentralComponent::buttonClicked(Button* pButton)

{

 if (pButton == pNormalButton)

 {

   if(CurrentFont.isBold())

   {

     CurrentFont.setBold(false);

   }

   else if(CurrentFont.isItalic())

   {

     CurrentFont.setItalic(false);  

   }

 }

 else if (pButton == pBoldButton)

 {

   if(CurrentFont.isItalic())

   {

     CurrentFont.setItalic(false);

   }

   CurrentFont.setBold(true);

 }

 else if (pButton == pItalicButton)

 {

   if(CurrentFont.isBold())

   {

     CurrentFont.setBold(false);

   }

   CurrentFont.setItalic(true);

 }

 pFontViewer->applyFontToAllText(CurrentFont);

}

Лістинг 6.5. Перший варіант реалізації функції buttonClicked класу компонента вмісту TCentralComponent 

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

CurrentFont.setBold (true);

CurrentFont.setItalic (true);

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

Для того, щоб задати один і тільки один стиль шрифту, потрібно скористатися прапорами стилю (згадуваний вище перерахований тип FontStyleFlags. Вони приймаються в якості параметра функцією void Font :: setStyleFlags (int newFlags), яка змінює стиль викликаного шрифту. Комбінація стилів в цій функції задається операцією побітового складання (|).

Перепишемо реалізацію функції TCentralComponent :: buttonClicked (Button * pButton). Код став значно компактніше при збереженні функціональності програми.

void TCentralComponent::buttonClicked(Button* pButton)

{

 if (pButton == pNormalButton)

 {

   // Задаємо стиль шрифту - нормальний

   CurrentFont.setStyleFlags(Font::plain);

 }

 else if (pButton == pBoldButton)

 {

   // Задаємо стиль шрифту - напівжирний

   CurrentFont.setStyleFlags(Font::bold);

 }

 else if (pButton == pItalicButton)

 {   

   // Задаємо стиль шрифту - курсив

   CurrentFont.setStyleFlags(Font::italic);

 }

 pFontViewer->applyFontToAllText(CurrentFont);

}

Лістинг 6.6. Другий варіант реалізації функції buttonClicked класу компонента вмісту TCentralComponent (файл TCentralComponent.cpp )

Для отримання прапора стилю того чи іншого шрифту використовується функція int Font :: getStyleFlags () const throw ().

Завершуючи опис класу Font бібліотеки Juce, слід зазначити, що для нього доступні оператори присвоювання = (копіює один шрифт в інший) та порівняння (== та ! =).

Рядки в Juce

Подібно багатьом іншим GUI toolkit'ам в Juce уявлення строкових даних реалізовано як клас (String). Ми вже зустрічалися з цим класом у вищенаведених програмах.

Клас String має декілька конструкторів:

• String () throw () - створює порожній рядок;

• String (const String & other) throw () - створює рядок з іншого об'єкта того ж класу String;

• String (const char * text) - створює рядок з масиву символів, що закінчується нулем;

• String (const char * text, size_t maxChars) - створює рядок з масиву символів певної довжини;

• String (const juce_wchar * unicodeText) - створює рядок з масиву символів у форматі Юнікод, оканчивающегося нулем; typedef wchar_t juce_wchar - платформонезалежних тип символу Юнікод;

• String (const juce_wchar * unicodeText, size_t maxChars) - створює рядок з масиву символів у форматі Юнікод певної довжини.

Клас String надає цілу серію методів і операторів, що дозволяють проводити з рядками різного роду операції: з'єднувати їх, здійснювати пошук підрядків і т.п.

Для класу String є два перевантажених оператора: присвоювання (=) і конкатенації (+ =).

Оператор = заміщає вміст об'єкта класу String вмістом іншого рядка.

Оператор + = здійснює об'єднання або конкатенацію рядків. При цьому в кінець вихідної рядки можуть бути додані дані наступних типів:

• символ (char);

• символ Юнікод (juce_wchar);

• масив символів Юнікод (juce_wchar *);

• рядок (String);

• ціле число (int);

• беззнакове ціле (unsigned int).

Об'єднання рядків можна здійснити також за допомогою функції-члена класу String void String :: append (const juce_wchar * textToAppend, int maxCharsToTake), де textToAppend - рядок, що додається в кінець вихідної, а maxCharsToTake - максимальне число переданих символів.

Рядки можна порівнювати між собою за допомогою набору методів класу:

• bool String :: equalsIgnoreCase (const String & other) const throw () - порівняння з іншого рядком без урахування регістру;

• bool String :: equalsIgnoreCase (const juce_wchar * other) const throw () - порівняння з іншого рядком (представленої масивом символів Юнікод) без урахування регістру;

• bool String :: equalsIgnoreCase (const char * other) const throw () - порівняння з іншого рядком (представленої масивом символів) без урахування регістру;

• int String :: compare (const String & other) const throw () - порівняння з іншого рядком з урахуванням регістру;

• int String :: compare (const char * other) const throw () - порівняння з іншого рядком (представленої масивом символів) з урахуванням регістру;

• int String :: compare (const juce_wchar * other) const throw () - порівняння з іншого рядком (представленої масивом символів Юнікод) з урахуванням регістру;

• int String :: compareIgnoreCase (const String & other) const throw () - порівняння з іншого рядком без урахування регістру;

• int String :: compareLexicographically (const String & other) const throw () - лексикографічне порівняння з іншою рядком.

• Дізнатися, чи є рядок порожній, можна за допомогою наступних методів:

• bool String :: isEmpty () const throw () - повертає true, якщо рядок не містить жодного символу;

• bool String :: isNotEmpty () const throw () - повертає true, якщо рядок містить хоча б один символ.

Того ж результату можна добитися, перевіривши довжину рядка в символах методом int String :: length () const throw ().

Слід пам'ятати, що рядок, що містить прогалини, порожній не є, тому функція isEmpty, що викликається нею, буде повертати false. Як правило, користувач сприймає текстове поле, в якому немає інших символів, крім пробілів, саме як порожнє. Бібліотека Juce включає зручну функцію bool String :: containsNonWhitespaceChars () const throw (), яка повертає true, якщо зухвала рядок містить які-небудь символи, крім пропусків.

Пошук рядків і символів в тексті - одна з найбільш часто виникаючих завдань при розробці додатків. Клас String містить досить багато методів для її вирішення.

Перш за все, це методи пошуку підрядка:

• const String String :: substring (int startIndex) const - повертає частину викликаних рядків від символу startIndex і до її кінця;

• const String String :: substring (int startIndex, int endIndex) const - повертає частину викликаних рядків між символами startIndex і endIndex.

Для того, щоб дізнатися, чи містить рядок підрядок або символи (в будь-якій позиції), використовуються наступні функції:

• bool String :: contains (const String & text) const throw () - перевіряє, чи містить рядок підрядок text. Чутлива до регістру. Якщо в якості параметра було передано порожній рядок, функція все одно повертає true.

• bool String :: containsIgnoreCase (const String & text) const throw () - працює аналогічно попередньої функції, але не враховує регістр символів.

• bool String :: containsChar (juce_wchar character) const throw () - перевіряє, чи містить рядок символ, переданий як параметр.

• bool String :: containsAnyOf (const String & charactersItMightContain) const throw () - повертає true, якщо в зухвалій рядку є які-небудь символи з набору, прийнятого в якості параметра.

• bool String :: containsOnly (const String & charactersItMightContain) const throw () - повертає false, якщо в викликаному рядку відсутній будь-який із символів набору, прийнятого в якості параметра.

• bool String :: containsWholeWord (const String & wordToLookFor) const throw () - повертає true, якщо викликаний метод рядоку містить слово wordToLookFor, оточене символами, які не є буквами і цифрами.

Для заміни певної частини рядка іншою клас String надає метод const String String :: replace (const String & stringToReplace, const String & stringToInsertInstead, bool ignoreCase = false) const, всі входження підрядка stringToReplace рядком stringToInsertInstead з урахуванням або без урахування регістра в залежності від прийнятого значення параметра ignoreCase.

Для заміни одного символу в рядку можна скористатися функцією const String String :: replaceCharacter (juce_wchar characterToReplace, juce_wchar characterToInsertInstead) const. Крім того, клас String включає метод, який дозволяє замінити один набір символів іншим: const String String :: replaceCharacters (const String & charactersToReplace, const String & charactersToInsertInstead) const. Він повертає рядок, в якій кожен символ з першого набору (charactersToReplace) заміщається відповідним символом з другого набору (charactersToInsertInstead) в еквівалентній позиції. Зрозуміло, що передаються в функцію два рядки повинні бути однакового розміру. Наприклад, при виклику replaceCharacters ("abc", "def") у результуючому рядку "a" заміщається на "d", "b" на "e" і т.п.

Близьким до попередньої функції є метод класу String const String String :: retainCharacters (const String & charactersToRetain) const, який повертає рядок, що зберігає тільки той набір символів, що містилися в викликала рядку, який був переданий як параметр. Наприклад, якщо об'єкт класу String, що містить рядок "1122334455", звернеться до методу retainCharacters ("432"), то буде повернута рядок "223344".

Для перетворення даних рядка в верхній або нижній регістр використовуються методи const String String :: toLowerCase () const і const String String :: toUpperCase () const, які повертають, відповідно, варіант викликаний рядками в нижньому і верхньому регістрі.

Досить часто зустрічається ситуація, коли необхідно конвертувати числові значення в строкові і навпаки. У першому випадку необхідно створити об'єкт класу String, в якості параметра конструктора який передаватиме конвертоване число. Прийнятими в якості параметра конструктора типами можуть бути short int, unsigned short int, int, unsigned int, int64, uint64, float і double. наприклад:

String sNumber(1234); // Рядок містить текст "1234".

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

  •  int String::getIntValue() const throw();
  •  int64 String::getLargeIntValue() const throw();
  •  float String::getFloatValue() const throw();
  •  double String::getDoubleValue() const throw();
  •  int String::getHexValue32() const throw();
  •  int64 String::getHexValue64() const throw();

Останні дві функції повертають шістнадцяткове число відповідного розміру; інші символи, якщо їх містить рядок, ігноруються. Приклад використання функції getFloatValue приведений в лістингу 6.4.

Крім того, клас String включає досить цікавий метод int String :: getTrailingIntValue () const throw (), який повертає ціле число, що знаходиться в кінці рядка.  Наприклад:

String sNumber("321 xyz654");

// Функція повертає 654

int iNumber = sNumber.getTrailingIntValue()

Список рядків (клас StringArray)

Для зберігання масиву строкових об'єктів в Juce є клас StringArray, який описує список рядків з розширеними можливостями маніпулювання ними.

Клас підтримує наступні операції роботи з рядками:

Доступ до рядка по її індексу можливий за допомогою оператора [], як до елементу звичайного масиву. Якщо індекс виходить за межі масиву, буде повернутий порожній рядок. Крім того, отримати посилання на одну з рядків масиву за її індексу дозволяє метод класу String & StringArray :: getReference (int index) throw ().

Повернення числа елементів списку (що зберігаючих рядків) здійснює метод int StringArray :: size () const throw ().

Додавання нових рядків у кінець списку. Виробляється функцією void StringArray :: add (const String & stringToAdd). Крім того, в кінець списку можна додати цілий масив рядків, інший об'єкт класу StringArray, за допомогою методу void StringArray :: addArray (const StringArray & other, int startIndex = 0, int numElementsToAdd = -1), де other - перший елемент доданого строкового масиву , з якого необхідно починати вставку, а numElementsToAdd - максимальне число рядків з доданого масиву для вставки. Якщо значення параметра менше нуля, то додаються всі елементи.

Вставка нових рядків у довільне місце списку зі зміщенням елементів масиву. Функція void StringArray :: insert (int index, const String & stringToAdd) вставляє рядок stringToAdd в масив на місце, задане індексом index, піднімаючи інші елементи. Якщо значення індексу менше нуля або перевищує розмір масиву, то рядок додається в кінець списку.

Вставка нових рядків у довільне місце списку із заміною елементів масиву. Функція void StringArray :: set (int index, const String & newString) вставляє рядок newString в масив на місце, задане індексом index. При цьому колишній рядок замінюється новим. Якщо значення індексу менше нуля функція не робить нічого, а якщо воно перевищує розмір масиву, то рядок додається в кінець списку.

Пошук рядків у масиві (по змісту). Частіше буває, що знайти необхідний рядок у масиві буває потрібно не по її індексу, а по тексту, що в ній міститься. У цьому може допомогти метод bool StringArray :: contains (const String & stringToLookFor, bool ignoreCase = false) const. Також, як і раніше, другий параметр - прапор, чи варто при пошуку рядка stringToLookFor враховувати регістр.

Видалення рядків. Видалити один рядок, що знаходиться на позиції index, зі списку можна за допомогою функції void StringArray :: remove (int index). Якщо індекс виходить за межі масиву, то функція нічого не робить. Пошук рядка stringToRemove в масиві з подальшим її видаленням виконує функція void StringArray :: removeString (const String & stringToRemove, bool ignoreCase = false); другий її параметр - прапор, який показує, чи слід ігнорувати регістр.

Корисні також функції, що дозволяють видалити всі повторювані рядки, void StringArray :: removeDuplicates (bool ignoreCase), і всі порожні рядки в масиві, void StringArray :: removeEmptyStrings (bool removeWhiteSpaceStrings = true). Якщо остання функція як параметр приймає істину, то порожніми будуть вважатися також рядки, заповнені тільки пробілами.

Крім того, клас StringArray дозволяє видаляти відразу ряд рядків. Для цього використовується метод void StringArray :: removeRange (int startIndex, int numberToRemove), де startIndex - індекс першого рядка з ряду, що підлягає видаленню, а numberToRemove - число видаляючих елементів.

Переміщення рядків на нову позицію в масиві здійснює метод void StringArray :: move (int currentIndex, int newIndex) throw (). При виклику функції екземпляром класу StringArray відбувається переміщення, що міститься в ньому рядки, що знаходиться на позиції currentIndex, на позицію newIndex.

Сортування елементів списку здійснюється функцією void StringArray :: sort (bool ignoreCase); параметр вказує, чи слід враховувати регістр. Рядки сортуються в алфавітному порядку.

Очищення списку. Видалення всіх рядків із списку з обнуленням його розміру виконує функція void StringArray :: clear ().

Знаходження індексу рядки здійснює функція int StringArray :: indexOf (const String & stringToLookFor, bool ignoreCase = false, int startIndex = 0) const, де stringToLookFor - текст (рядок) для пошуку, ignoreCase-прапор, який показує, чи слід ігнорувати регістр, а startIndex - індекс елемента, з якого починається пошук. Функція повертає індекс знайденого рядки, а в разі, якщо нічого не було знайдено, повертається -1.

Об'єднання рядків масиву в одну. Зручно для автоматичної генерації тексту, який додається, скажімо, в багаторядкове  поле введення на підставі зібраних і збережених в масиві StringArray даних. Здійснюється функцією const String StringArray :: joinIntoString (const String & separatorString, int startIndex = 0, int numberOfElements = -1) const.

Ми можемо за допомогою параметра separatorString задати рядок-роздільник, яка буде розділяти елементи масиву в результуючому рядку. Наприклад, якщо масив StringArray включав рядки "a", "b" і "c", то виклик методу joinIntoString (",") поверне рядок "a, b, c".

startIndex, як неважко здогадатися, індекс елемента масиву, з якого слід почати об'єднання, а numberOfElements - число поєднуваних рядків. У тому випадку, якщо останній параметр приймає значення менше нуля, то будуть об'єднані всі рядки масиву.

Короткі підсумки

Для виведення неформатованого тексту в Juce використовується клас String, а форматованого - також і клас Font, який зберігає інформацію про параметри шрифту тексту.

Клас String, інкапсулює дії з рядками. Об'єкт класу String - це рядок, що складається з довільного числа символів. Літерні константи типу String являють собою послідовності символів, укладені в подвійні лапки.




1. Пионеры дизайна1
2. Организационные структуры управления
3. Задачи и этапы проведения следственного допроса, формы фиксации результатов проведения допроса
4. Теор. мех. ч. 2 кинематика динамика.html
5. Трудно определить откуда начинается личность
6. 1650 одна из самых больших вершин одно из величайших достижений
7. 45 Тимошкина Е.А
8. Розробка системи автоматизації процесу спікання агломераційної шихти в умовах агломераційного цеху на під
9. Контрольная работа- Назначение и состав стандартов ИСО 9000
10. а. 2 не согласен не согласна
11. СОПРОВОДИТЕЛЬНОЕ РЕЗЮМЕ3 2
12. ДОТ заочной формы обучения Нижегородской правовой академии о прохождении производственной практики в нот
13. Учет расчетов с дебиторами в бюджетном учреждени
14. Эрмитаж Казань приглашает поучаствовать младшие и средние классы в интерактивной программе Впечатлен
15. Зоогигиена содержания лошадей в условиях конноспортивного комплекса
16. Определение индивидуальной линии времени Данная методика описана в книгах по НЛП
17. Этиология Возбудитель ~ Cytomeglovirus hominis относится к вирусам рода Cytomeglovirus семейства Herpesviride
18. ВыигрышВыигрыш навык 4 и навыком участливого слушания навык 5
19. МЕТОДИЧНИЙ ЦЕНТР ІНФОРМАЦІЙНОАНАЛІТИЧНОГО ЗАБЕЗПЕЧЕННЯ ДІЯЛЬНОСТІ ВИЩИХ НАВЧАЛЬНИХ ЗАКЛАДІВ ldquo;АГРОО
20. Анализ понятия и юридической значимости международных договоров