ちょっと先の未来クイズ第4問

VB6.0でタイピングソフトを作成しています。KeyPressの入力判定で、入力された文字とLabel1に表示されている文字が一緒なら、その文字を消すという処理なんですが、

Private Sub Form_KeyPress(KeyAscii As Integer)
Label1.Caption = "taipingu"

If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then
Dim ss As String
ss = Label1.Caption
Mid(ss, z, 1) = " "
Label1.Caption = ss
z = z + 1
End if

というやり方を教えていただいてやってみたのですが、
「If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then」の部分で
「プロシージャの呼び出し、または引数が不正です」
というエラーが出てしまいます。しかも、このエラーが出ずに実行がうまくいくときもあります。
何故このエラーが出るのか、分かる方お願いします。

A 回答 (6件)

プロジェクトの参照で、「参照不可」のものがあると


Mid関数やFormat関数等がエラーになる場合があります。
この場合、「参照不可」の項目を参照しなおすと直ります。
    • good
    • 0

z 以外に容疑者はいないと思いますが‥


if 文の前に、例えば z=z のような式を置き、if 文でブレーク(一時停止)させて、そのつど z や keyascii をチェックしてみては?

また、余計なおせっかいですが、なぜ typing でなく taipingu なのでしょう?
    • good
    • 0

こんばんは


No.2です。
最終文字(8文字目)を処理した後に加算しているので、Z = 9 になると思います。ですが
If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then
では 9文字目 の検査をしてもエラーは発生しませんでした。
何故エラーになるのか私にもわからなくなりました。お役に立てず申し訳ないです。
    • good
    • 0

こんにちは


z = z + 1
で z の値が Label1.Caption = "taipingu" の長さを超えてしまったのではありませんか?

この回答への補足

zの値を適当に貼り付けたラベルの表示させてみたら、
(今の場合"taipingu")

z = 8でした。
いろいろ変えて試したところ、zがLabel1.Captionに書かれている文字列を超えることはありませんでした。

補足日時:2007/05/16 17:27
    • good
    • 0

Private Sub Form_Load()


  Me.Label1.Caption = "typing"
End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)
  Me.Label1.Caption = Replace(Me.Label1.Caption, Chr(KeyAscii), "_")
End Sub

と、1行で事足りるかと思いますが・・・。

Private Sub Form_KeyPress(KeyAscii As Integer)
    Dim I As Integer
    Dim L As Integer
    Dim C As String
    Dim S As String

    S = Label1.Caption
    C = Chr(KeyAscii)
    L = Len(S)
    For I = 1 To L
        If Mid(S, I, 1) = C Then
            Mid(S, I, 1) = " "
        End If
    Next I
    Label1.Caption = S
End Sub

多分、このような回答だったんではないでしょうか?

この回答への補足

すいません・・・。少し書き足りないコードがありました。
Private Sub Form_KeyPress(KeyAscii As Integer)
Label1.Caption = "taipingu"

If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then
Dim ss As String
ss = Label1.Caption
Mid(ss, z, 1) = " "
Label1.Caption = ss
z = z + 1

Else
Label2.Caption = "違う文字です"
End if
でした。

書いていただいたコードの2つ目のような処理をまさにやりたいのです。
ただ、「Me.Label1.Caption = Replace(Me.Label1.Caption, Chr(KeyAscii), "_")」
の処理をif文を使って私の書いたコードに組み込むにはどうやったらいいのでしょう・・・?

補足日時:2007/05/16 13:14
    • good
    • 0

zの初期化は行ってますか?


zは0からではなく1から開始させる必要があるのはわかりますよね?
タイピングを始める前のタイミングのイベントで初期化を行っていないように思えます。載せてあるソース以外の部分の設計ミスでは?

この回答への補足

zはform_Load時に1に初期化しています。
このエラーが出るまでの処理には間違いはない様に思います。

補足日時:2007/05/16 13:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!