tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルアプリケーションの起動について
記事No8033
投稿日: 2008/08/28(Thu) 11:05
投稿者じゅん
Shell関数を使用し、アプリケーション(各画面)を表示しているのですが、以下のおかしな(?)動作をしてしまいます。
1.画面Aから、画面BをShell関数を使用し、起動
2.画面Bで、Accessを使用(Sell関数を使用し呼び出しています。)し、印刷を行う。
3.印刷終了後に、画面Aが一番手前に表示されてしまう。

※3がおかしな動作をする所です。
※3で画面Aが一番手前に表示されるのを防ぐため、2でAccessを呼び出し直前に「Me.TopMos=True」にし印刷終了後に「Me.TopMos=False」にしています。これだと、画面Bは一番手前に表示されるが、フォーカスは画面Bにあります。

印刷後、画面Aが一番手前に来るの防ぎ、尚且つ、画面Bにフォーカスが移るような手段はないものでしょうか??(印刷前とフォーカス等を同じ状態にしておきたい)
Access起動をSell関数を使用しているがまちがっている??

『環境』
OS:Vista
VB.NETバージョン:2005


以上、解決方法等があれば、教えてもらえればと思います。
宜しくお願いします。

[ツリー表示へ]
タイトルRe: アプリケーションの起動について
記事No8034
投稿日: 2008/08/29(Fri) 07:39
投稿者y4yama
> ※3で画面Aが一番手前に表示されるのを防ぐため、2でAccessを呼び出し直前に「Me.TopMos=True」にし印刷終了後に「Me.TopMos=False」にしています。
> これだと、画面Bは一番手前に表示されるが、フォーカスは画面Bにあります。
>
> 印刷後、画面Aが一番手前に来るの防ぎ、尚且つ、画面Bにフォーカスが移るような手段はないものでしょうか??(印刷前とフォーカス等を同じ状態にしておきたい)

「画面Bは一番手前に表示されるが、フォーカスは画面Bにあります」と言われていますが、
それなら、何が問題なのですか??
「画面」とは、Formのことですか。
Me.Focus は、試してみましたか。

[ツリー表示へ]
タイトルRe^2: アプリケーションの起動について
記事No8035
投稿日: 2008/08/29(Fri) 09:30
投稿者じゅん
ご返答ありがとうございます。
すみません文章が間違っておりました。
誤:「画面Bは一番手前に表示されるが、フォーカスは画面Bにあります」
正:「画面Bは一番手前に表示されるが、フォーカスは画面Aにあります」

> 「画面」とは、Formのことですか。
はい、そうです。
Formですが、画面Aと画面Bはプロジェクトは別のため、Shell関数を使用し、画面Bのexeを起動するようにしています。

> Me.Focus は、試してみましたか。
もちろんためしました。
画面Aにフォーカスがあるが、画面Bをクリックすると、画面Bの項目Aへフォーカスが移っています。
※印刷処理後には、画面Bの項目Aへフォーカスを移す処理は行っている。

後に、上記の方法を使っても、印刷プレビュー画面が立ち上がって数秒たつと、上記の効果が現れず、画面Aが一番手前にきてしまいます。

VB.NETだからか分かりませんが、画面Aから画面BをShell関数を使用し、立ち上げる。そうすると、画面Bが一番手前にくる。そこで、デスクトップ画面下(ツールバー)に最小化されていた、フォルダやファイルを開き、閉じると、なぜか画面Aが一番手前にきてしまいます。このような現象は、VB.NETの仕様みたいなものなのでしょうか??
※Form等の設定は一切変更はしていません。

[ツリー表示へ]
タイトルRe^3: アプリケーションの起動について
記事No8040
投稿日: 2008/09/01(Mon) 10:08
投稿者花ちゃん
Shell関数 での起動は、どのように設定しておられるのでしょうか?
(第二引数等)
できれば、他の人が事象を再現できるようなコードを投稿して下さい。

[ツリー表示へ]
タイトルRe^4: アプリケーションの起動について
記事No8041
投稿日: 2008/09/01(Mon) 11:34
投稿者じゅん
> Shell関数 での起動は、どのように設定しておられるのでしょうか?
> (第二引数等)
> できれば、他の人が事象を再現できるようなコードを投稿して下さい。

