Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

В листинге 12.10 демонстрируются переключатели.

Листинг 12.10. Переключатели в FOX

require 'fox16'

include Fox

class RadioButtonHandlerWindow < FXMainWindow

 def initialize(app)

# Invoke base class initialize first

super(app, "Radio Button Handler", nil, nil,

DECOR_TITLE | DECOR_CLOSE)

choices = [ "Good", "Better", "Best" ]

group = FXGroupBox.new(self, "Radio Test Group",

LAYOUT_SIDE_TOP |

FRAME_GROOVE |

LAYOUT_FILL_X)

choices.each do |choice|

FXRadioButton.new(group, choice,

nil, 0,

ICON_BEFORE_TEXT |

LAYOUT_SIDE_TOP)

end

 end

end

application = FXApp.new

main = RadioButtonHandlerWindow.new(application)

application.create

main.show(PLACEMENT_SCREEN)

application.run

Группы

переключателей — стандартное средство в графических приложениях, предназначенное для выбора одного из взаимно исключающих вариантов. В данном примере варианты представлены массивом из трех строк:

choices = [ "Good", "Better", "Best" ]

В главное окно добавляется объект

FXGroupBox
, который визуально указывает, что три переключателя взаимосвязаны, а затем в этот контейнер добавляются сами переключатели (по одному на каждый вариант). Но сам контейнер
FXGroupBox
ничего не делает для того, чтобы обеспечить взаимное исключение. Если запустить пример в таком виде, то вы сможете выбрать более одного переключателя.

Есть несколько способов обеспечить ожидаемое поведение переключателей, но в приложениях FOX чаще всего для этой цели используют получатель данных — класс

FXDataTarget
. Это специальный объект, играющий роль хранителя какого-то значения. Как и любой другой объект в FOX,
FXDataTarget
может посылать и получать сообщения.

Программа в листинге 12.11 — модифицированный вариант предыдущей, в ней демонстрируется применение получателей данных.

Листинг 12.11. Переключатели в FOX и получатели данных

require 'fox16'

include Fox

class RadioButtonHandlerWindow < FXMainWindow

 def initialize(app)

# Сначала вызвать инициализатор базового класса.

super(app, "Radio Button Handler", nil, nil,

DECOR_TITLE | DECOR_CLOSE)

choices = [ "Good", "Better", "Best" ]

default_choice = 0

@choice = FXDataTarget.new{default_choice)

group = FXGroupBox.new(self, "Radio Test Group",

LAYOUT_SIDE_TOP |

FRAME_GROOVE |

LAYOUT_FILL_X)

choices.each_with_index do |choice, index|

FXRadioButton.new(group, choice,

@choice, FXDataTarget::ID_OPTION+index,

ICON_BEFORE_TEXT |

LAYOUT_SIDE_TOP)

end

 end

end

application = FXApp.new

main = RadioButtonHandlerWindow.new(application)

application.create

main.show(PLACEMENT_SCREEN)

application.run

В

этом примере
@choice
— экземпляр
FXDataTarget
, значением которого является целочисленный индекс выбранного в данный момент положения переключателя. Получатель данных инициализирован нулем, что соответствует элементу «Good» массива
choices
.

При конструировании каждого переключателя задается получатель данных, а идентификатор сообщения от переключателя делается равным

FXDataTarget::ID_OPTION
плюс желаемое значение. Если теперь запустить пример, то вы увидите, что переключатель стал вести себя как положено.

Для добавления в окно списка

FXList
и его инициализации тоже достаточно нескольких строк. Значение
LIST_BROWSESELECT
позволяет выбирать из списка ровно один элемент. В начальный момент выбран самый первый из них. Значение
LIST_SINGLESELECT
допускает выбор не более одного элемента; в этом случае в начальный момент ни один элемент не выбран:

@list = FXList.new(self, nil, 0,

 LIST_BROWSESELECT |

 LAYOUT_FILL_X)

@names = ["Chuck", "Sally", "Franklin", "Schroeder",

 "Woodstock", "Matz", "Lucy"]

@names.each { |name| @list.appendItem(name) }

Отметим, что вместо метода

appendItem
можно использовать оператор вставки в массив, то есть последнюю строку можно было бы записать и так:

@names.each { |name| @list << name }

Весь пример целиком приведен в листинге 12.12. Сообщение обрабатывается в главном окне, в результате выводится выбранный элемент. Если был задан режим

LIST_SINGLE_SELECT
, то важно отличать щелчок, при котором элемент был выбран, от щелчка, который отменил выбор.

Поделиться:
Популярные книги

Неучтенный элемент. Том 2

NikL
2. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 2

Рассвет русского царства

Грехов Тимофей
1. Новая Русь
Документальная литература:
историческая литература
5.00
рейтинг книги
Рассвет русского царства

Наследник жаждет титул

Тарс Элиан
4. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник жаждет титул

Перешагнуть пропасть

Муравьёв Константин Николаевич
1. Перешагнуть пропасть
Фантастика:
боевая фантастика
космическая фантастика
8.38
рейтинг книги
Перешагнуть пропасть

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Лекарь Империи 7

Карелин Сергей Витальевич
7. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 7

Измена дракона. Развод неизбежен

Гераскина Екатерина
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Измена дракона. Развод неизбежен

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

Апокриф

Вайс Александр
10. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Апокриф

Ученик. Книга 4

Первухин Андрей Евгеньевич
4. Ученик
Фантастика:
фэнтези
5.67
рейтинг книги
Ученик. Книга 4

Горизонт Вечности

Вайс Александр
11. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Горизонт Вечности

Гримуар темного лорда VIII

Грехов Тимофей
8. Гримуар темного лорда
Фантастика:
боевая фантастика
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Гримуар темного лорда VIII

Кондотьер

Листратов Валерий
7. Ушедший Род
Фантастика:
фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Кондотьер