初めて質問させていただきます。
至らないところがあればご指摘ください。。
** 開発環境:VisualStudio.Net Professional 2003 **
現在、VB4からVB.Netへのコンバージョン作業中に以下のような問題が発生しています。
①Form表示時(Show)のイベントが、VB4ではLOAD→ACTIVATEで発生していたのですが、VB.NETではその発生順が不確定になってしまいます。VB4での発生順と同様の処理を行うことは可能でしょうか??
②ACTIVATEの中でメッセージボックス(MsgBox)をコーディングすると、メッセージボックスがループに陥ってしまう。
ヘルプでも、LOAD/ACTIVATEのタイミングの変更については記述がありますが、それだけでは情報が足りず困っています。
これは仕様で仕方がないのでしょうか?
何か回避策などありましたらご教授ください。
順序が違うというより、Activate()のタイミングが厳格になったと言った方が正しいでしょう。
MessageBoxを閉じた時にも、Activate()は発生しますから。
java.lang.Nullpo さん、早速のご返答ありがとうございました。。
①に関してなのですが、
Activate()のタイミングが厳格になった・・とのことですが、
今テストしている段階では、LOAD→ACTIVATEの発生順と、ACTIVATE→LOADの発生順がモジュールによって混在しています。この要因は何なのでしょうか・・?
②> MessageBoxを閉じた時にも、Activate()は発生しますから。
だとすれば、そもそもの設計から見直さないといけないことになりますね・・。
LOADとACTIVATEのタイミングにかなり頼っている設計で困り果てています。
ネット等で調べても同内容について言及されているものがほとんど見当たらないのですが、コンバージョンしている方はどう対処されているんでしょうか・・?
> ACTIVATE→LOADの発生順がモジュールによって混在しています。
これは、私としては考えられません。
Dim hForm1 As New Form1()
hForm1.Show()
とすれば、Load() → Activated()と必然的になります。
イベントハンドラは正しく紐づいてますか?
Handles MyBase.Load
Handles MyBase.Activated
> そもそもの設計から見直さないといけないことになりますね
フラグを設けるか、Show()またはShowDialog()をインターセプトすれば、その必要はないでしょう。
そもそも、Activated()のイベントは使いどころがわからないのでなんとも。
「表示される度に何かをやる」なんて業務は、私には今までないですから。
「最初に表示された時に何かをやる」なんてのはよくやりますけども。
こんにちは。
java.lang.Nullpoさん、またまたご返信ありがとうございました。
色々調べましたところ、どうもLOAD⇔ACTIVATEのタイミングのおかしさは下記の要因で起きているようです・・。
***** サンプルソース ***********************************************
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows フォーム デザイナで生成されたコード "
Public Sub New()
MyBase.New()
' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後に初期化を追加します。
End Sub
' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer
' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
'Windows フォーム デザイナを使って変更してください。
' コード エディタを使って変更しないでください。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
Me.ClientSize = New System.Drawing.Size(288, 181)
Me.Name = "Form1"
Me.Text = "Form1"
Me.WindowState = System.Windows.Forms.FormWindowState.Maximized
End Sub
#End Region
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated
End Sub
End Class
***********************以上サンプル終わり****************************
上記で
Me.WindowState = System.Windows.Forms.FormWindowState.Maximized
とありますが、WindowStateがMaximized指定されている時、ACTIVATE→LOADの発生順になっています。
この指定をNormalにすると、通常のLOAD→ACTIVATEになるのですが・・。
うーん、原因はわかりましたが、何故こうなるんでしょう?
> WindowStateがMaximized指定されている時、ACTIVATE→LOADの発生順になっています。
> この指定をNormalにすると、通常のLOAD→ACTIVATEになるのですが・・。
ああ、そういうことでしたか。
いきなり Maximized にするようなことをしなければ、大丈夫でしょう。
Load イベント以降で Maximized にするようにしてください。
> うーん、原因はわかりましたが、何故こうなるんでしょう?
ちなみに、TopMost = Trueなどを初期設定してもそうなります。
言語仕様的には、こういうものだと言うしかないでしょう。
> ちなみに、TopMost = Trueなどを初期設定してもそうなります。
> 言語仕様的には、こういうものだと言うしかないでしょう。
なるほど・・(TдT)
周囲に詳しい人もおらず困っているところ、助言いただき本当に助かりました!
VB4も.NETも初心者ですが、なんとかがんばってみます。
java.lang.Nullpoさんありがとうございました。。