返答ありがとうございます。
以下がコードです。

●画面Aから画面Bの起動コード
Shell(Trim(wstrAppName), vbNormalFocus, False)

※wstrAppName には、画面BのEXEまでのパスがきます。

●画面Bからの印刷参照のコード
Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト画面", vbMaximizedFocus, True)

Me.TopMost = True
Me.TopMost = False

MsgBox("表示処理が終了しました。", vbInformation)

※参照画面(Access)が立ち上がり、閉じると、画面Aが一番手前にきてします。
尚、参照画面が完全に表示されると、デスクトップの下(ツールバー)にある、画面Bが消えてしまいます。Vistaでコンパイルしたら消えるが、XPでコンパイルすると、消えない現象も起きています。

●画面Bからの印刷コード
Me.TopMost = True
Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト", , True)
Me.TopMost = False

MsgBox("印刷処理が終了しました。", MsgBoxStyle.MsgBoxSetForeground)

※印刷時は Me.TopMost = True と Me.TopMost = Fase を指定すると、
画面Bは一番手前にきます。無いと、画面Aが一番手前にきます。
尚、Msgboxの引数をMsgBoxStyle.MsgBoxSetForeground ではなく、vbInformation にすると、画面Bは一番手前にくるが、メッセージが表示され、Enterキーを押下すると、画面AでEnterキーが押された事なり。画面Bを立ち上げようとしてしましいます。



以上がコードです。よろしくお願いします。

[ツリー表示へ]
タイトルRe^5: アプリケーションの起動について
記事No8042
投稿日: 2008/09/01(Mon) 12:52
投稿者花ちゃん
> Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト", , True)
> Me.TopMost = False
>
> MsgBox("印刷処理が終了しました。", MsgBoxStyle.MsgBoxSetForeground)
>

MessageBox に DefaultButton を設定して

その後で
Me.TopMost = False
にして見たらどうなりますか?
(印刷直後の Me.TopMost = False は削除しておく)

事象を再現できるコードを投稿して頂くと試す事ができるのですが。

[ツリー表示へ]
タイトルRe^6: アプリケーションの起動について
記事No8043
投稿日: 2008/09/01(Mon) 13:15
投稿者じゅん
> 事象を再現できるコードを投稿して頂くと試す事ができるのですが。

画面Bでのコードを
===================================================================================

Private Sub btn印刷_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     Call Sub_印刷処理()
End Sub

Private Sub btn参照_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
     Call Sub_参照処理()
End Sub

Private Sub Sub_参照処理()

        Try
            If Func_チェック() <> 0 Then
                Exit Sub
            End If

            If MsgBox("地域マスタリストを表示しますか?", vbYesNo + vbQuestion + MsgBoxStyle.DefaultButton2) = vbNo Then
                Exit Sub
            End If

            If Func_印刷処理(1) = 1 Then
                Exit Sub
            End If

            imnum処理状況.Text = "0"
            Me.Cursor = Cursors.Default    '戻す

            MsgBox("表示処理が終了しました。", vbInformation)

        Catch ex As Exception
            imnum処理状況.Text = "0"
            Me.Cursor = Cursors.Default

            MessageBox.Show("エラーが発生しました。:" + ex.Message)
        End Try

    End Sub

Private Sub Sub_印刷処理()

        Try
            If Func_チェック() <> 0 Then
                Exit Sub
            End If

            If MsgBox("地域マスタリストを印刷しますか?", vbYesNo + vbQuestion + MsgBoxStyle.DefaultButton2) = vbNo Then
                Exit Sub
            End If

            If Func_印刷処理(0) = 1 Then
                Exit Sub
            End If

            imnum処理状況.Text = "0"
            Me.Cursor = Cursors.Default    '戻す

            MsgBox("印刷処理が終了しました。", MsgBoxStyle.MsgBoxSetForeground)

        Catch ex As Exception
            imnum処理状況.Text = "0"
            Me.Cursor = Cursors.Default

            MessageBox.Show("エラーが発生しました。:" + ex.Message)
        End Try

    End Sub

