tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルフォームのResizeイベントについて
記事No3069
投稿日: 2006/02/08(Wed) 16:37
投稿者しょうだい
[OSのVer]:Windows2000    [VBのVer]:VB.NET 2003
[経験] VB6.0 : 約3年  VB.NET : 約1ヶ月

スタートアップを標準モジュールの "Sub Main" として、その中で以下のように
Form1を表示させています。
(Form1にはMainMenuコンポーネントを配置しています。)

Public Sub Main()
    Dim frm As Form1
    frm = New Form1
    System.Windows.Forms.Application.Run(frm)
End Sub

この時、"frm = New Form1" でのフォームの初期化(InitializeComponent)で
Resizeイベントが発生することがあるとヘルプに記載されていたので、初期化
時はResizeイベントの処理は行わないように対処したのですが、その後のRun
メソッドでフォームのLoadイベントの前に再びResizeイベントが発生してしま
います。
いろいろ調べてみるとMainMenuコンポーネントを配置することによってResize
イベントが発生しているようです。
フラグ変数等を使ってLoadイベントが終わるまではResizeイベントの処理は
行わないようにすることで対応していますが、どうもすっきりしません。
MainMenuコンポーネントを配置すると初期化以外でもResizeイベントが発生
してしまうのでしょうか?

宜しくお願い致します。

[ツリー表示へ]
タイトルRe: フォームのResizeイベントについて
記事No3075
投稿日: 2006/02/09(Thu) 10:48
投稿者ひろ
便乗で質問させてください。

TextBoxのChangeイベント等も、Load処理の中でTextBoxを初期化したりすると実行されちゃいますよね

対処方法が分からないので、

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
    AddHandler Me.Resize, AddressOf S_Resize
End Sub

Private Sub S_Resize(ByVal sender As Object, ByVal e As System.EventArgs)
    'なんかしらの処理
End Sub

みたいな感じで、ごまかしていたのですが。
どんな方法を取るのがベストなんでしょう?

[ツリー表示へ]
タイトルRe^2: フォームのResizeイベントについて
記事No3077
投稿日: 2006/02/09(Thu) 12:41
投稿者花ちゃん
試してはいないのでゴミレスかも知れませんが、SuspendLayout メソッド は
使えないでしょうか?

又、Resizeイベントが発生すると何かまずい事があるのでしょうか?
それによっては別の対処方法があるかも。

[ツリー表示へ]
タイトルRe^3: フォームのResizeイベントについて
記事No3080
投稿日: 2006/02/09(Thu) 21:02
投稿者しょうだい

花ちゃん、アドバイスありがとうございます。

> 試してはいないのでゴミレスかも知れませんが、SuspendLayout メソッド は
> 使えないでしょうか?

SuspendLayout メソッドでもうまくいかないようです。
使い方が間違っているのかもしれませんが。ちなみに以下のようにしてみました。

Public Sub Main()
    Dim frm As Form1
    frm = New Form1
    frm.SuspendLayout()
    System.Windows.Forms.Application.Run(frm)  ← ここで Load イベントの前に
End Sub                                           Reseize イベントが発生してしまう。

> 又、Resizeイベントが発生すると何かまずい事があるのでしょうか?
> それによっては別の対処方法があるかも。

フォームの Load イベントの中で PictureBox などのコントロールの初期設定
をしていて、フォームの Resize イベントの中で PictureBox の再描画などを
しています。その為、Load イベントの前に Resize イベントが発生すると、
コントロールが初期設定されていないので、おかしくなってしまうのです。
それで、現在は、単純な方法なのですが、グローバルのフラグ変数を使って、
上記ソースの Sub Main() の最初に ON にして、フォームの load イベント
の最後で OFF にし、Resize イベントの最初でそのフラグを見て処理するか
しないかの判断をしています。
とりあえずは現状で支障はないのですが、どうもすっきりせず、自分自身納得
がいかなかったので、何かわかればと投稿させて頂きました。

[ツリー表示へ]
タイトルRe^4: フォームのResizeイベントについて
記事No3082
投稿日: 2006/02/09(Thu) 23:23
投稿者花ちゃん
下記のようにして見ては。

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

    '初期設定等の処理を記述
    '(この間は、コントロールのレイアウトの変更を通知するイベントを抑止する)


    ResumeLayout()
End Sub

[ツリー表示へ]
タイトルRe^5: フォームのResizeイベントについて
記事No3103
投稿日: 2006/02/13(Mon) 11:21
投稿者しょうだい
花ちゃん、ありがとうございます。返信遅くなりすみません。

> 下記のようにして見ては。
> Private Sub Form1_Load(ByVal sender As System.Object, _
>                        ByVal e As System.EventArgs) Handles MyBase.Load
>     SuspendLayout()
>     '初期設定等の処理を記述
>     '(この間は、コントロールのレイアウトの変更を通知するイベントを抑止する)
>     ResumeLayout()
> End Sub

上記のLoadイベントが実行される前にResizeイベントが先に実行されてしまうのです。
少々長くなりすみませんが、再現用のテストコードを掲載させて頂きます。
(新規プロジェクトでフォームとモジュールを追加し、フォームにMainMenuコンポー
 ネントを配置するだけです。コメント行は現状の対応策です。)

Module Module1
'   Public flagInit As Boolean
    Public Sub Main()
        Dim frm As Form1
'       flagInit = True
        frm = New Form1
        System.Windows.Forms.Application.Run(frm) '←(問題点)この行の実行時にLoadイベント
    End Sub                                       '  の前にResizeイベントが実行される。
End Module

Public Class Form1
    Inherits System.Windows.Forms.Form
    Public Sub New()
        MyBase.New()
        InitializeComponent()
    End Sub
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    ' --- (省略)
    End Sub
    Private components As System.ComponentModel.IContainer
    Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.MainMenu1 = New System.Windows.Forms.MainMenu
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
        Me.ClientSize = New System.Drawing.Size(292, 273)
        Me.Menu = Me.MainMenu1                            '←ここでもResize発生(参考)
        Me.Name = "Form1"
        Me.Text = "Form1"
    End Sub
    Private Sub Form1_Resize(ByVal sender As Object, _
                             ByVal e As System.EventArgs) Handles MyBase.Resize
'       If flagInit = True Then
'           Exit Sub
'       End If
        Me.Text = Me.Text & "-Resize"
    End Sub
    Private Sub Form1_Load(ByVal sender As Object, _
                           ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = Me.Text & "-Load"
        '実際にはここで各コントロールの初期設定等を実施。
'       flagInit = False
    End Sub
End Class

上記のコードで、それぞれのモジュールの先頭にブレークポイントを設定してステップ実行
すると、"System.Windows.Forms.Application.Run(frm)"の実行時にResizeイベントが
実行され、そのあとでLoadイベントが実行されます。
しかし、不思議なことに"Me.Text"の内容は、"Form1-Load"となります。
"Private Sub InitializeComponent()"の"<System.Diagnostics.DebuggerStepThrough()>"
をコメントにしてステップ実行してみて判ったのですが、"Me.Menu = Me.MainMenu1"でも
Resizeイベントが発生しますね。
それで、現状は、上記のコメント行のようにフラグ変数で対応しています。

以上、長くなってすみませんでした。宜しくお願い致します。

[ツリー表示へ]