Хэл Фултон - Программирование на языке Ruby
- Название:Программирование на языке Ruby
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2007
- Город:Москва
- ISBN:5-94074-357-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хэл Фултон - Программирование на языке Ruby краткое содержание
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
Программирование на языке Ruby - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
# Устанавливаем обработчики сообщений.
@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
. Такое сообщение позволяет сделать виджеты независимыми друг от друга и от кода приложения. Как видим, ни одна кнопка не подозревает о существовании другой. Первая кнопка обновляет состояние второй, посылая сообщение обработчикам, которые отвечают за изменение состояния.
12.3.4. Текстовые поля
FOX располагает полезными средствами для ввода текста. В следующем примере демонстрируется применение класса FXTextField
для редактирования одной строки. Параметры определяют формат текста. Значение TEXTFIELD_PASSWD
скрывает текст, являющийся паролем, TEXTFIELD_REAL
позволяет вводить только действительные числа в научной нотации, a TEXTFIELD_INTEGER
— только целые числа.
simple = FXTextField.new(main, 20, nil, 0,
JUSTIFY_RIGHT|FRAME_SUNKEN|
FRAME_THICK|LAYOUT_SIDE_TOP)
simple.text = "Simple Text Field"
passwd = FXTextField.new(main, 20, nil, 0,
JUSTIFY_RIGHT|TEXTFIELD_PASSWD|
FRAME_SUNKEN|FRAME_THICK|
LAYOUT_SIDE_TOP)
passwd.text = "Password"
real = FXTextField.new(main, 20, nil, 0,
TEXTFIELD_REAL|FRAME_SUNKEN|
FRAME_THICK|LAYOUT_SIDE_TOP|
LAYOUT_FIX_HEIGHT, 0, 0, 0, 30)
real.text = "1.0E+3"
int = FXTextField.new(main, 20, nil, 0, TEXTFIELD_INTEGER|
FRAME_SUNKEN|FRAME_THICK|
LAYOUT_SIDE_TOP|LAYOUT_FIX_HEIGHT,
0, 0, 0, 30)
int.text = "1000"
Ниже показан простой способ ввода текста с помощью диалогового окна. В зависимости от выбранного метода можно будет вводить любой текст, только действительные или только целые числа.
puts FXInputDialog.getString("initial text",
self, "Диалог для ввода текст",
"Введите текст:", nil)
puts FXInputDialog.getInteger(1200, self,
"Диалог для ввода целого числа",
"Введите целое число:", nil)
puts FXInputDialog.getReal(1.03е7, self,
"Диалог для ввода числа в научной нотации",
"Введите действительное число:", nil)
Для экономии места мы не станем приводить полный текст приложения. Но, конечно, перед выводом диалогового окна необходимо выполнить обычную инициализацию.
12.3.5. Прочие виджеты
В следующем примере демонстрируется использование меню и полос меню в приложениях. Отметим, что объекты FXMenuCommand
следуют общей для FOX парадигме сообщение/получатель, с которой мы уже сталкивались при работе с кнопками:
require 'fox16'
include Fox
application = FXApp.new
main = FXMainWindow.new(application, "Simple Menu")
menubar = FXMenuBar.new(main, LAYOUT_SIDE_TOP |
LAYOUT_FILL_X)
filemenu = FXMenuPane.new(main)
quit_cmd = FXMenuCommand.new(filemenu, "&Quit\tCtl-Q")
quit_cmd.connect(SEL_COMMAND) { application.exit }
FXMenuTitie.new(menubar, "&File", nil, filemenu)
application.create
main.show(PLACEMENT_SCREEN)
application.run
Здесь и FXMenuBar
, и FXMenuPane
добавляются непосредственно в главное окно FXMainWindow
. Благодаря параметрам LAYOUT_SIDE_TOP
и LAYOUT_FILL_X
полоса меню размещается в верхней части родительского окна и простирается от левой до правой границы. Текст команды меню "&Quit\tCtl-Q"
подразумевает, что комбинация клавиш Alt+Q играет роль «горячей клавиши», a Ctrl+Q — клавиши быстрого выбора пункта меню. Последовательное нажатие Alt+F и Alt+Q эквивалентно щелчку по меню File с последующим выбором пункта Quit. Нажатие Ctrl+Q заменяет всю последовательность.
В классе FXTopWindow
есть метод для свертывания главного окна. Следующие три строчки добавляют в меню File команду, которая свернет окно:
FXMenuCommand.new(filemenu, "&Icon\tCtl-I") do |cmd|
cmd.connect(SEL_COMMAND) { main.minimize } end
На этом примере мы видим еще один прием, полезный при конструировании команды меню. Если вам не нужна ссылка на виджет, представляющий команду меню, то можно просто присоединить блок к вызову FXMenuCommand.new
и выполнить всю инициализацию виджета внутри блока. Разумеется, этот прием применим к любому встроенному в FOX классу.
В листинге 12.10 демонстрируются переключатели.
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 — модифицированный вариант предыдущей, в ней демонстрируется применение получателей данных.
require 'fox16'
include Fox
class RadioButtonHandlerWindow < FXMainWindow
def initialize(app)
# Сначала вызвать инициализатор базового класса.
Интервал:
Закладка: