VisualBasic6.0を使用している初心者です。
フォームをShowで開いた後、そのフォームのロード時にエラーが発生
したので、ロードのところにエラー回避を入れ、Unlaod Meを追加した
のですが、"既にアンロードされています"と、またエラーメッセージが
でます。ロード時にエラーが発生した場合、そのShowで開いたフォームを
閉じるにはどうしたら良いのでしょうか?どうかお教え下さい。
Private Sub Command1_Click()
Form1.Show
End Sub
(Form1)
Private Sub Form_Load()
On Error Goto ERROR1
C = 1 / 0
On Error GoTo 0
Exit Sub
ERROR1:
Unload Me
End Sub
アンロードされているというのなら、もうアンロードされてるんじゃないですか?
いや、試したわけじゃないし、最近VBにはご無沙汰なので、よくわかりませんけど。
Delphiという言語では、クラスのコンストラクタ(オブジェクトを生成するために呼び出すメソッド)でエラーが起こった場合、
自動的のそのオブジェクトは開放されます。
そんな感じで。
ほんとは、ちゃんとしたチェッカなり何なりで、調べないといけないのかもしれませんけどね。
基本的に、Showでフォームをロードするのはオススメ出来ません。
そもそもロード時にフォームを開くかどうかをチェックするのではなく
チェックしてからフォームを開くようにした方が良いです。
Private Sub Command1_Click()
Load Form1
End Sub
(Form1)
Private Sub Form_Load()
On Error Goto ERROR1
C = 1 / 0
On Error GoTo 0
Me.Show
Exit Sub
ERROR1:
Unload Me
End Sub
あー、チェックするの忘れてた。
今試したらダメだったんで、上の投稿は忘れてください(汗)
MSDNによると、
>そのフォーム自身の Form_Load プロシージャ内で
>Unload ステートメントでアンロードされるフォームが、
>暗黙のうちにロードされました。
>たとえば、Form2 がまだロードされていないときに
>Form2.BackColor = Form1.BackColor といったコードを記述すると
>フォームが暗黙のうちにロードされます。
>
>Form_Load プロシージャから Unload ステートメントを削除してください。
だそうです。
みなさん、ご返事ありがとうございます。
いろいろ試して、結局Form_Load プロシージャ内のソースを
Showの前に書き、エラー回避しとくのが一番いいみたいですね。
ただ、もうひとつお聞きしたいのですが、例えばForm1を現在開いているか
どうか、わかる方法ってないのでしょか?
これがわかれば、エラー回避後、IF構文が使えるのですが?
わがまま言って、すみません。`-`;
Formsコレクションを調べれば良いんじゃないかな?
Dim frm As Form
For Each frm In Forms
If frm.Name = "Form1" Then
'なんかの処理
End If
Next
たとえばこんなのでいいのかな?
Private Sub Command1_Click()
Form1.ShowOpen
End Sub
(Form1)
Private OpenFlag As Boolean
Private Sub Form_Load()
On Error GoTo ERROR1
Dim c As Integer
c = 1 / 0
On Error GoTo 0
OpenFlag = True
Exit Sub
ERROR1:
OpenFlag = False
End Sub
Public Function ShowOpen() As Boolean
Load Me
If OpenFlag Then
Me.Show
Else
Unload Me
End If
ShowOpen = OpenFlag
End Function
またもや、みなさんありがとうございました。
無事、解決しました。本当にお世話になりました。
ソースを下記の通りです。
Private Sub Command1_Click()
On Error Goto ERROR1
Form1.Show
On Error GoTo 0
Exit Sub
ERROR1:
MsgBox Err.Description, vbExclamation
End Sub
(Form1)
Private Sub Form_Load()
Dim c As Integer
Dim frm As Form
On Error Goto ERROR2
C = 1 / 0
On Error GoTo 0
Exit Sub
ERROR2:
For Each frm In Forms
If frm.Name = "Form1" Then
Unload Form1
End If
Next
End Sub
ツイート | ![]() |