第 26 章 MICROSOFT VISUAL BASIC による VISIO アプリケーションのプログラミング
オートメーションから Visio® アプリケーションを制御するプログラムは、Visio インスタンスと連携して動作する必要があります。新しい Visio インスタンスを実行するか、既に実行されているインスタンスを使用するかは、プログラムの目的によって決まります。
このセクションの内容...
Microsoft Visual Basic プログラムでの Application オブジェクトの使用 : 例
Application オブジェクト用の Visio オブジェクト変数を宣言したら、Set ステートメントで CreateObject 関数を使用してオブジェクトを作成します。それをオブジェクト変数に割り当てると、そのオブジェクト変数を使用してインスタンスを制御できます。例を次に示します。
Set appVisio = CreateObject("Visio.Application")
Application オブジェクトを作成すると、既に他のインスタンスが実行されていても、新しい Visio インスタンスが実行されます。
CreateObject 関数では、表示されない Visio インスタンスを作成することもできます。例を次に示します。
Set appVisio = CreateObject("Visio.InvisibleApp")
インスタンスの表示/非表示を制御するには、Application オブジェクトの Visible プロパティを使用します。
注 InvisibleApp オブジェクトは、CreateObject 関数でしか取り扱えません。GetObject 関数でこのオブジェクトを取得しようとすると、エラーが発生します。InvisibleApp オブジェクトは、Visio 2000 より前のバージョンの Visio 製品では使用できません。
GetObject 関数を使って、既に実行されている Visio インスタンスの Application オブジェクトを取得することができます。例を次に示します。
Set appVisio = GetObject(, "Visio.Application")
GetObject 関数の最初の引数 (ディスク ファイルへのパス) が省略されて、カンマ ( , ) だけになっています。場合によっては GetObject 関数の最初の引数としてファイル名を指定する必要があります。ただし、Visio インスタンスを取得する場合は、カンマの前のファイル名引数を省略します。省略しないとエラーが発生します。GetObject 関数の詳細については、Microsoft Visual Basic のマニュアルを参照してください。
複数の Visio インスタンスが実行されている場合、GetObject 関数はそのうちのアクティブなインスタンスを返します。プログラムがアドオンとして、または図形をダブルクリックして実行されている場合は、そのプログラムの実行元のインスタンスがアクティブ インスタンスになります。それ以外の場合は、最後に実行された、または前面に表示されているインスタンスがアクティブ インスタンスになります。Visio インスタンスが実行されていない場合に GetObject 関数を呼び出すと、エラーが発生します。
アプリケーションのインスタンスは、Quit メソッドを使用するまで、またはユーザーがインスタンスを閉じるまで保持されます。プログラムの実行中にユーザーが突然インスタンスを閉じる場合に備えて、なんらかのエラー処理やイベントを組み込んでおくことをお勧めします。
イベントの処理の詳細については、「第 21 章 Visio のイベントの処理」を参照してください。
次の Visual Basic サブルーチンは、Visio インスタンスを実行し、テンプレートおよびステンシルを開いて図面を作成する Application オブジェクトを作成します。このサブルーチンでは、次の手順で処理が行われます。
Sub HelloWorld ()
Dim appVisio As Visio.Application 'Instance of Visio
Dim docsObj As Visio.Documents 'Documents collection of instance
Dim docObj As Visio.Document 'Document to work in
Dim stnObj As Visio.Document 'Stencil that contains master
Dim mastObj As Visio.Master 'Master to drop
Dim pagsObj As Visio.Pages 'Pages collection of document
Dim pagObj As Visio.Page 'Page to work in
Dim shpObj As Visio.Shape 'Instance of master on page
'Create an instance of Visio and create a document based on the Basic
'template. It doesn't matter if an instance of Visio is already running;
'the program will run a new one.
Set appVisio = CreateObject("visio.application")
Set docsObj = appVisio.Documents
'Create a document based on the Basic Diagram template which automatically
'opens the Basic Shapes stencil.
Set docObj = docsObj.Add("基本ダイアグラム.vst")
Set pagsObj = appVisio.ActiveDocument.Pages
'A new document always has at least one page, whose index in the Pages collection is 1.
Set pagObj = pagsObj.Item(1)
Set stnObj = appVisio.Documents("基本シェイプ.vss")
Set mast0bj = stn0bj.Masters("長方形")
'Drop the rectangle in the approximate middle of the page.
'Coordinates passed with Drop are always inches.
Set shpObj = pagObj.Drop(mastObj, 4.25, 5.5)
'Set the text of the rectangle
shpObj.Text = "Hello World!"
'Save the drawing and quit Visio. The message pauses the program
'so you can see the Visio drawing before the instance closes.
docObj.SaveAs "hello.vsd"
MsgBox "Drawing finished!", , "Hello World!"
appVisio.Quit
End Sub
CreateObject 関数は、オートメーション オブジェクトを作成する Visual Basic の関数です。この例では、CreateObject 関数によって新しい Visio インスタンスが実行され、インスタンスを表す Application オブジェクトが返されて、変数 appVisio に割り当てられています。次の 6 つの Set ステートメントでは、取得済みのオブジェクトのプロパティを使用して、このプログラムで使用されるほかのオブジェクトへの参照を取得しています。これらの参照は、Application オブジェクトから、Documents コレクション、Document オブジェクト、Pages コレクション、Page オブジェクトへと、Visio オブジェクト モデル内を順にたどりながら取得されています。
Set docObj = docsObj.Add("基本ダイアグラム.vst") では、Add メソッドを使用してテンプレートを開き、Documents コレクションに追加しています。Document オブジェクトを追加する方法の詳細については、「セクション 2 Visio の図面の作成」を参照してください。
appVisio.Quit ステートメントでは、Quit メソッドを使用して、appVisio に割り当てられた Visio インスタンスを閉じています。
CreateObject または GetObject 関数が何らかの原因で失敗すると、エラーが発生します。たとえば、Visio がインストールされていないシステムで CreateObject を呼び出した、GetObject 関数が実行中のインスタンスを見つけられなかったなどの原因が考えられます。 Visreg.bas 内の vaoGetObject 関数は、以下のようなエラー処理機能を備えているため、CreateObject および GetObject 関数の代わりに使用すると便利です。
Visreg.bas には、Visio インスタンスを効率的に処理する関数のライブラリが含まれています。ライブラリでは、グローバル変数 g_appVisio が定義されています。関数のライブラリを使用するには、Visual Basic プロジェクトに Visreg.bas を組み込み、g_appVisio を使用して Application オブジェクトを参照します。
Visreg.bas を Visual Basic プロジェクトに組み込むには、[プロジェクト] メニューから [ファイルの追加] を選択します。
次の例では、vaoGetObject 関数を使用して Visio インスタンスを取得しています。インスタンスが実行されていない場合は、新しいインスタンスを実行します。インスタンスを実行できない場合は、メッセージ ボックスを表示します。
Sub appConnect()
If vaoGetObject() <> visOK Then
MsgBox ("Visio を実行できません。")
End If
End Sub
ウィンドウ ハンドルを取得することで、Visio インスタンスをより効果的に制御できます。ウィンドウ ハンドルを取得すると、Microsoft Windows アプリケーションから他のフレーム ウィンドウを管理するように、インスタンスのフレーム ウィンドウを管理できます。たとえば、プログラムで複雑な図面を作成する間は、画面の再描画のスピードを早めるためにインスタンスを最小化することができます。
Application オブジェクトの WindowHandle32 プロパティは、インスタンスのメイン ウィンドウまたはフレーム ウィンドウ用のウィンドウ ハンドル HWND を返します。標準 Windows API の呼び出しで HWND を使用すると、他のハンドルを取得することができます。たとえば、Visio タスク ハンドルを取得するには、ウィンドウ ハンドルを GetWindowTask に渡します。
Windows API 呼び出しの使用方法の詳細については、Microsoft Visual Basic のマニュアルを参照してください。
Application オブジェクトの Addons コレクションを取得すると、プログラムの実行中に、Visio で実行できるプログラムを検索したり、別のプログラムをインストールすることができます。このコレクションには、Application オブジェクトの AddonPaths プロパティと StartupPaths プロパティで指定されたフォルダにある各プログラムの Addon オブジェクト、または他のプログラムによって動的に追加された Addon オブジェクトが含まれます。
Addon オブジェクトを表すプログラムは、[マクロ] サブメニューおよび [マクロ] ダイアログ ボックスに表示されます。プログラムを追加するには、Application オブジェクトの Addons コレクションの Add メソッドを使用します。新しく追加されたプログラムは、Visio インスタンスを閉じるまで、Addons コレクションに残されます。
Set addonsObj = Visio.Application.Addons Set addonObj = addonsObj.Add("c:¥temp¥myprog.exe")
Addon オブジェクトの名前を調べるには、Addon オブジェクトの Name プロパティを取得します。Addon オブジェクトを実行できるかどうかを確認するには、Enabled プロパティを取得します。EXE ファイルは常に実行できますが、Visio ライブラリ内のプログラムは実行できない場合があります。詳細については、「第 27 章 C++ による Visio アプリケーションのプログラミング.」を参照してください。
ほかのプログラムを実行するには、必要な引数または Null 文字列を指定して、そのプログラムの Addon オブジェクトの Run メソッドを呼び出します。
Addon オブジェクト、およびそのメソッドとプロパティの詳細については、お使いの Visio 製品付属のオンラインヘルプの「開発者用リファレンス」 ([ヘルプ] メニューから [開発者用リファレンス] を選択) を参照してください。