Новость из категории: Информация

Нестандартные GUI-тулкиты: Магия Ultimate++

Содержание:
1. Реакция на события и логика программы (Вы читаете данный раздел);
2. Использование компоновок;
3. Иерархия виджетов в U++;
4. Библиотека контейнеров NTL.
Нестандартные GUI-тулкиты: Магия Ultimate++

Наконец мы подошли к реализации логики программы. Сначала напишем функцию, которая будет вызываться при щелчке на кнопке:
void on _ click () {
double vl = ~vall, v2 = ~val2; if(IsNull(v1) || IsNull(v2)){
result.SetLabel("Введите два числа!");
return;
}
switch( (-operation) .ToString() [0] ){ case '+':
result.SetLabel( String("Результат: ").Cat() << vl + v2 ); break; case
result.SetLabel( String("Результат: ").Cat() << vl - v2 ); break; case '*':
result.SetLabel( String("Результат: ").Cat() << vl * v2 ); break; case '/':
result.SetLabel( String("Результат: ").Cat() << vl / v2 ); break;
}
}

В этом небольшом фрагменте кода хорошо видна «магия» U++. У любого виджета в U++ есть некое «естественное значение». Это относится даже к виджетам, не хранящим данных, таким как кнопки. Для поля ввода естественное значение - это введенный текст, для списка - выбранный элемент, для кнопки -функция-обработчик ее нажатия. Получить это значение можно оператором «значение = ~widget», а установить - оператором «widget <<= значение». Оператор «~» возвращает значение типа Value. Value - это вариантный тип, который может хранить числа, даты, строки и другие значения и используется как универсальная «валюта» для преобразования значений. При присваивании «double vl = ~val1» из поля ввода val1 извлекается строка в виде вариантного типа и автоматически преобразуется неявно в число.



Если поле ввода - пустое, конвертация в число оператором «~» все равно проходит без ошибки. Дело в том, что переменная любого типа (даже примитивного, вроде double или int) в U++ может быть «пустой» (Null). Проверка на «пустоту» производится функцией IsNull() и позволяет элементарно обрабатывать случаи когда конвертация невозможна.

Конструкция «(~operation).ToString()[0]» извлекает текущий элемент из списка операций, явно преобразует его в строку (в этом случае компилятору просто неоткуда извлечь информацию о типе для неявного преобразования типа Value) и извлекает первый символ, по которому и идет выбор операции в блоке switch. Любая строка в U++ имеет тип String, а с помощью метода Cat() и оператора «<<» в нее можно записывать значения различных типов, в том числе и числа.

Итак, функция-обработчик готова, осталось только сопоставить ее событию щелчка на кнопке. Делается это очень просто. Перед конструктором вставляем строку:
typedef MyWindow CLASSNAME;

Тип CLASSNAME используется макросами U++ для генерации правильного кода привязок (bindings) к событиям. Затем просто пишем в конструкторе:
compute <<= THISBACK(on _ click);

Макрос THISBACK создает объект-привязку из нашей функции-обработчика. Этот объект устанавливается как «естественное значение» кнопки compute. Если мы теперь захотим автоматически пересчитывать результат при выборе другой операции из выпадающего списка достаточно написать по аналогии:
operation <<= THISBACK(on _ click);

и все заработает без необходимости даже знать название события генерируемого списком при выборе элемента! Такое единообразие и универсальность выгодно отличает U++ от других тулкитов, где для соединения события с обработчиком нужно знать название событий для каждого виджета и их полные сигнатуры. Запустив готовую программу, мы увидим окно, показанное на рис. ниже.

Нестандартные GUI-тулкиты: Магия Ultimate++
Окно готовой программы

Рейтинг статьи

Оценка
5/5
голосов: 2
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх