tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルフォーム呼び出しに関する質問
記事No10441
投稿日: 2011/02/17(Thu) 14:06
投稿者はや
アプリ開発のヒントをいただければと思い、質問させていただきます。

目的:入力時間短縮に向けた改善

環境:VB.net 2005


データ入力プログラムがあり、品目CDを問い合わせる項目があります。
品目CD検索用のフォームはDLL化(VB2005で開発)しており、データ入力プログラムから、「ShowDialog」にて呼び出しています。
品目CDは、品名の一部を入力することで該当する品名をListVIEWで一覧表示し、マウスで選択することで品目CDを特定し呼び出し元のプログラムへCDを返します。


「ShowDialog」の為、コードを問い合わせる度に問合せフォームが開き、コードが見つかり選択された後、問合せフォームが閉じる動きをします。
この問合せフォームのOPEN・CLOSEに非常に時間がかかり入力時間がかかってしまう。


改善案として、問合せフォームを常駐(常に表示させておく)させて、入力プログラムと連携させたいと考えています。

理想的な連携
1.入力プログラムで「品名の一部」を入力
2.問合せフォームで、該当品名の一覧を表示
3.問合せフォームで品名を特定し、品目CDを決定
4.入力プログラムに品目CDを渡す


このような事を実現する為には、どのような方法で問合せフォームを呼び出せば良いか、アドバイスいただけませんでしょうか?


以上、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: フォーム呼び出しに関する質問
記事No10442
投稿日: 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 等では何も行っておらず、単にフォームに貼ってある画面部品が
多すぎて遅くなっているようなケースでは、画面構成を見直すほか無いでしょうけれども。

[ツリー表示へ]
タイトルRe^2: フォーム呼び出しに関する質問
記事No10443
投稿日: 2011/02/17(Thu) 15:21
投稿者はや
魔界の仮面弁士さん、早速のアドバイスありがとうございます。

イメージはだいたいあっていると思われます。

DLL側では、Formを呼び出す度にDB(オラクル)を接続する部分などがあり、たしかにLoadにて時間がかかっていると思われす。

アドバイスいただいたなかで、確認なのですが
>>Load イベントに負荷がかかっているのであれば、上記の DLL 呼出部を
>> Private Sub DLL呼出ボタン_Click(…
>>  dlg.ShowDialog()
>> End Sub
>>だけにしてしまい、・・・
の部分ですが、これは「Private Sub DLL呼出ボタン_Click」で毎回
dlg = New 問い合わせフォーム()
・・・
dlg.Dispose()
dlg = Nothing
を、行わず、入力画面のOPEN同時に「dlg = New 問い合わせフォーム()」を行い、CLOSEするまでDispose しないで置く。 ということでしょうか?

[ツリー表示へ]
タイトルRe: フォーム呼び出しに関する質問
記事No10444
投稿日: 2011/02/18(Fri) 23:06
投稿者shu
フォームのオープン、クローズについては魔界の仮面弁士さんが
提案されているので、データの持ち方についてですが、
頻繁にサーバへ品目を検索しにいくのではなくローカルPC上にDBの
複製を持つとか可能であればDataTable上にデータを持っておくとかするのも
1つの方法かと思います。マスタ内容が頻繁に変わるようだと同期が大変に
なるかもしれませんが、あまり変更にならなければ速度改善になるかと思います。

[ツリー表示へ]