Private Function Func_印刷処理(ByVal wintFLG As Integer) As Integer

        Dim wstrSQL As String
        Dim Tran As SqlClient.SqlTransaction
        Dim intTranFlg As Short
        Dim lngFreeFile As Integer
        Dim wstrPath As String

        '////トランザクション処理中フラグを設定(0:処理外)
        intTranFlg = 0
        Tran = Nothing

        Func_印刷処理 = 0

        wstrPath = ""

        If wintFLG = 2 Then
            With SaveFileDialog1
                .Filter = "File(*.csv)|*.csv|すべてのファイル(*.*)|*.*"
                .ShowDialog()
                wstrPath = .FileName()
            End With

            If wstrPath = "" Then
                imnum処理状況.Text = "0"
                Me.Cursor = Cursors.Default
                MsgBox("出力ファイル名を入力して下さい。", vbExclamation)
                Func_印刷処理 = 1
                Exit Function
            End If
        End If

        Me.Cursor = Cursors.WaitCursor  '変える
        imnum処理状況.Text = "1"

        Try
            sqlConn = New SqlConnection(objclass.gFunc_ConnectDB_DotNet())
            sqlCmd = sqlConn.CreateCommand()
            sqlConn.Open()

            sqlCmd = New SqlCommand("SP_地域マスタリスト", sqlConn)
            sqlCmd.CommandType = CommandType.StoredProcedure

            sqlCmd.Parameters.Add(New SqlParameter("@istrTerm", SqlDbType.VarChar, 50))
            sqlCmd.Parameters("@istrTerm").Value = istrTerm

            If Opt全範囲_地域.Checked = True Then
                sqlCmd.Parameters.Add(New SqlParameter("@iintArea", SqlDbType.TinyInt))
                sqlCmd.Parameters("@iintArea").Value = 0
            Else
                sqlCmd.Parameters.Add(New SqlParameter("@iintArea", SqlDbType.TinyInt))
                sqlCmd.Parameters("@iintArea").Value = 1
            End If

            sqlCmd.Parameters.Add(New SqlParameter("@iintAreaIdS", SqlDbType.SmallInt, 3))
            sqlCmd.Parameters("@iintAreaIdS").Value = CLng(imnum地域コード開始.Text)
            sqlCmd.Parameters.Add(New SqlParameter("@iintAreaIdE", SqlDbType.SmallInt, 3))
            sqlCmd.Parameters("@iintAreaIdE").Value = CLng(imnum地域コード終了.Text)

            sqlCmd.ExecuteNonQuery()

            If sqlConn Is Nothing Then
            Else
                sqlConn.Close()
            End If

            sqlConn = New SqlConnection(objclass.gFunc_ConnectDB_DotNet())
            sqlCmd = sqlConn.CreateCommand()
            sqlConn.Open()

            '印刷データ確認
            wstrSQL = ""
            wstrSQL = wstrSQL & "Select * "
            wstrSQL = wstrSQL & "From W_M_Area "
            wstrSQL = wstrSQL & "Where Term = '" & istrTerm & "' "

            sqlCmd.CommandText = wstrSQL
            sqlReader = sqlCmd.ExecuteReader()

            If sqlReader.Read() = False Then
                imnum処理状況.Text = "0"
                Me.Cursor = Cursors.Default
                If sqlReader Is Nothing Then
                Else
                    sqlReader.Close()
                End If
                If sqlConn Is Nothing Then
                Else
                    sqlConn.Close()
                End If
                Select Case wintFLG
                    Case 0
                        MsgBox("印刷するデータがありません。", vbExclamation)
                    Case 1
                        MsgBox("表示するデータがありません。", vbExclamation)
                    Case 2
                        MsgBox("出力するデータがありません。", vbExclamation)
                End Select
                Func_印刷処理 = 1
                Exit Function
            End If

            If sqlReader Is Nothing Then
            Else
                sqlReader.Close()
            End If
            If sqlConn Is Nothing Then
            Else
                sqlConn.Close()
            End If

            Select Case wintFLG
                Case 0
                    ''///// リスト印刷
                    Me.TopMost = True
                    Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト", , True)
                    Me.TopMost = False

                Case 1
                    ''///// リスト参照
                    Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト画面", vbMaximizedFocus, True)
                    Me.TopMost = True
                    Me.TopMost = False

                Case 2
                    'CSV出力
                    sqlConn = New SqlConnection(objclass.gFunc_ConnectDB_DotNet)
                    sqlCmd = sqlConn.CreateCommand()
                    sqlConn.Open()

                    lngFreeFile = FreeFile()
                    FileOpen(lngFreeFile, wstrPath, OpenMode.Output)


                    ''///// リスト出力
                    WriteLine(lngFreeFile, "地域ID", "地域名")

                    wstrSQL = ""
                    wstrSQL = wstrSQL & "SELECT * "
                    wstrSQL = wstrSQL & "FROM W_M_Area "
                    wstrSQL = wstrSQL & "WHERE Term = '" & istrTerm & "' "
                    wstrSQL = wstrSQL & "Order by AreaId "

                    sqlCmd.CommandText = wstrSQL
                    sqlReader = sqlCmd.ExecuteReader()

                    While sqlReader.Read
                        WriteLine(lngFreeFile, sqlReader("AreaId"), sqlReader("AreaName"))
                    End While

                    If sqlReader Is Nothing Then
                    Else
                        sqlReader.Close()
                    End If
                    If sqlConn Is Nothing Then
                    Else
                        sqlConn.Close()
                    End If

                    FileClose(lngFreeFile)
            End Select

        Catch ex As Exception
            MessageBox.Show("エラーが発生しました。:" + ex.Message)

            '////トランザクション処理中の場合
            If intTranFlg = 1 Then
                Tran.Rollback()
            End If

            If sqlReader Is Nothing Then
            Else
                sqlReader.Close()
            End If
            If sqlConn Is Nothing Then
            Else
                sqlConn.Close()
            End If
            If sqlConn2 Is Nothing Then
            Else
                sqlConn2.Close()
            End If
        End Try

    End Function

