▼ 2012/02/26(日) rubyでメッセージボックス
2012/02/26 23:03 【研究課題】
メッセージボックスというか、Windows Scripting Hostのpopupなんだけど。
ポイントはVbOKOnlyとかの定数を書いているところ。
win32oleの使い方は結構あちこちで書いてあるし、excelなんかが持っている定数をrubyで使う方法なんかは探すと見つかるけど、意外や意外、普通にメッセージボックスを使う方法が結構少なかった。
で、ま、最低限いりそうな部分を書いてみたのさ。
ほんとのこというと、Win32OLE 活用法 【第 2 回】 Excelに書いてあるように、const_loadを使ってまとめて持ってきたかったけど、VisualStudioのオブジェクトブラウザで見ると、どーも俺が使いたい定数って、VisualBasicの組み込み定数ッポイ。
単純に値をとるだけだったら、eval使って持ってこれるけど…
毎回VBAのeval関数たたいて値とるのもあほらしいので、コピペ用に定数のテキストを書いてみた次第。
ポイントはVbOKOnlyとかの定数を書いているところ。
win32oleの使い方は結構あちこちで書いてあるし、excelなんかが持っている定数をrubyで使う方法なんかは探すと見つかるけど、意外や意外、普通にメッセージボックスを使う方法が結構少なかった。
で、ま、最低限いりそうな部分を書いてみたのさ。
require 'win32ole' require 'singleton' class Msgbox include Singleton # ボタンの種類 VbOKOnly = 0 #[OK] VbOKCancel = 1 #[OK] [キャンセル] VbAbortRetryIgnore = 2 #[中止] [再試行] [無視] VbYesNoCancel = 3 #[はい] [いいえ] [キャンセル] VbYesNo = 4 #[はい] [いいえ] VbRetryCance = 5 #[再試行] [キャンセル] # アイコン VbCritical = 16 #警告メッセージ アイコン VbQuestion = 32 #問い合わせメッセージ アイコン VbExclamation = 48 #注意メッセージ アイコン VbInformation = 64 #情報メッセージ アイコン # ボタン戻り値 VbOK = 1 #[OK]ボタン VbCancel = 2 #[キャンセル] ボタン。 VbAbort = 3 #[中止] ボタン。 VbRetry = 4 #[再試行] ボタン。 VbIgnore = 5 #[無視] ボタン。 VbYes = 6 #[はい] ボタン。 VbNo = 7 #[いいえ] ボタン。 def initialize @wsh = WIN32OLE.new('WScript.Shell') end def open(strText,intSecondsToWait,strTitle,intType = VbOKOnly + VbInformation ) @wsh.popup(strText,intSecondsToWait,strTitle,intType) end end msgbox = Msgbox.instance msgbox.open("hoge",0,"fuga") #デフォ ret = msgbox.open("hoge",0,"fuga", Msgbox::VbOKCancel + Msgbox::VbCritical ) #OkCancelでやばいアイコン case ret when Msgbox::VbOK puts "ok" when Msgbox::VbCancel puts "cancel" end
ほんとのこというと、Win32OLE 活用法 【第 2 回】 Excelに書いてあるように、const_loadを使ってまとめて持ってきたかったけど、VisualStudioのオブジェクトブラウザで見ると、どーも俺が使いたい定数って、VisualBasicの組み込み定数ッポイ。
単純に値をとるだけだったら、eval使って持ってこれるけど…
irb(main):001:0> require'win32ole' '&#' . ord(=) . ';'> true irb(main):002:0> sc=WIN32OLE.new("ScriptControl") '&#' . ord(=) . ';'> #<WIN32OLE:0x42c7ff8> irb(main):003:0> sc.language="VBScript" '&#' . ord(=) . ';'> "VBScript" irb(main):004:0> puts sc.eval('vbOkOnly') 0 '&#' . ord(=) . ';'> nil irb(main):005:0> puts sc.eval('vbOk') 1 '&#' . ord(=) . ';'> nil irb(main):007:0>OLEオートメーションで公開されている定数なら言語に依存しないのでrubyでも使えるけど、VBの組み込み定数を同じように引っ張ってくる方法は見つけられなかった。
毎回VBAのeval関数たたいて値とるのもあほらしいので、コピペ用に定数のテキストを書いてみた次第。
- TB-URL http://snjx.info/diary/snjx/052/tb/
1: よ 2022年02月28日(月) 午前11時46分
クラス内の定義を削除して、
WIN32OLE.const_load('Visual Basic For Applications', Msgbox)
で Msgbox::VbOK などロードできますよ(^_^)