| | タイトル | : Re: フォーム呼び出しに関する質問 |  | 記事No | : 10442 |  | 投稿日 | : 2011/02/17(Thu) 14:39 |  | 投稿者 | : 魔界の仮面弁士 | 
 > 1.入力プログラムで「品名の一部」を入力> 2.問合せフォームで、該当品名の一覧を表示
 > 3.問合せフォームで品名を特定し、品目CDを決定
 > 4.入力プログラムに品目CDを渡す
 
 現在の処理イメージは、こんな感じでしょうか?
 
 '------- 入力プログラム側(EXE) --------
 Private WithEvents dlg As 問い合わせフォーム
 Private Sub dlg_適用通知イベント(…
 品目CDTextBox.Text = e.品目CD
 End Sub
 Private Sub DLL呼出ボタン_Click(…
 dlg = New 問い合わせフォーム()
 dlg.検索文字列 = 品名TextBox.Text
 If dlg.ShowDialog() <> DialogResult.Cancel Then
 品目CDTextBox.Text = dlg.Selected品目CD
 End If
 dlg.Dispose()
 dlg = Nothing
 End Sub
 
 
 '------- 問合せフォーム側(DLL) --------
 Public Event 品目決定通知イベント As EventHandler(Of 品目決定通知EventArgs)
 Public Sub 適用Button_Click(…
 Dim 品目CD As String = 何某
 Me.Selected品目CD = 品目CD
 Dim arg As New 品目決定通知EventArgs(品目CD)
 RaiseEvent 品目決定通知イベント(Me, arg)
 End Sub
 Public Sub OKButton_Click(…
 Dim 品目CD As String = 何某
 Me.Selected品目CD = 品目CD
 Me.DialogResult = DialogResult.OK
 Me.Close()
 End Sub
 Public Sub CancelButton_Click(…
 Me.DialogResult = DialogResult.Cancel
 Me.Close()
 End Sub
 
 
 > この問合せフォームのOPEN・CLOSEに非常に時間がかかり入力時間がかかってしまう。
 OPEN・CLOSE のタイミングで何が行われているか分かりませんが、
 Load イベントに負荷がかかっているのであれば、上記の DLL 呼出部を
 Private Sub DLL呼出ボタン_Click(…
 dlg.ShowDialog()
 End Sub
 だけにしてしまい、インスタンスを毎回生成しなおすのではなく、
 ひとつのインスタンスを使いまわすことで対処できるのかも知れません。
 
 また、初回起動時に表示を優先させたいような場合、
 ・Load イベントやコンストラクタでは、時間のかかる処理(データの検索等)を行わない。
 ・時間のかかる処理は、BackgroundWorker などで非同期処理させる。
 といった選択肢もあるかと思います。
 
 ただし、Load や Shown 等では何も行っておらず、単にフォームに貼ってある画面部品が
 多すぎて遅くなっているようなケースでは、画面構成を見直すほか無いでしょうけれども。
 
 |