KoMaDo   VISIO SQUARE : 雑談その他  ■ Headline ■ HOME    

雑談その他トップへ ▼カッ飛び最後 

  最近のトラブル

01: 名前:yoda投稿日:2007/03/08(木) 21:20
Visio2007が出てから、パソコンによって、Visio2003がインストール
されていたり、Visio2007がインストールされていたり、まちまちだと
厄介なことが、あるようです。MSの英文の掲示板には、それに関す
るトラブルの相談があいつでいます。

Visioのアッドインやアドオンなどを開発して使用してkる場合、
参照するVisioやDrawing Controlのバージョンが違うと、エラー
が発生して、うまく動きません。なかには、アドインのどのインスト
ールさえできない場合もあります。

また、パソコンのユーザーが、Visio2007にアップグレードしたが、
Visio2003で開発したアドインなどが動かなくなってしまうため、
元に戻した場合も、Visi2003のアドインなどが動かない場合も
あるようです。これらについて、どうしたらいいかという質問が、
相次いでいますが、妙案はないようです。困ったものです。

02: 名前:yoda投稿日:2007/03/22(木) 19:47
パソコンにインストールされているVisioのバージョンは、
Visioのインストールされているフォルダーを見るか、
実際にVisioを起動してみればすぐに分かります。
その上で、起動するインストーラを選んで起動すれば
よいのでしょうか。
これを、すべて自動的に行うようなプログラムは、
果たして作れるのでしょうか。

プログラムで、Visioのバージョンを調べるには、
いろいろな方法があると思いますが、
実際にVisioを起動して、Versionプロパティで
取得したバージョンを調べる方法もあります。
そのプログラムには、Visioへの参照設定を
することは、できません。
ためしにコードを書いてみると、以下のように
なります。(VB.Net2005 Expressを使用)
実行可能なexeファイルを圧縮したものを
http://www.mster.co.jp/visiosquare/cgi-bin/cbbs/file/VisioVersionCheck.lzh [source] [check]
にアップロードしました。
なお、Net FrameWork 2 がインストールされていることが
必要です。
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myapp As Object
Dim myV As String

Try
Me.TextBox1.Text = ""
Me.TextBox2.Text = ""
Me.Refresh()
Me.UseWaitCursor = True
Dim startInfo As New ProcessStartInfo("Visio.exe")
startInfo.WindowStyle = ProcessWindowStyle.Minimized
startInfo.CreateNoWindow = True
startInfo.Arguments = "/invisible"
Process.Start(startInfo)

System.Threading.Thread.Sleep(CInt(Me.TextBox3.Text))
Application.DoEvents()

myapp = GetObject(, "visio.application")
myV = myapp.Version()

If myV Like "12*" Then
Me.TextBox1.Text = "Visio2007"
ElseIf myV Like "11*" Then
Me.TextBox1.Text = "Visio2003"
ElseIf myV Like "10*" Then
Me.TextBox1.Text = "Visio2002"
ElseIf myV Like "9*" Then
Me.TextBox1.Text = "Visio2000"
Else
Me.TextBox1.Text = "Visio???"
End If
Me.TextBox2.Text = myV
Catch ex As Exception
If Err.Number = 429 Then
MessageBox.Show("タイマーの設定を長くしてください。 " & vbCrLf & Err.Description)
Else
MessageBox.Show(ex.ToString)
End If
myapp = GetObject(, "visio.application")
Finally
Me.UseWaitCursor = False
If myapp.documents.count = 0 Then
myapp.quit()
End If
End Try
End Sub
End Class

03: 名前:yoda投稿日:2007/03/22(木) 20:43
上のコードは、かなりいい加減でしたので、
以下のように訂正します。
実行可能なプログラムの訂正版は、
http://www.mster.co.jp/visiosquare/cgi-bin/cbbs/file/1174563568.lzh [source] [check]
にアップうロードしました。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Dim myapp As Object
Dim myV As String
Dim myapp As Object

Try
Me.TextBox1.Text = ""
Me.TextBox2.Text = ""
Me.Refresh()
Me.UseWaitCursor = True
Dim startInfo As New ProcessStartInfo("Visio.exe")

startInfo.Arguments = "/invisible"
Process.Start(startInfo)

System.Threading.Thread.Sleep(CInt(Me.TextBox3.Text))
Application.DoEvents()

myapp = GetObject(, "visio.application")
myV = myapp.Version()

If myV Like "12*" Then
Me.TextBox1.Text = "Visio2007"
ElseIf myV Like "11*" Then
Me.TextBox1.Text = "Visio2003"
ElseIf myV Like "10*" Then
Me.TextBox1.Text = "Visio2002"
ElseIf myV Like "9*" Then
Me.TextBox1.Text = "Visio2000"
Else
Me.TextBox1.Text = "Visio???"
End If
Me.TextBox2.Text = myV

Catch When Err.Number = 429
MessageBox.Show("タイマーの設定を長くしてください。 " & vbCrLf & Err.Description)

Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
Me.UseWaitCursor = False
myapp = GetObject(, "visio.application")
If myapp.documents.count = 0 Then
myapp.quit()
End If
End Try

End Sub
End Class

04: 名前:yoda投稿日:2007/05/18(金) 16:17
Visioのバージョンをチェックするプログラムの改良(?)版を
アップロードしました。
こんどは、フォームで、Sleepのタイマーの設定をしなくてもすむよう
に工夫し、押しボタンも取り去り、実行ファイルを実行したら、
バージョンを表示してくれるようにしました。
プログラムの中では、Visio.application がロードされないと、
GetObjectでエラーが発生するので、エラーが発生しなくなるまで、
GetObjectを1秒間隔で10回まで、トライするようにしました。
Upload bbsからダウンロードできます。
http://www.mster.co.jp/visiosquare/cgi-bin/cbbs/file/1179471759.lzh [source] [check]
解凍し、VB2005で、プロジェクトファイルを開き、実行できます。
そのとき、全体のフォルダーの中に、Binフォルダにできるので、
その中の、EXEファイルを、コピーして、使用することができます。


雑談その他トップへ ▲カッ飛び先頭