[リストへもどる]
一括表示

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

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

投稿時間:2004/05/10(Mon) 17:49
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: Enterによるフォーカスの移動
> 技術資料にある以下の方法で、Enterによるフォーカス移動を実現させようとしたところ、

コントロールが使用不可になると、フォーカスが自動的に次のコントロールに移動する事を利用して、
  On Error Resume Next
  ActiveControl.Enabled = False
  ActiveControl.Enabled = True
  On Error GoTo 0
などという方法もあります。


>     Set Ctrl(0) = Text1(0)
> の実行前、from_loadすると同時にオブジェクトが消えてしまった。
VBのメニューにある [表示]-[ウォッチ ウィンドウ]を使って見てください。
特定の変数の内容が変化した瞬間に一時停止させる機能がありますので、
何が原因となっているのかを突き止められる手助けになるかと思います。

投稿時間:2004/05/10(Mon) 23:04
投稿者名:やまめ
Eメール:
URL :
タイトル:
Re^2: Enterによるフォーカスの移動
> > 技術資料にある以下の方法で、Enterによるフォーカス移動を実現させようとしたところ、
>
> コントロールが使用不可になると、フォーカスが自動的に次のコントロールに移動する事を利用して、
>   On Error Resume Next
>   ActiveControl.Enabled = False
>   ActiveControl.Enabled = True
>   On Error GoTo 0
> などという方法もあります。
>
はい、過去ログで拝見しました。
あまり良く理解できなかったのと、コントロールの種類が複数あったので、
上述の方法(コントロール配列)による方法をとってみました。
>
> >     Set Ctrl(0) = Text1(0)
> > の実行前、from_loadすると同時にオブジェクトが消えてしまった。
> VBのメニューにある [表示]-[ウォッチ ウィンドウ]を使って見てください。
> 特定の変数の内容が変化した瞬間に一時停止させる機能がありますので、
> 何が原因となっているのかを突き止められる手助けになるかと思います。

この[ウォッチ ウィンドウ]で、フォームに貼り付けているコントロールを見ながら、
ステップ実行したところ、先の投稿の2項、3項のように
 2項:2度目のフォームロード時のSet Ctrl(0) = Text1(0)の実行、
 3項:フォームロードするとすぐ
「有効なオブジェクトではない」というような形になりました。

私としては、フォームに直接貼り付けてあり、無くなるはずのないものが、
「ない」と言われるのが、さっぱり分かりません。

全コードを貼り付けるわけにもいかないので、質問事項も良く分からないかもしれなくて、
どうもすみません。