投稿日 | : 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イベント)で
フォーカスの移動を実現しています。
他のフォームもたまたま上手く動いているだけのような状態なので、心配です。
よろしくおねがいします。