VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 2004/05/10(Mon) 17:22
投稿者やまめ
URL
タイトルEnterによるフォーカスの移動

初めて投稿いたします。よろしくお願いします。

技術資料にある以下の方法で、Enterによるフォーカス移動を実現させようとしたところ、
以下のようなエラーが発生するのですが、原因が良く分かりません。
どなたかお分かりになれば、お教えください。

1.採用した手法
サポート技術情報にあった以下の方法に、
Form_KeyDownイベントにて、Enterキーを検出、setnextを呼び出すようにし、
マウスによるコントロールの選択を考慮し、
各コントロールのgotForcusにて、curCtrl変数の値を更新するようにしました。
複数のフォームにこの処置をしました。

'NumCtrlはEnterキーで移動したいコントロールの数
Const NumCtrl = 3
Dim Ctrl(NumCtrl - 1) As Control

Private Sub SetNext()    '次のコントロールへの移動ルーチン
    Static CurCtrl As Integer
    CurCtrl = CurCtrl + 1
    If CurCtrl = NumCtrl Then CurCtrl = 0
    Ctrl(CurCtrl).SetFocus
End Sub

Private Sub Form_Load()
    'あらかじめ移動したいコントロールを配列変数CtrlにSetしておきます
    '
    'ControlsコレクションとTabIndexプロパティを用いてループで記述する
    'ことも可能ですが、ソートが必要になるので、ここでは単純な方法を
    '用いています。
    Set Ctrl(0) = Text1(0)
    Set Ctrl(1) = Text1(1)
    Set Ctrl(2) = Combo1
End Sub

2.不具合1
フォームをload/UnLoad、再度loadすると、フォーム上のコントロールを参照しようとすると
「オブジェクトがない」との実行時エラー発生。
from_loadでブレイクし、コントロールの値を表示させながら、ステップ実行したところ、
    Set Ctrl(0) = Text1(0)
    Set Ctrl(1) = Text1(1)
    Set Ctrl(2) = Combo1
の実行にて、2度目のload時のみ、順にオブジェクトが消えていくことが確認できた。

3.不具合2
そこで、各フォームのunloadイベントに以下を追加。
Private Sub Form_unLoad()
    Set Ctrl(0) = nothing
    Set Ctrl(1) = nothing
    Set Ctrl(2) = nothing
End Sub

これにより、2項のエラー発生せず、繰り返しload/UnLoadが実施できるようになった。

が、ひとつのフォームのみ(もっとも使用しているコントロールの多いもの。といっても60個程度)、
    Set Ctrl(0) = Text1(0)
の実行前、from_loadすると同時にオブジェクトが消えてしまった。

4.結果
現状、3項のエラーの発生するフォームのみ、力ずく(各コントロールのkeydownイベント)で
フォーカスの移動を実現しています。
他のフォームもたまたま上手く動いているだけのような状態なので、心配です。

よろしくおねがいします。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -