Программирование на языке Ruby - [176]

Шрифт
Интервал

После того как объект создан, можно обратиться к его методу >call для вызова функции Windows. Синоним — >Call.

В примере ниже мы вызываем функцию >GetCursorPos, которая возвращает указатель на структуру >POINT. Эта структура состоит из двух полей типа >long. Чтобы получить их значения, мы можем воспользоваться методом >unpack:

>require 'Win32API'

>result = "0"*8 # Восемь байтов (достаточно для двух long).

>getCursorXY = Win32API.new("user32","GetCursorPos",["P"],"V")

>getCursorXY.call(result)

>x, y = result.unpack("LL") # Два long.

В данном случае функция вернула составные двоичные данные, а иногда такие данные нужно подать на вход функции. Понятно, что для этого нужно воспользоваться методом >pack, который упакует данные в строку.

У описанной техники может быть много применений. Еще два примера приведены в разделах 10.1.20 и 14.1.1.

14.5.2. Расширение Win32OLE

Расширение >Win32OLE (правильно писать его имя строчными буквами: >win32ole) реализует интерфейс к OLE-автоматизации в Windows. Программа на Ruby может выступать в роли клиента любого сервера автоматизации, к числу которых относятся, например, Microsoft Word, Outlook, Internet Explorer, а также многие продукты третьих фирм.

Для того чтобы начать взаимодействие с внешним приложением, мы создаем объект класса >WIN32OLE. С его помощью мы получим доступ ко всем свойствам и методам, которые раскрывает данное приложение. В примере ниже объект ассоциируется с редактором Microsoft Word. Атрибуту >visible мы присвоим значение >true, а в конце вызовем метод >quit, чтобы завершить внешнюю программу.

>require "win32ole"


>word = WIN32OLE.new "Word.Application"


>word.visible = true


># ...


>word.quit

Свойства сервера автоматизации выглядят как атрибуты объекта. Их можно читать и устанавливать.

Имеется и альтернативная нотация, в которой для доступа к свойствам используется конструкция, напоминающая хэш.

>player["FileName"] = "file.wav"

>name = player["FileName"]

># Эквивалентно следующим предложениям:

># player.FileName = "file.wav"

># name = player.FileName

У этой нотации есть то преимущество, что она позволяет проще осуществлять динамический доступ к свойствам, как показано в искусственном примере ниже:

>puts "Введите имя свойства"

>prop = gets

>puts "Введите новое значение"

>val = gets

>old = obj[prop]

>obj[prop] = val

>puts "#{prop} было #{old}... стало #{obj[prop]}"

Но обратимся к более жизненным примерам. Следующий код получает от пользователя имя файла, передает его Microsoft Word и распечатывает файл:

>require "win32ole"


>print "Введите имя файла для распечатки: "

>docfile = gets


>word = WIN32OLE.new "Word.Application"

>word.visible = true

>word.documents.open docfile

>word.options.printBackground = false

># Можно было бы также установить свойство printBackground в true,

># но тогда пришлось бы дожидаться, пока весь файл будет

># скопирован в буфер принтера, и только потом вызывать quit...

>word.activeDocument.printout

>word.quit

В следующем примере проигрывается WAV-файл. Недостаток заключается в том, что в конце программы мы поставили >sleep на случайно выбранное время, а не просто дожидаемся, когда воспроизведение закончится. Предлагаем читателю устранить этот недочет в качестве упражнения.

>require "win32ole"


>sound = WIN32OLE.new("MCI.MMcontrol")


>wav = "с:\\windows\\media\\tada.wav"

>sound.fileName = wav


>sound.autoEnable = true


>sound.command = "Open"

>sound.command = "Play"


>sleep 7

В листинге 14.2 мы просим Internet Explorer открыть диалог для ввода текста.

Листинг 14.2. Открытие диалога для ввода текста в браузере

>require "win32ole"


>def ieInputBox( msg, default )

> ie = WIN32OLE.new("InternetExplorer.Application");

> ie.visible = false

> ie.navigate "about:blank"

> sleep 0.01 while (ie.busy)


> script = ie.Document.Script;

> result = script.prompt(msg,default);

> ie.quit


> result

>end


># Главная программа...


>result = ieInputBox( "Введите свое имя",

> "Дэйв Боумэн")

>if result

> puts result

>else

> puts "Пользователь нажал Cancel"

>end

В листинге 14.3 мы открываем IE в небольшом окне и выводим в него HTML-документ.

Листинг 14.3. Для вывода в окно браузера требуется win32ole

>html = <

>

A теперь что-нибудь

совсем

другое...

>

>EOF


>ie = WIN32OLE.new("InternetExplorer.Application");


>ie.left = 150

>ie.top = 150

>ie.height = 200

>ie.width = 300

>ie.menubar = 0

>ie.toolbar = 0

>ie.navigate "about:blank"

>ie.visible=TRUE;


>ie.document.open

>ie.document.write html

>ie.document.close

>sleep 5

>ie.quit

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

>require "win32ole"


>cd = WIN32OLE.new("MSComDlg.CommonDialog")


># Задать фильтр файлов

>cd.filter = "All Files(*.*)| *.*" +

> "| Ruby Files(*.rb)|*.rb"

>cd.filterIndex = 2


>cd.maxFileSize = 128 # Установить MaxFileSize.


>cd.showOpen()

>file = cd.fileName   # Получить путь к файлу.

>if not file or file==""

> puts "Файл не выбран."

>else

> puts "Пользователь выбрал: #{file}\n"

>end

И, наконец, определим IP-адрес своего компьютера:

>require "win32ole"


>ws = WIN32OLE.new "MSWinsock.Winsock"


># Получить свойство LocalIP

>ipAddress = ws.localIP


>puts "Локальный IP-адрес равен : #{ipAddress}"

Как видите, возможности не ограничены. Развлекайтесь и не забывайте делиться своими программами с другими!


Рекомендуем почитать
Графика DirectX в Delphi

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.