Программирование на языке Ruby.

12.3.3. Кнопки.

Вы уже видели, как организуется работа с кнопками в FXRuby. Заглянем немного глубже.

На кнопке может размещаться не только короткая строка. Допустимы и несколько строк, разделенных символом новой строки:

Text = "&Hello, World!\n" +

 "Do you see multiple lines of text?".

FXButton.new(self, text).

Обратите внимание на амперсанд перед буквой H в строке "Hello, World!". Он задает «горячую клавишу», нажатие которой эквивалентно щелчку по кнопке.

На кнопке может быть также нарисовано изображение, заданное в разных форматах. Например:

Text = "&Неllо, World!\n" +

 "Do you see the icon?\n" +

 "Do you see multiple lines of text?".

Icon = File.open("some_icon.gif", "rb") do |file|

 FXGIFIcon.new(app, file.read).

End.

FXButton.new(self, text, icon).

В листинге 12.9 иллюстрируется механизм обновления состояния интерфейса, реализованный в FOX:

Листинг 12.9. Обновление состояния интерфейса в FOX.

Require 'fox16'.

Include Fox.

Class TwoButtonUpdateWindow < FXMainWindow.

 def initialize(app).

  # Сначала инициализируем базовый класс.

  super(app, "Update Example", nil, nil,

  DECOR_TITLE | DECOR_CLOSE).

  # Первая кнопка:

  @button_one = FXButton.new(self, "Enable Button 2").

  @button_one_enabled = true.

  # Вторая кнопка:

  @button_two = FXButton.new(self, "Enable Button 1").

  @button_two.disable.

  @button_two_enabled = false.

  # Устанавливаем обработчики сообщений.

  @button_one.connect(SEL_COMMAND, method(:onCommand)).

  @button_two.connect(SEL_COMMAND, method(:onCommand)).

  @button_one.connect(SEL_UPDATE, method(:onUpdate)).

  @button_two.connect(SEL_UPDATE, method(:onUpdate)).

 end.

 def onCommand(sender, sel, ptr).

  # Обновить состояние приложения.

  @button_one_enabled = !@button_one_enabled.

  @button_two_enabled = !@button_two_enabled.

 end.

 def onUpdate(sender, sel, ptr).

  # Обновить кнопки в зависимости от состояния приложения.

  @button_one_enabled ?

  @button_one.enable : @button_one.disable.

  @button_two_enabled ?

  @button_two.enable : @button_two.disable.

 end.

End.

Application = FXApp.new.

Main = TwoButtonUpdateWindow.new(application).

Application.create.

Main.show(PLACEMENT_SCREEN).

Application.run.

Здесь в главное окно добавлено две кнопки. Мы снова воспользовались методом connect, чтобы связать сообщение SEL_COMMAND от кнопок с кодом, но на этот раз код представляет собой метод, а не блок:

@button_one.connect(SEL_COMMAND, method(:onCommand)).

В этом примере мы встречаем еще один тип сообщения — SEL_UPDATE. Такое сообщение позволяет сделать виджеты независимыми друг от друга и от кода приложения. Как видим, ни одна кнопка не подозревает о существовании другой. Первая кнопка обновляет состояние второй, посылая сообщение обработчикам, которые отвечают за изменение состояния.