- PR -

VB.NETのCLOSEメソッド

投稿者投稿内容
shipmaster
会議室デビュー日: 2002/11/20
投稿数: 7
投稿日時: 2003-05-02 20:49
VB.NETで開発しています。

FORMAからFORMBを起動します。
FORMBのFORM_LOADイベントでエラーが発生した場合FORMBを終了したいです。
FORMBのFORM_LOADイベントからFORMB.CLOSEを実行しても画面がCLOSEしません。

どのように記述すればFORMBのFORM_LOADに画面を終了できるのでしょうか?
おしえてください。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-05-03 15:20
こんにちわ。
MLの受け売りなんですが、FormB側の処理でのエラー発生時に例外をthrowさせてFormA側でキャッチして、Closeしてみてはいかがでしょうか。
VB.NETは不得意なので、C#なんですが(^^;

サブフォームの処理。
ここでは例外発生をそのままスローしていますが、自分でスローしてもいいと思います。
コード:
private void Form2_Load(object sender, System.EventArgs e)
{
    object obj = null;
    try
    {
        int I = (int)obj; //例外発生
        label1.Text = I.ToString();
    }
    catch(Exception ex)
    {
        MessageBox.Show("Form2 Error " + ex.Message);
        throw;
    }
}



メインフォーム側でApplication.ThreadExceptionイベントハンドラを捕捉するクラスを用意します。

コード:
public class FormLoadExcept{
    public void OnThreadException(object sender,
        System.Threading.ThreadExceptionEventArgs e) 
    {
        throw e.Exception;
    }
}



エントリポイントでイベントハンドラのセット

コード:
static void Main() 
{
    FormLoadExcept fle = new FormLoadExcept();
    Application.ThreadException +=
        new System.Threading.ThreadExceptionEventHandler( fle.OnThreadException);
    Application.Run(new Form1());
}




ボタンクリックでフォーム生成後にモーダル表示。
ここでは例外が発生してもしなくても最後にはフォームを閉じますが、
例外時だけの対応も可能だと思います。

コード:
private void button1_Click(object sender, System.EventArgs e)
{
    Form2 form2 = null;
    try
    {
        form2 = new Form2();
        if (form2.ShowDialog(this) == DialogResult.OK)
        {
            MessageBox.Show("OK");
        }
        else
        {
            MessageBox.Show("NO");
        }
    }
    finally
    {
        form2.Close();
    }
}



ではでは(^^)/
rucio
ベテラン
会議室デビュー日: 2002/11/27
投稿数: 98
投稿日時: 2003-05-03 17:46
こんにちは。

>FORMBのFORM_LOADイベントからFORMB.CLOSEを実行しても画面がCLOSEしません。
気になって試してみました。
私の環境では何事もなく無事にフォームを閉じることができます。
何かエラーが出るのですか?

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.Close()

End Sub



ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2003-05-03 19:00
rucioさん、こんにちは。

FORMAからFORMBを起動?する際にShowメソッドを使っていればFORMB_LOADでCloseできますが、ShowDialogメソッドの場合はCloseできません。

ShowDialogが戻り値のあるメソッドの為かどうか不明ですが(笑)、
何せLoad中には自分自身のCloseもDisposeもできません。

Disposeはできますが、えらいことに...
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2003-05-04 09:56
>shipmasterさん

エラーっていうのがExceptionレベルのものなのか、
それとも何らかの基準に照らし合わせてNGなのかによりますが、
後者の場合ならShowDialogの前にやってしまうのもありなのでは。

dim frmB as new classFormB
if frmB.手作り初期チェックメソッド = True Then
frmB.ShowDialog()
else
どうする?
end if
cafe
会議室デビュー日: 2003/05/06
投稿数: 16
投稿日時: 2003-05-06 14:04
すいません。shipmasterさんと同じような質問なんですが、(vb.netで開発)
ラフィンさんが言われるようにShowDialogを使用するとcloseができないんですが、
戻り値がある為どうしてもShowDialogメソッドを使用したいんですけど、
その場合って、ShowDialogの前に実行する以外に何か方法がありますでしょうか?
ありましたら教えていたたきたいんですけど、お願いします。

rucio
ベテラン
会議室デビュー日: 2002/11/27
投稿数: 98
投稿日時: 2003-05-06 21:53
>その場合って、ShowDialogの前に実行する以外に何か方法がありますでしょうか?
一瞬表示されてしまいますが
PaintイベントでCloseするというのは邪道でしょうか?

もっといい方法があるかもしれません。
NothingButXMLInfoSet
ベテラン
会議室デビュー日: 2003/03/31
投稿数: 65
投稿日時: 2003-05-07 09:49
何の解決にもならないかもしれませんが、この問題は.NET Framework 1.1では修正されています。参考:http://www.gotdotnet.com/team/changeinfo/Backwards1.0to1.1/default.aspx#00000006

スキルアップ/キャリアアップ(JOB@IT)