ようこそゲストさん

Super Neurotic Junction

2012/02/26(日) rubyでメッセージボックス

2012/02/26 23:03 研究課題snjx
メッセージボックスというか、Windows Scripting Hostのpopupなんだけど。
ポイントは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関数たたいて値とるのもあほらしいので、コピペ用に定数のテキストを書いてみた次第。

1: 2022年02月28日(月) 午前11時46分

クラス内の定義を削除して、
WIN32OLE.const_load('Visual Basic For Applications', Msgbox)
で Msgbox::VbOK などロードできますよ(^_^)


名前:  非公開コメント   

E-Mail(任意/非公開):
URL(任意):
  • TB-URL  http://snjx.info/diary/snjx/052/tb/