[ツリー表示へ]
タイトルRe^6: アプリケーションの起動について
記事No8044
投稿日: 2008/09/01(Mon) 13:27
投稿者じゅん
> > Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト", , True)
> > Me.TopMost = False
> >
> > MsgBox("印刷処理が終了しました。", MsgBoxStyle.MsgBoxSetForeground)
> >
>
> MessageBox に DefaultButton を設定して
>
> その後で
>  Me.TopMost = False
> にして見たらどうなりますか?
> (印刷直後の Me.TopMost = False は削除しておく)

上記を試しましたが、メッセージボックスが表示されるが、そのままEnterキーを押下するとやはり、画面AでEnterキーを押下したことになりました(泣)
ちなみに、そのコード
Me.TopMost = True
Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト", , True)
                    
MsgBox("印刷処理が終了しました。", MsgBoxStyle.DefaultButton1)
Me.TopMost = False

[ツリー表示へ]
タイトルRe^7: アプリケーションの起動について
記事No8045
投稿日: 2008/09/01(Mon) 15:26
投稿者花ちゃん
> Me.TopMost = True
> Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト", , True)
>                    

この時点でフォーカスが A フォームに移っていませんか?

Me.Focus()  'でもう一度 B フォームにファーカスを移してから

> MsgBox("印刷処理が終了しました。", MsgBoxStyle.DefaultButton1)
> Me.TopMost = False

上記を実施し、それでも、MsgBox を表示した時点で A フォームにフォーカスが移って
いるのなら、B フォームを終了を待って、A フォームを表示するようにでもしてみては。

MsgBox は、MsgBoxStyle.MsgBoxSetForeground にしていたのでは。

[ツリー表示へ]
タイトルRe^8: アプリケーションの起動について
記事No8049
投稿日: 2008/09/01(Mon) 17:37
投稿者じゅん
> > Me.TopMost = True
> > Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト", , True)
> >                    
>
> この時点でフォーカスが A フォームに移っていませんか?
>
> Me.Focus()  'でもう一度 B フォームにファーカスを移してから
>
> > MsgBox("印刷処理が終了しました。", MsgBoxStyle.DefaultButton1)
> > Me.TopMost = False
>
> 上記を実施し、それでも、MsgBox を表示した時点で A フォームにフォーカスが移って
> いるのなら、B フォームを終了を待って、A フォームを表示するようにでもしてみては。
>
> MsgBox は、MsgBoxStyle.MsgBoxSetForeground にしていたのでは。

