Top / .NET備忘録 / 07.Form / 02.Unload ステートメント

Load があるなら Unload も必要です。

OnFormClosing/OnFormClosed を実行する internal な UnloadInternal メソッドを実装します。

これらも重複実行されないよう、フラグ管理します。

        private bool m_FormClosing = false;
        private bool m_FormClosed = false;
 
        internal void UnloadInternal()
        {
            FormClosingEventArgs closingEventArgs = new FormClosingEventArgs(CloseReason.None, false);
            this.OnFormClosing(closingEventArgs);
            if (closingEventArgs.Cancel) return;
            m_FormClosing = true;
 
            FormClosedEventArgs closeEventArgs = new FormClosedEventArgs(CloseReason.None);
            this.OnFormClosed(closeEventArgs);
            m_FormClosed = true;
 
            this.SetVisibleCore(false);
 
            if (this.IsHandleCreated) this.DestroyHandle(); 
        }
 
         protected override void OnFormClosing(FormClosingEventArgs e)
         {
             if (!m_FormClosing) base.OnFormClosing(e);
         }
 
         protected override void OnFormClosed(FormClosedEventArgs e)
         {
             if (!m_FormClosed) base.OnFormClosed(e);
         }
 
         protected override void SetVisibleCore(bool value)
         {
             base.SetVisibleCore(value);
             if (!value)
             {
                 m_Load = false;
                 m_CreateControl = false;
             }
             else
             {
                 m_FormClosing = false;
                 m_FormClosed = false;
             }
         }

CloseReason に何をセットするか迷いましたが、ぴったり当てはまるものがないので、None をセットすることにしました。

static なクラス Global に Load/Unload を実装して完了です。

 using System;
 
 namespace VB6Control
 {
     public static class Global
     {
         public static void Load(VBForm form)
         {
             form.LoadInternal();
         }
 
         public static void Unload(VBForm form)
         {
             form.UnloadInternal(); 
         }
     }
 }

VB では次のように使えます。

 Imports VB6Control
 Imports VB6Control.Global
 
 Module Program
 
     <STAThread()> _
     Sub Main()
         Application.EnableVisualStyles()
         Application.SetCompatibleTextRenderingDefault(False)
         Load(Form1)
         Form1.ShowDialog() ' もしくは Application.Run(Form1)
     End Sub
 
 End Module
 
 Class Form1
     Inherits VBForm
     WithEvents Button As VBCommandButton
 
     Sub New()
         Button = New VBCommandButton
         Button.Dock = DockStyle.Fill
         Button.Text = "Unload"
         Me.Controls.Add(Button)
     End Sub
 
     Private Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button.Click
         Unload(Me)
     End Sub
 
 End Class



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-03-18 (月) 04:14:12 (1681d)