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, то важно отличать щелчок, при котором элемент был выбран, от щелчка, который отменил выбор.

Листинг 12.12. Виджет FXList

require 'fox16'

include Fox

class ListHandlerWindow < FXMainWindow

 def initialize(app)

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

  super(app, 'List Handler', nil, nil,

   DECOR_TITLE | DECOR_CLOSE)

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

   LIST_BROWSESELECT |

   LAYOUT_FILL_X)

  @list.connect(SEL_COMMAND) do |sender, sel, pos|

   puts pos.to_s + ' => ' + @names[pos]

  end

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату