2009年06月27日

実行時エラー '10': この配列は固定されているか、または一時的にロックされています

VB6で作成した exeファイルで、上記のようなエラーが出たことがありました。困ったことにプロジェクトを開いてデバッグしても発生しませんでした。

インターネットで検索をしてみたら、あるサイトに貴重な記載がありました(勝手にリンクしちゃってます ^^;)。

それによると(僕も実際確認しましたが)、ネイティブコンパイルした場合のみ発生する事象のようで、P-Codeコンパイルでは発生しません。


そのサイトに書かれていたように、With 〜 End With の中にある Exit SubExit Function など、End With が実行されないようなステートメントがあったのを、全てEnd With が実行されるようにしたら、エラーは発生しなくなりました。

VB に限らず VBA でも With を実行して End With が実行されないようなことがないようにしましょう。



With なんちゃら
If 条件 Then
Exit Sub ' ← コレはダメ〜!
End If
End With

もし何か正式な情報をお持ちの方が居ましたら、教えて下さい。
posted by ぜんこう at 14:53| Comment(0) | Visual Basic 6.0(VB6)

テキストボックス(TextBox)の MaxLength をバイト数で指定する

テキストボックス(TextBox)の MaxLengthプロパティの値が、VB5 になって、バイト数から文字数に変更されました。

MaxLength2 としていても、VB4 までは半角だと「AB」というふうに 2文字、全角だと「」というふうに 1文字しか入力できなかったのですが、VB5 からは全角でも「あい」というふうに 2文字(4バイト)入力できるようになりました。

入力した文字列の長さの制限を文字数ではなくバイト数で行う場面はかなりあると思います。

以下のコードを Form_Loadイベントに書けば、バイト数で制限することが可能になります。必要に応じて Form内の全テキストボックスに適用するように書き換えてもいいと思います。

maxlength.txt



Private Const EM_LIMITTEXT As Long = &HC5

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long

Private Sub Form_Load()

(中略)

With テキストボックス
If .MaxLength <> 0 Then
Call SendMessage(.hWnd, EM_LIMITTEXT, .MaxLength, 0)
.MaxLength = 0
End If
End With

(中略)

End Sub
posted by ぜんこう at 14:31| Comment(0) | Visual Basic 6.0(VB6)