返答ありがとうございます。

Me.TopMost = True
Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト", , True)

Me.Focus()

MsgBox("印刷処理が終了しました。", MsgBoxStyle.DefaultButton1)
Me.TopMost = False

で実行してみたのですが、Bフォームは手前にきていますが、フォーカスはAフォームにあります(涙)。そこで、メッセージボックスの所を
MsgBox("印刷処理が終了しました。", MsgBoxStyle.MsgBoxSetForeground)
にしたら、Bフォームが手前に来た状態で、Enterキーを押下すると、メッセージボックスが閉じました。
MsgBox("印刷処理が終了しました。", MsgBoxStyle.MsgBoxSetForeground)にするとデメリットがあるのでしょうか??

[ツリー表示へ]
タイトルRe^9: アプリケーションの起動について
記事No8050
投稿日: 2008/09/01(Mon) 18:13
投稿者花ちゃん
並べて表示して、どの時点で、A のForm にフォーカスが移動するのか調べてみたら
どうですか?
又、B のフォームのどの部分を(印刷の部分等)をコメントにしたらどうなるのかとか
A のForm を最小化にしておいた場合はどうなるかと。

A のForm に Me.Focus() なんて書いていませんよね?
A フォームの起動方法を含む、コードが何も投稿されていないのでその辺が解りませんが。
(折角コードを投稿してもらっても、あれを試しても事象を再現できませんよね)

> MsgBox("印刷処理が終了しました。", MsgBoxStyle.MsgBoxSetForeground)にするとデメリットがあるのでしょうか??

特に問題はないと思いますが、.NET ならMessageBox クラスを使った方がいいかも。

[ツリー表示へ]
タイトルRe^10: アプリケーションの起動について
記事No8053
投稿日: 2008/09/02(Tue) 09:44
投稿者じゅん
おはようございます。ご返事ありがとうございます。

> A のForm を最小化にしておいた場合はどうなるかと。
これについてですが、印刷参照(プレビュー)については、Shellの前に、Bフォームを最小化し、Sell後にBフォームを元のサイズに戻し、TopMost=True  TopMost=False とすると、Bフォームが手前にくるようになります。もちろん、メッセージボックスが表示され、Enterキーを押下すると、メッセージボックスのOKボタンを押下したことになる。

Me.WindowState = FormWindowState.Minimized
Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト画面", vbMaximizedFocus, True)
Me.WindowState = FormWindowState.Normal
Me.TopMost = True
Me.TopMost = False

※印刷参照時は、Bフォームは最小化になっててもいいのですが(格好が)、印刷時には、最小化はしたくはないですね・・・(見た目がわるので(笑))

※OSがXPで印刷参照時の以下のコードでコンパイル(ビルド)すると、うまくいきます。
サイズの変更はしなくてもいける。

Shell(objclass.gFunc_ReadAccPath & " " & objclass.GetAppPath & basCommon.basCommon.gcMASTERREP & " " & " /x M_地域マスタリスト画面", vbMaximizedFocus, True)
Me.TopMost = True
Me.TopMost = False

OSがVistaの時の不具合でもあるのだろうか・・・。それとも動作が不安定??

> A のForm に Me.Focus() なんて書いていませんよね?
もちろんやっていません(笑)


VB6.0の時はTopMos(あったか忘れましたが・・)なんて使用しなくてもいけたのに・・・

[ツリー表示へ]
タイトルRe^6: アプリケーションの起動について
記事No8111
投稿日: 2008/09/09(Tue) 11:05
投稿者じゅん
お礼のご返事が遅くなりましてすみませんでした。
解決策がみつかりました(笑)。
【解決策】
フォームのプロパティ「FormBorderStyl」が「FixedToolWindow」になっていたのを、「FixedSingle」に設定したら、解決しました。尚、TopMost等の処理は一切しなくてもOKでした。本当にお騒がせしました。

ご回答等本当にありがとうございました。

[ツリー表示へ]