トップ回答者
VBA2008ExpressEdititionでのXPへの対応の件

質問
回答
-
長いコードなので最後までは読んでいませんが、Paint イベントのところで InputBox や MessageBox の類は使わないでください。
きつい言い方になりますが、Windows のプログラムとしてやってはいけないことをしていることになります。
(Vista で改善された部分かもしれませんが、XP までの Windows では NG となる行為です)Paint イベントは画面に描画してほしいときに呼び出されますが、InputBox で待っている間にも再度描画要求がきたりします。
従って、Paint イベントで Form を表示したり、InputBox や MessageBox を表示したりするようなコードを書いてはいけません。
描画するためのパラメータは Paint イベント以外で集めてください。次に、Paint イベントでは CreateGraphics を使わず、e.Graphics を使ってください。
Paint イベントを使ったサンプルを探して確認してみてください。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク tyokogawa 2010年5月20日 3:28
すべての返信
-
どういったようにうまくいかないのでしょうか?エラーが表示されるなどでしょうか?
また、インストールした Express Edition の Service Pack の有無は同じでしょうか?
.NET Framework 以外にコントロールを使った、ライブラリを使ったなどはないでしょうか?タイトルに「フォームボタン表示でのエラー」とありますが、もう少し詳しく教えていただけませんか?
タイトルではなく、ハンドルです。
過去にもこのプロファイルで投稿があることから、今回の投稿との関連性はないかもしれません。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
「フォームボタン表示でのエラー」と言うのとは質問の内容は違います。VISTAパソコン(自宅のPC)では問題なくプログラムが走るのにXP(会社のPC)では走らない。例えば①InputBoxでデータを入力するのですがXPでは同じInputBoxが2回(最初のInputBoxのみですが)続けて出現する。②Formを一旦、クリアする為のClearColor(e)が作動しない。③かってにプログラムが途中でストップして最初の宣言部分に戻っているような感じ。です。以上の問題は自宅のPC(VISTA)では全然、生じずにうまく走っています。VBA2008ExpressEditionのインストールに当たってはVISTAでもXPでも同じインストールだと思いましたが何か違うところがあるのでしょうか?それとも、XPではVBA2008ExpressEditionは作動しないステートメント等があるのでしょうか?
-
①InputBoxでデータを入力するのですがXPでは同じInputBoxが2回(最初のInputBoxのみですが)続けて出現する。②Formを一旦、クリアする為のClearColor(e)が作動しない。
③かってにプログラムが途中でストップして最初の宣言部分に戻っているような感じ。通常、XP だから、Vista だからといってそのような動きの差にはなりません。
ソースコードに何らかの誤りがあるのではないでしょうか。
あるマシンで正常に動作するからと行って、ソースコードに間違いがないとは限りません。InputBox だけ実行するプログラムを作って試してみて、問題をほかの人でも再現できるようにソースコードを提示してみてください。
VBA2008ExpressEditionのインストールに当たってはVISTAでもXPでも同じインストールだと思いましたが何か違うところがあるのでしょうか?
本筋じゃありませんが、VBA ではなく、VB です。(VBA は Office などに組み込まれているもので、違うものです)
それとも、XPではVBA2008ExpressEditionは作動しないステートメント等があるのでしょうか?
そういうものは例外(Exception)として出てきますので、そういった可能性は低いと思われます。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
通常、XP だから、Vista だからといってそのような動きの差にはなりません。
ソースコードに何らかの誤りがあるのではないでしょうか。
あるマシンで正常に動作するからと行って、ソースコードに間違いがないとは限りません。上記のコメントを頂きましたが、と言うことは”あるマシンでは正常に動作するのにあるマシンでは同じ環境(同じVB2008ExpressEditionインストール、同じプログラムを起動)であるにもかかわらず動作しない”と言うことがあると言うことでしょうか?私の場合は自宅のVISTAでプログラムを作成し、うまく動作したので今度はそのプログラムをUSBを介して会社のXPにコピーして動作させたところ以前に投稿させて頂いたようなトラブルが出ます。もちろんいずれのPCにもVB2008ExpressEditionは同様にインストールしてあります。何かそのUSBを介したやり方、あるいは、VISTAからXPへの移植が問題になるとか言う様なことは無いでしょうか?(ちなみに私は最初の質問者です)
-
上記のコメントを頂きましたが、と言うことは”あるマシンでは正常に動作するのにあるマシンでは同じ環境(同じVB2008ExpressEditionインストール、同じプログラムを起動)であるにもかかわらず動作しない”と言うことがあると言うことでしょうか?
たとえば、exe ファイル以外の何かに依存する場合は、単にファイルをコピーするだけでは動きません。
"D:\" に何か読み書きするようなアプリケーションを作った場合、別のマシンの D:\ が CD/DVD ドライブだと書き込みができませんよね。そのほかには、自分のマシンには入っているライブラリ、コントロールだが、標準では入っていないものを利用している場合、相手のマシンにそれがないと動かないことはあり得ます。
何かそのUSBを介したやり方、あるいは、VISTAからXPへの移植が問題になるとか言う様なことは無いでしょうか?
環境差によって起きる・起きないは、今の情報では特定できないので、アドバイスしようがありません。
ですので、シンプルなプロジェクトを作って、実験してみてくださいと先の発言で提案しています。シンプルなプロジェクトでも起きるのであれば、それに注目して原因を推測すれば良いでしょう。
逆にシンプルなプロジェクトでは再現しないのであれば、InputBox が問題ではないのかもしれません。別の違い(観点)を見つけていく必要があります。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
私の感想ですので、ずれておれば、ご容赦ください。
VB6の場合で、DoEventsを入れたら、バグが発生すると言う話題に似ているなと思いました。
DoEventsを入れていないから、たまたま、うまく動いているような。
進捗を表す、プログレスバーの場合、XPや7では、プログラムどおり、伸びていくのですが、VISTAの場合は、少し遅れる。
感覚的に言うと、XPや7では、バーを伸ばす、処理をするの繰り返しですが、VISTAの場合、バーを伸ばしつつ処理をする感じです。
DoEventsを入れているのにです。(かえってリアル感があります。)XPで、開発されてはいかがでしょうか。
-
念のため。
感覚的に言うと、XPや7では、バーを伸ばす、処理をするの繰り返しですが、VISTAの場合、バーを伸ばしつつ処理をする感じです。
DoEventsを入れているのにです。(かえってリアル感があります。)VB6 ではスレッドの概念がないので避けられないのかもしれませんが、.NET 世代では Application.DoEvents の利用は避けるべきです。
スレッドに関するクラス(Thread など)、コンポーネント(BackgroundWorker)が提供されているので頼る必然性もありません。
とりあえず使うという風にしてしまうと、不具合の温床になるので…。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
最初の質問者です。以下に確認用のプログラムを作成してみました。VISTAで作成し、VISTAでは問題なく、動作しましたが、XPで動作確認したところ、
前回報告したようにInputBoxでの問い合わせが何回も出てきて、又、プログラム中の別の分割数を入れるInputBoxが出現しません。やはり、VISTAでは
問題なく作動するプログラムがXPでは上手く作動しません。どなたか御指導いただきたく!
Public Class Form1 Dim WT, THIN, W, NCI, NCO As Integer Dim SLI, SLO As Double 'SLIは板長さ(m)、WTは全体重量(Ton)、THINは板厚み(mm)、Wは板幅(mm)、NCIは均等分割数 Public Sub form1_paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint WT = CInt(InputBox("全体重量WT(Ton)は?<例:15>", "板長さ算出", CStr(WT), 300, 550)) THIN = CInt(InputBox("板厚みTHIN(mm)は?<例:2>", "板長さ算出", CStr(THIN), 300, 550)) W = CInt(InputBox("板幅W(mm)は?<例:1200>", "板長さ算出", CStr(W), 300, 550)) NCI = CInt(InputBox("均等分割数は?<例:3>", "板長さ算出", CStr(NCI), 300, 550)) SLI = WT * 10 ^ 9 / 7850 / THIN / W / NCI MsgBox("分割後の板長さSLIは" & CInt(SLI) & "mです。") Dim aFont As New System.Drawing.Font("Arial", 7, FontStyle.Bold) Dim o As Graphics : o = Me.CreateGraphics Dim myPon As New System.Drawing.Pen(System.Drawing.Color.Blue) Dim formGraphics As System.Drawing.Graphics formGraphics = Me.CreateGraphics() Dim X1 As Integer = 20 Dim Y1 As Integer = 220 Dim X2 As Integer = 20 + 600 Dim Y2 As Integer = 220 formGraphics.DrawLine(myPon, X1, Y1, X2, Y2) myPon.Dispose() formGraphics.Dispose() Dim u As Graphics : u = Me.CreateGraphics Dim myPun As New System.Drawing.Pen(System.Drawing.Color.Black) formGraphics = Me.CreateGraphics() formGraphics.DrawLine(myPun, 20, 380, 20, 20) formGraphics.DrawLine(myPun, 20, 380, 620, 380) formGraphics.DrawLine(myPun, 120, 380, 120, 20) formGraphics.DrawLine(myPun, 220, 380, 220, 20) formGraphics.DrawLine(myPun, 320, 380, 320, 20) formGraphics.DrawLine(myPun, 420, 380, 420, 20) formGraphics.DrawLine(myPun, 520, 380, 520, 20) formGraphics.DrawLine(myPun, 620, 380, 620, 20) formGraphics.DrawLine(myPun, 20, 320, 620, 320) formGraphics.DrawLine(myPun, 20, 260, 620, 260) formGraphics.DrawLine(myPun, 20, 200, 620, 200) formGraphics.DrawLine(myPun, 20, 140, 620, 140) formGraphics.DrawLine(myPun, 20, 80, 620, 80) formGraphics.DrawLine(myPun, 20, 20, 620, 20) formGraphics.DrawString("0", aFont, Brushes.Red, 10, 385) formGraphics.DrawString("m(板長)", aFont, Brushes.Red, 620, 385) formGraphics.DrawString(CStr(CInt(SLI)), aFont, Brushes.Red, 600, 385) myPun.Dispose() formGraphics.Dispose() NCO = CInt(InputBox("別の均等分割数NCOは?<例:5>", "板長さ算出", CStr(NCO), 300, 550)) SLO = WT * 10 ^ 9 / 7850 / THIN / W / NCO MsgBox("別の分割後の板長さSLOは" & CInt(SLO) & "mです。") ClearColor(e) Dim g As Graphics : g = Me.CreateGraphics Dim myPgn As New System.Drawing.Pen(System.Drawing.Color.Fuchsia) formGraphics = Me.CreateGraphics() Dim X3 As Integer = 20 Dim Y3 As Integer = 220 Dim X4 As Integer = 20 + 600 Dim Y4 As Integer = 220 formGraphics.DrawLine(myPgn, X3, Y3, X4, Y4) myPgn.Dispose() formGraphics.Dispose() Dim q As Graphics : q = Me.CreateGraphics Dim myPqn As New System.Drawing.Pen(System.Drawing.Color.Black) formGraphics = Me.CreateGraphics() formGraphics.DrawLine(myPqn, 20, 380, 20, 20) formGraphics.DrawLine(myPqn, 20, 380, 620, 380) formGraphics.DrawLine(myPqn, 120, 380, 120, 20) formGraphics.DrawLine(myPqn, 220, 380, 220, 20) formGraphics.DrawLine(myPqn, 320, 380, 320, 20) formGraphics.DrawLine(myPqn, 420, 380, 420, 20) formGraphics.DrawLine(myPqn, 520, 380, 520, 20) formGraphics.DrawLine(myPqn, 620, 380, 620, 20) formGraphics.DrawLine(myPqn, 20, 320, 620, 320) formGraphics.DrawLine(myPqn, 20, 260, 620, 260) formGraphics.DrawLine(myPqn, 20, 200, 620, 200) formGraphics.DrawLine(myPqn, 20, 140, 620, 140) formGraphics.DrawLine(myPqn, 20, 80, 620, 80) formGraphics.DrawLine(myPqn, 20, 20, 620, 20) formGraphics.DrawString("0", aFont, Brushes.Red, 10, 385) formGraphics.DrawString("m(板長)", aFont, Brushes.Red, 620, 385) formGraphics.DrawString(CStr(CInt(SLO)), aFont, Brushes.Red, 600, 385) myPqn.Dispose() formGraphics.Dispose() End Sub Public Sub ClearColor(ByVal e As PaintEventArgs) e.Graphics.Clear(Color.Silver) End Sub End Class
- 回答の候補に設定 foohogehoge 2010年5月18日 2:01
- 回答の候補の設定解除 山本春海 2010年5月18日 2:11
-
長いコードなので最後までは読んでいませんが、Paint イベントのところで InputBox や MessageBox の類は使わないでください。
きつい言い方になりますが、Windows のプログラムとしてやってはいけないことをしていることになります。
(Vista で改善された部分かもしれませんが、XP までの Windows では NG となる行為です)Paint イベントは画面に描画してほしいときに呼び出されますが、InputBox で待っている間にも再度描画要求がきたりします。
従って、Paint イベントで Form を表示したり、InputBox や MessageBox を表示したりするようなコードを書いてはいけません。
描画するためのパラメータは Paint イベント以外で集めてください。次に、Paint イベントでは CreateGraphics を使わず、e.Graphics を使ってください。
Paint イベントを使ったサンプルを探して確認してみてください。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク tyokogawa 2010年5月20日 3:28