
- •Часть 2. Сборник рецептов по визуальному программированию Введение в объектно-ориентированное программирование
- •Создание проекта в VisualStudio
- •Файлы проекта
- •Сведения об объекте
- •Общие свойства всех объектов
- •Класс Form
- •Помещение компонента в форму и прочие действия с дизайнером форм
- •Свойства форм
- •События формы
- •Методы формы
- •Компоненты ввода и отображения текстовой информации Компонент Label
- •Некоторые свойства компонента Label
- •Компонент TextBox
- •Методы TextBox
- •Компонент RichTextBox
- •Ввод числовых значений в компонент TextBox
- •Проверка, введены ли значения
- •Компонент ListBox
- •Компонент ComboBox
- •Ввод данных из файла
- •Компонент MaskedTextBox
- •Кнопки, индикаторы и управляющие элементы Компонент Button
- •Компонент Panel
- •Компоненты RadioButtonиCheckBox
- •Компонент GroupBox
- •Пример. Комплектация автомобиля
- •Работа с меню Главное меню
- •Контекстное меню
- •Создание текстового редактора
- •Системные диалоги
- •Компонент OpenFileDialog
- •Компонент SaveFileDialog
- •Диалог выбора шрифта
- •Диалог выбора цвета
- •Компонент PrintDialog
- •Диалоговые окна в текстовом редакторе
- •Расширенные символы Unicode
- •Работа с графикой Использование графических файлов
- •Создание фотоальбома
- •Методы для рисования на форме и прочих компонентах
- •Работа с таймером
- •Работа с датой и временем
- •Добавление новых форм к проекту
- •Многостраничные панели
- •Способы задания страниц
- •Методы TabControl
Расширенные символы Unicode
Заметим, что сохраняемые файлы записываются не в стандартной кодировке Windows, а в кодировкеUnicode(расширенные символы).
Расширенный символ – это двухбайтный код символа для кодирования символов в различных языках. Размера длины кода символа хватает, чтобы закодировать символы на любом языке, включая разные технические символы (в отличие от однобайтного кода таблицы ASCII, который не обеспечивал одновременного кодирования символов всех языков).
Кодирование символами в системе Unicodeотносится к типуwchar_t. Строка символов представляет собой массивwchar_t[], а указателем на такую строку (или начало массива) является указательwchar_t*.
Любой ASCII-символ можно представить в расширенной кодировке, добавив к нему слева символL. Например,L’\n’– это признак конца строки в новой кодировке. Таким же образом можно представить любуюASCII-строку в новой кодировке, предваряя ее символомL(например,L”Привет”).
Функции для работы со строками типа wchar_tпо своим действиям точно такие же, как и соответствующие им функции для типаchar, за исключением, что их функциональность скорректирована с учетом, что символ в строке является расширенным и кодируется двумя байтами. К именам этих функций добавлен символ «w». Например,_wtoi,_wtof,wcscpy,wcscmpи пр.
Тип String
Это класс из пространства System, предназначенный для работы со строковыми данными. Используется при объявлении строки с указателем ^, например,String ^s;.
Знак ^ объявляет указатель на объект в участке памяти, который выделяется под экземпляры объектов и автоматически освобождается, когда этот объект перестает использоваться. Это указатель на целый объект, а не на какой-либо его член.
Объект создается с помощью утилиты gcnewи конструктора объекта.
Указатель ^ выдает ссылку на объект в выделенной памяти всегда, даже когда объект переместился в этом участке. Указатели обычного типа в подобных случаях этого делать не могут. В остальном применение указателя ^ к элементу объекта такое же, как и других указателей: надо писать оператор «->» после имени объекта, чтобы получить доступ к его члену (например, s->Copy()дает доступ к члену объектаString– методу копирования данных).
Рассмотрим применение типа String.
В первую очередь необходимо объявить переменную этого типа.
String ^S;
Этой переменной можно присваивать значения такого же типа, что были уже где-то созданы и, следовательно, расположены в выделенной для них памяти. Когда мы пишем
S=a;
Здесь a– это переменная типаString, имеющая некоторое значение. Указатель ^ указывает на объектaв выделенной для него памяти. Если по каким-то причинам объектaпереместится в памяти на другое место, то указатель изменит свое значение на новое, которое все равно станет указывать на объект с именемa.
Однако переменной SтипаStringможно присваивать значение и с помощью конструктора, использующего утилитуgcnew, которая выделяет память под объект, на который воздействует конструктор, когда присваиваемое значение имеет тип, отличный от типаString.
Конструктор для Stringимеет несколько форм.
String (const wchar_t *value);
String (const wchar_t *value, int StartIndex, int Length); Здесь происходит выделение из строки Unicode подстроки длины Length с началом на символе StartIndex.
String (const char *value);Здесь обрабатывается обычная строка с нулевым признаком конца и выдается значение типаString. Например, такой конструктор можно вызвать, если написать одну из двух команд:
String ^S=gcnew String(“Строка!”);
или
string A=”Строка!!!”;
String ^s=gcnew String (A.c_str());
Во втором примере переменная Aимеет типstring, класс из пространства именstd. Переменная преобразуется внутри конструктора с помощью методаc_str()в переменную типаchar*, которая уже подходит конструктору.
Рассмотрим операции, которые можно выполнять над строками типа String.
Сложение строк.
String ^S;
String ^a=gcnew String(“абв”);
String ^b=”где”;
Object ^c=gcnew String(”жзи”);
S=a+c+b;
Результатом выполнения этих операторов будет S=”абвгдежзи”.
Кроме того, к уже существующей переменной можно добавить подстроку:
a=a+”эюя”;
В результате получим a=”абвэюя”.
Извлечение из строки отдельных символов.
String ^s;
String ^a=gcnew String (“абв”);
char b[2];
b[0]=a[2];
b[1]=’\0’;
s=gcnew String(b);
Аналогичные действия можно производить и со строкой wchar_t.
В данном примере добавлен признак конца в новую строку b, первым элементом которой стал третий элемент исходной строки. Признака конца строки после объявленияbне было. Поэтому если не добавить признак конца строки, то после первого элемента система начнет выдавать все, что будет следовать за первым элементов, пока не найдет среди мусора символ признака конца строки или не остановится стандартным образом. После добавления символа‘\0’строкаbстановится полноценным массивом типаchar*.
Добавление символа:
String ^s;
String ^a=gcnew String(“абв”);
s=a+1;
Результатом станет s=”абв1”;
Добавление кода символа:
String ^s;
String ^a=gcnew String (“абв”);
s=a+’a’;
Результатом станет s=”абв97”;
Добавление десятичного числа:
String ^s;
String ^a=gcnew String (“абв”);
s=a+3.1;
Результатом станет s=”абв3.1”;
Сравнение двух строк:
String ^a=”абв”;
String ^b=”где”;
if (a!=b) {…}
Проверка на нулевой указатель. Такая проверка возможна, если переменная объявлена, но ей не придано никакого значения. Даже если переменной присвоить пустое значение“”, то указатель на нее уже не будет пуст.
String ^n;
if (n==nullptr) MessageBox::Show (“Строка пуста!”);
Кроме рассмотренных операций для строк типа Stringсуществуют следующиеметоды.
Compare(s1,s2)– метод сравнивает две строки и возвращает одно из трех целочисленных значений: 1 – строкаs1лексикографически больше строкиs2, 0 – строки равны, –1 – строкаs2лексикографически больше строкиs1.
s1=s2->Concat (s1,s2)– сцепление двух строк, метод возвращает строковое значение.
s1=s->Copy(s)– копирование строкиs вs1.
s=s1->Insert(2,”*****”)– вставка подстроки, начиная с указанного индекса.
Поиск и возврат индекса первого вхождения подстроки s2в строкуs1:
int i=s1->IndexOf(s2); - поиск с начала строки.
int i=s1->IndexOf(s2,x);- поиск начинается с заданного индексаx.
int i=s1->IndexOf(s2,x,y);- поиск начинается с заданного индексаxи проверяется заданное количество символовy.
int i=s->LastIndexOf(s1);- поиск и возврат индекса последнего вхождения заданной подстрокиs1в строкуs.
int i=s->Length;- определение длины строкиs.
S=s1->Replace (s1,s2) – замена всех встречающихся в первом параметре символов на символы второго параметра.
S=s1->Substring(i); - выделение подстроки с позицииiдо конца строки.
S=s1->Substring(i,j);- выделениеjсимволов, начиная с позицииi.