• ベストアンサー

VB6.0のHideのバグ?

いつもお世話になっております。 以下の疑問点が出ています。 どなたか答えをご存知の方がおりましたらご回答願います。 [現象] Form1からForm2を呼び出し、Form1をhideしても Form1が隠れない。 [条件] Form1のボタンをクリック後、すぐに何でもいい(フォルダを開いたウィンドウとか)のでウィンドウを最前面に表示してください。 [プログラム] --form1-- Private Sub Command1_Click() On Error GoTo ERROR_END Screen.MousePointer = vbHourglass '請求書作成画面に移行 Form2.Show Screen.MousePointer = vbDefault Exit Sub ERROR_END: Screen.MousePointer = vbDefault MsgBox Error(Err) End Sub Private Sub Form_Load() Me.Show Screen.MousePointer = vbDefault End Sub --form2-- Private Sub Form_Load() Dim i, strsql For i = 0 To 50000000 strsql = "時間稼ぎ" Next Me.Show Form1.Hide Screen.MousePointer = vbDefault End Sub [Form] Form1にコマンドボタンを一つ配置するだけでOKです。 [環境] WinXP SP1 VB6.0 SP6 [その他] WIN98ではこの事象は起こらないと報告受けてます。 バグならばバグと、PGミスならミスと明確に答えていただけると大変助かります。 どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • project-a
  • ベストアンサー率54% (107/195)
回答No.1

VB6.0(SP5)でやってみましたが、いちおう動作しています。ただし・・・ For i = 0 To 50000000 strsql = "時間稼ぎ" Next で1分以上かかります。DoEvents が入っていないので、その間操作が出来ません。 Form1 を非表示にするには、Form1でForm2を表示した後に行っても良いと思います。(Form2でForm1を閉じません) 請求書作成画面に移行 Form2.Show Screen.MousePointer = vbDefault Form1.Hide Exit Sub

masaichi1212
質問者

お礼

ご回答ありがとうございます。 >For i = 0 To 50000000 については根拠のある数値ではありません。 ただ、表示するまでに時間をかけたいから空回ししているだけなので。。。 >その間操作が出来ません については、画面下にあるバーから開いている フォルダを表示していただくだけなので、今の段階では問題ないと考えています。 参考に示していただいたプログラムなのですが、 実際はそのように作成して、この現象が起こってしまったので、分かりやすくするために上記のように展開して掲載させて頂きました。

その他の回答 (1)

  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.2

