Ultimate++: первая программа
Содержание:
1. Обзор U++;
2. Установка;
3. TheIDE;
4.Первая программа (Вы читаете данный раздел).
Перейдем к реальному примеру. Напишем простую бесполезную программу, которая выполняет выбранное арифметическое действие с двумя числами. Запустим TheIDE и создадим новый пакет demol в коллекции MyApps. В качестве шаблона выберем Basic Ctrl Lib Application. Будет создан единственный исходный файл main.cpp с таким кодом:
Это и есть минимальная программа на U++, которая пока не делает ничего. Макрос GUI_APP_MAIN заменяет функцию main и отвечает за инициализацию библиотеки. Первое, что нужно сделать, - добавить главное окно:
Все классы U++ находятся в пространстве имен Upp, поэтому лучше сразу же его задействовать.
Мы наследуем класс MyWindow от класса окна TopWindow, создаем его экземпляр и входим в цикл обработки событий методом Run. Скомпилировав программу, можно увидеть пустое окно, которое умеет только закрываться. Добавим кнопки сворачивания-разворачивания, возможность менять размер и установим начальные размеры окна, вызывая нужные методы в конструкторе класса:
Такое «нанизывание» вызываемых методов характерно для U++ и делает код очень компактным.
Добавим в окно нужные виджеты: два текстовых поля для операндов и подписи к ним, выпадающий список для арифметических операций с подписью, кнопку «Вычислить» и надпись для вывода результата:
Обращают на себя внимание несколько моментов. Во-первых, в U++ существуют особые типы полей ввода для вещественных и целых чисел. С использованием готового виджета EditDouble можно забыть о неправильном вводе числа пользователем. Во-вторых, все виджеты создаются статически как обычные члены класса и нет нужды явно указывать их иерархию. Читабельность и простота кода от этого сильно выигрывают. Сравните:
Следующий этап - разместить виджеты в окне. В U++ нет «резиновой» компоновки, реализуемой в GTK+ или Qt с помощью «сайзеров» (sizers). Вместо нее применяются так называемые логические координаты, отсчитываемые от краев родительского виджета. Для каждого виджета определена функция LeftPos(a,size), задающая расстояние от левого края родителя до виджета и ширину виджета. Аналогично работают RightPos, TopPos и BottomPos. Функция HSizePos(a,b) задает расстояния от левого и правого края родителя до виджета и дает виджету менять ширину вместе с родителем. Так же работает VSizePos. Забегая вперед, скажу, что в TheIDE есть удобный визуальный редактор компоновок, который будет описан в следующей части статьи. Пока же укажем всю геометрию вручную. Делается это в конструкторе с помощью функции Add(widget), которая отобра-жает переданный ей виджет согласно его логическим координатам. Полностью программа теперь выглядит так:
Легко заметить, что кириллица поддерживается без всяких проблем. Выпадающий список пока пуст. Заполним его:
Функция SetIndex устанавливает выбранной первую операцию «+», т.к. по умолчанию ни один элемент не выбран. Нужно сказать, что элементами выпадающего списка могут быть не только строки, а любые пары «ключ-значение». В данном случае используется простейший вариант, когда задаются только значения, а ключи генерируются автоматически.
На этом создание интерфейса можно считать законченным. В следующей части статьи я опишу реализацию логики нашей программы. Именно там в полной мере проявится «магия» U++.
1. Обзор U++;
2. Установка;
3. TheIDE;
4.
Перейдем к реальному примеру. Напишем простую бесполезную программу, которая выполняет выбранное арифметическое действие с двумя числами. Запустим TheIDE и создадим новый пакет demol в коллекции MyApps. В качестве шаблона выберем Basic Ctrl Lib Application. Будет создан единственный исходный файл main.cpp с таким кодом:
#include
GUI _ APP _ MAIN{
}
GUI _ APP _ MAIN{
}
Это и есть минимальная программа на U++, которая пока не делает ничего. Макрос GUI_APP_MAIN заменяет функцию main и отвечает за инициализацию библиотеки. Первое, что нужно сделать, - добавить главное окно:
#include
using namespace Upp;
class MyWindow: public TopWindow {
};
GUI _ APP _ MAIN {
MyWindow w;
w.Run() ;
}
using namespace Upp;
class MyWindow: public TopWindow {
};
GUI _ APP _ MAIN {
MyWindow w;
w.Run() ;
}
Все классы U++ находятся в пространстве имен Upp, поэтому лучше сразу же его задействовать.
Мы наследуем класс MyWindow от класса окна TopWindow, создаем его экземпляр и входим в цикл обработки событий методом Run. Скомпилировав программу, можно увидеть пустое окно, которое умеет только закрываться. Добавим кнопки сворачивания-разворачивания, возможность менять размер и установим начальные размеры окна, вызывая нужные методы в конструкторе класса:
class MyWindow: public TopWindow {
public: MyWindow(){
Title("Hello world!") .MinimizeBox().MaximizeBox()
.Sizeable().SetRect(0, 0, 300, 300);
}
};
public: MyWindow(){
Title("Hello world!") .MinimizeBox().MaximizeBox()
.Sizeable().SetRect(0, 0, 300, 300);
}
};
Такое «нанизывание» вызываемых методов характерно для U++ и делает код очень компактным.
Добавим в окно нужные виджеты: два текстовых поля для операндов и подписи к ним, выпадающий список для арифметических операций с подписью, кнопку «Вычислить» и надпись для вывода результата:
class MyWindow: public TopWindow {
public:
EditDouble val1, val2; // Поля ввода для операндов
Label l1,l2; // Подписи для полей ввода
DropList operation; // Выпадающий список операций
Label l3; // Подпись для списка
Button compute; // Кнопка «вычислить»
Label result; // Надпись для результата
public:
EditDouble val1, val2; // Поля ввода для операндов
Label l1,l2; // Подписи для полей ввода
DropList operation; // Выпадающий список операций
Label l3; // Подпись для списка
Button compute; // Кнопка «вычислить»
Label result; // Надпись для результата
Обращают на себя внимание несколько моментов. Во-первых, в U++ существуют особые типы полей ввода для вещественных и целых чисел. С использованием готового виджета EditDouble можно забыть о неправильном вводе числа пользователем. Во-вторых, все виджеты создаются статически как обычные члены класса и нет нужды явно указывать их иерархию. Читабельность и простота кода от этого сильно выигрывают. Сравните:
QLabel* l1 = new Qlabel(parent); //Qt
Label l1; //U++
Label l1; //U++
Следующий этап - разместить виджеты в окне. В U++ нет «резиновой» компоновки, реализуемой в GTK+ или Qt с помощью «сайзеров» (sizers). Вместо нее применяются так называемые логические координаты, отсчитываемые от краев родительского виджета. Для каждого виджета определена функция LeftPos(a,size), задающая расстояние от левого края родителя до виджета и ширину виджета. Аналогично работают RightPos, TopPos и BottomPos. Функция HSizePos(a,b) задает расстояния от левого и правого края родителя до виджета и дает виджету менять ширину вместе с родителем. Так же работает VSizePos. Забегая вперед, скажу, что в TheIDE есть удобный визуальный редактор компоновок, который будет описан в следующей части статьи. Пока же укажем всю геометрию вручную. Делается это в конструкторе с помощью функции Add(widget), которая отобра-жает переданный ей виджет согласно его логическим координатам. Полностью программа теперь выглядит так:
#include using namespace Upp;
class MyWindow: public TopWindow { public:
EditDouble val1, val2; // Поля ввода для операндов
Label l1,l2; // Подписи для полей ввода
DropList operation; // Выпадающий список операций
Label l3; // Подпись для списка
Button compute; // Кнопка «вычислить»
Label result; // Надпись для результата
MyWindow(){
Title("Hello world!") .MinimizeBox().MaximizeBox() .Sizeable().SetRect(0, 0, 300, 230);
Add( l1.SetLabel("Первое число"). J
LeftPosZ(10,STDSIZE).TopPosZ(10,30) ); Add( val1.HSizePosZ(90, 10).TopPosZ(15, 20) );
Add( l2.SetLabel("Второе число"). J
LeftPosZ(10,STDSIZE).TopPosZ(40,30) ); Add( val2.HSizePosZ(90, 10).TopPosZ(45, 20) );
Add( l3.SetLabel("Операция"). J
LeftPosZ(10,STDSIZE).TopPosZ(70,30) ); Add( operation.HSizePosZ(90, 10).TopPosZ(75, 20) );
Add( compute.SetLabel("Посчитать!"). J
HSizePosZ(10, 10).TopPosZ(105, 20) );
Add( result.SetLabel("Результат:"). J
HSizePosZ(10, 10).TopPosZ(135, 20) );
}
};
GUI _ APP _ MAIN { MyWindow w; w.Run();
}
class MyWindow: public TopWindow { public:
EditDouble val1, val2; // Поля ввода для операндов
Label l1,l2; // Подписи для полей ввода
DropList operation; // Выпадающий список операций
Label l3; // Подпись для списка
Button compute; // Кнопка «вычислить»
Label result; // Надпись для результата
MyWindow(){
Title("Hello world!") .MinimizeBox().MaximizeBox() .Sizeable().SetRect(0, 0, 300, 230);
Add( l1.SetLabel("Первое число"). J
LeftPosZ(10,STDSIZE).TopPosZ(10,30) ); Add( val1.HSizePosZ(90, 10).TopPosZ(15, 20) );
Add( l2.SetLabel("Второе число"). J
LeftPosZ(10,STDSIZE).TopPosZ(40,30) ); Add( val2.HSizePosZ(90, 10).TopPosZ(45, 20) );
Add( l3.SetLabel("Операция"). J
LeftPosZ(10,STDSIZE).TopPosZ(70,30) ); Add( operation.HSizePosZ(90, 10).TopPosZ(75, 20) );
Add( compute.SetLabel("Посчитать!"). J
HSizePosZ(10, 10).TopPosZ(105, 20) );
Add( result.SetLabel("Результат:"). J
HSizePosZ(10, 10).TopPosZ(135, 20) );
}
};
GUI _ APP _ MAIN { MyWindow w; w.Run();
}
Легко заметить, что кириллица поддерживается без всяких проблем. Выпадающий список пока пуст. Заполним его:
operation.Add("+").Add("-").Add("*").Add("/").SetIndex(0);
Функция SetIndex устанавливает выбранной первую операцию «+», т.к. по умолчанию ни один элемент не выбран. Нужно сказать, что элементами выпадающего списка могут быть не только строки, а любые пары «ключ-значение». В данном случае используется простейший вариант, когда задаются только значения, а ключи генерируются автоматически.
На этом создание интерфейса можно считать законченным. В следующей части статьи я опишу реализацию логики нашей программы. Именно там в полной мере проявится «магия» U++.