Win2k/6.0Sp5ですが、全く問題ないです(^^; 一応コンパイルしてexeでも試しましたが・・・ 気になることがいくつかあったので。 1.LoadイベントにMe.Showは不要 FormをShowすることでLoadをしているので、不要だと思います。 2.#1さんがおっしゃっている通り、隠すタイミングがForm2の表示直後なのであれば、Form1側でMe.Hideとすべきです。 Form1.Hideとするとややこしくなるので止めたほうが良いですね。もし、Form1がロードされていない(いてはいけない)状況では、このメソッドでインスタンスが作成されてしまいますから。 コードを見る限り「Formの暗黙のインスタンス」についてよく理解されていないように思います。

関連するQ&A

  • Hideについて(.NET)

    Form1をHideで非表示にし、Form2を開いた後、再びForm1を表示したいのですがうまくいきません。 [form1のイベント] Dim frmForm2 as New Form2 frmForm2.Show Me.hide Sub End [form2のイベント] Dim frmForm1 as New Form1 frmForm1.Show Me.Close Sub End としてあります。 非表示されたフォームを再表示されずに、新しくフォームが開いてしまっていると考えられるんですが、どうしたらよいでしょうか? 

  • 【VB6.0】 あるフォームから他のフォームへ値を受け渡したい

    タイトルの通り、あるフォームから他のフォームに値の受け渡しを行いたいのですが、どのようにしたらよいのでしょうか?? 以下のようなコードできんのかなぁ~~って、やったみだけど、 むりでした。。サンプルコード内でいうParamsのような値を 受け渡しさせたいのですが・・・。ご存知の方、申し訳ないですが 教えて頂けると非常にありがたいです。それと、、私はVB初心者です。 ---FormA--- Public Params as new Params Private sub Command1_Click() Call Me.Hide FormB.Show vbModeless, Me End sub ---FormB--- Private Sub Form_Load() 'Owner.Paramsのような形で参照できるかと思ったができませんでした。 End sub

  • VB6のform Load

    Private Sub Form_Load() Form1.ScaleMode = 0 Form1.Scale (-10, 10)-(10, -10) Form1.Line (-10, 0)-(10, 0) Form1.Line (0, -10)-(0, 10) End Sub とやって座標画面を作ろうとしましたが Lineが表示されません。 仕方が無いので Private Sub Form_Load() Form1.ScaleMode = 0 Form1.Scale (-10, 10)-(10, -10) End Sub Private Sub Form_Activate() Form1.Line (-10, 0)-(10, 0) Form1.Line (0, -10)-(0, 10) End Sub とやりました。 そういうものだとあきらめるしかないのでしょうか?

  • 文字の点滅

    すいません、VB.Net2003の初心者です。 いろいろ調べたのですが解らないので教えてください。 VB.Net2003 SQLServer2000という環境なんですが Form1に Private Sub Timer1_Tick(・・・ lblMessage.Visible = Not lblMessage.Visible End Sub Private Sub Form1_Load(・・・ Me.Timer1.Start() End Sub と書いて単独で開くとちゃんとメッセージは点滅するのですが、これに Private Sub From1_Activated(・・・ Dim Form2Form As New Form2 Application.DoEvents() Dim strSQL As String Dim intRemainder(4) As Integer Dim i As Integer For i = 1 To 3 strSQL = "SELECT COUNT(TelW) AS RemainderCount " strSQL &= "FROM dbo.ma_Customer " strSQL &= "WHERE (CallDayNo1 IS NULL) AND " strSQL &= "(CallNo" & i & " > 0)" Try cmd = New SqlCommand(strSQL, Cn) intRemainder(i - 1) = cmd.ExecuteScalar Catch ex As Exception Dim strMsg As String = Err.Number & ex.ToString MessageBox.Show(strMsg) End Try cmd = Nothing Next Me.Hide() With Form2Form .lblNo1.Text = intRemainder(0).ToString("#,##0") .lblNo2.Text = intRemainder(1).ToString("#,##0") .lblNo3.Text = intRemainder(2).ToString("#,##0") .ShowDialog() End With Me.Close() End Sub というコードを加えてループ処理を実行している間メッセージを点滅させたいのですが点滅しません。どう書いたら良いのでしょう?

  • vbaで帳票フォームで開きたい アクセス

    vbaでフォームを開くときに 既定のビューを指定してるのですが 指定したとおりになりません。 Private Sub Form_Load() Me.DefaultView = 1 '帳票フォーム End Sub としてもデータシートビューで開かれてしまいます。 Private Sub Form_Load() Me.DefaultView = 1 '帳票フォーム MsgBox Me.DefaultView End Sub とすると、1が返るのに やっぱりデータシートビューになってしまいます。 なぜでしょうか? エラーにもなりません。

  • VB.NETについての質問なんですが

    SubMainで「Form1」をshowで開き、その「Form1」の中で「Form2」をshowで開いた後、「Form1」だけをCloseで閉じたいのですが、「Form1」をで閉じてしまうとプログラムが終了してしまいます。 Public Class Form1 : :   Private Sub Button1_Click……   Dim frmForm2 as New Form2   frmForm2.Show   Me.Close Sub End End Class 良い方法があればアドバイスをお願いします

  • 複数のユーザーフォームをコマンドボタンにて表示・非表示させるには

    VBA勉強中のものです。 複数のユーザーフォームをコマンドボタンを使用して画面への表示切替を考えております。 例)ユーザーフォーム1,ユーザーフォーム2,ユーザーフォーム3のそれぞれにコマンドボタン1,コマンドボタン2,コマンドボタン3を作成し、   コマンドボタン1→ユーザーフォーム1を表示   コマンドボタン2→ユーザーフォーム2を表示   コマンドボタン3→ユーザーフォーム3を表示 とするようなことを考えおります。  そこで、下記のようにコードを作成したのでですが,一度表示させたユーザーフォームを再度表示させようとコマンドボタンをクリックしたら、「フォームはすでに表示させているのでモーダル表示はできません」とエラーがでてしまいます。   どなたか、どのようにしたらいいかご教授ねがいます。 サンプルコード) --------------------------------------------------- 'UserForm1のコード Private Sub CommandButton2_Click() Call UserForm2_show UserForm1.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm1.Hide End Sub ---------------------------------------------------- 'UserForm2のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm2.Hide End Sub Private Sub CommandButton3_Click() Call UserForm3_show UserForm2.Hide End Sub ------------------------------------------------------- 'UserForm3のコード Private Sub CommandButton1_Click() Call UserForm1_show UserForm3.Hide End Sub Private Sub CommandButton2_Click() Call UserForm2_show UserForm3.Hide End Sub ------------------------------------------------------------ '標準モジュール コード Sub UserForm1_show() UserForm1.Show End Sub Sub UserForm2_show() UserForm2.Show End Sub Sub UserForm3_show() UserForm3.Show End Sub

  • VB2012で質問

    VB2012ですが、電卓を起動している状態で、 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load AppActivate("電卓") End Sub というコードでForm1を実行してみると、どうしてもForm1がアクティブになってしまうのですが、電卓をアクティブにしたいので、どうすれば良いでしょうか? 環境)OS:Windows8     バージョン:VB2012                 …となっています。

  • クラス宣言かな?

    いろいろ調べてはみたのですが 答えにたどり着けなかったので質問させていただきます。 Testからテストに移り またTestにもどるというものです。 Class Test Private Sub Button1_Click(~省略~)  テスト.Show()  Me.Hide() End Sub End Class と Class テスト Private Sub Button2_Click(~省略~)   If ~省略~   Test.Show()   Me.Hide() ElseIf ~省略~   Test.Show()   Me.Hide() End If End Sub End Class があります。 このときの「Class テスト」の「Test.Show()」を Dim FF as Test FF.Show() みたいなかんじで一行の文を変えるだけで反映させたいのですが うまくいかず困ってます。 どうやってやればうまくいくのか教えてください。

  • VBで入力された値をワード文書に表示(OLEオートメーション)

    VBより名前と年齢を入力し、登録ボタンを押すと ワードにデータが登録されるようにしたいのですが、 実行時エラーが表示されます。 Dim x As Object Private Sub Command1_Click() x.Insert.Into Text1.Text & ":" & Text2.Text & Chr(10) ---(1) End Sub Private Sub Form_Load() Set x = CreateObject("Word.Basic") End Sub Private Sub Form_Unload(Cancel As Integer) Set x = Nothing End Sub (1)で 実行時エラー'509'「Insert,文書ウィンドウが選択されていないためコマンドは使用できません」 が表示されます。 考えられる原因はなにか教えてください! VB6.0/WindowsXP SP2/Office 2000 です

専門家に質問してみよう