- ベストアンサー
VB6 カウントアップ処理について
- Visual Basic6.0を使用して表示板を製作しています。外部信号を受け取ったらText Boxの値に+1します。
- プログラムレベルが低いため、カウントアップの方法を教えてください。
- スタートボタンを押すとdioInpDataが確認され、値に応じてText Boxが更新されますが、現在のプログラムではスタートボタンを押すと一度だけ確認され、常に1が表示されてしまいます。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
●ありゃー 案4の型が・・・ Text1.Text = CStr(1 + CLng(Text1.Text)) かも(/∇≦\) ●残り プロシージャ内で宣言された dioInpData にいつ値が渡されているのかという疑問は残るが (本来のコードでは別の場所で宣言、値が渡されているのかな?) 残りはumekihajimeさんのヒントの通りかと 1.タイマーコントロールで一定間隔毎に dioInpData の値を調べ→それなりの処理 2.dioInpData の値が設定された時に、同時にText1.Textの値を設定する。 または、Text1.Textの値を設定する処理が書かれたプロシージャを呼び出す。 簡単に思いつく外部信号の受け取り方法は2種類(他にもあるかも) 1:(カスタム)コントロールのイベント(またはプロパティ値を参照?) 2:コールバック関数が呼び出されている AddressOf 演算子で関数アドレスを取得、これを外部APIに渡しコールバックさせる。 コールバック関数はフォーム、クラス、に書かれたコードだと インスタンシングされたりメモリから削除されたりするため標準モジュールにしか書けない。 なのでこの方法の場合は標準モジュールのコードを調べる。 あと、昔VBマガジンに裏ワザで変数アドレスが使用できるとか書いてあった気がしたけど やりかた覚えてないな・・・
その他の回答 (7)
- ShowMeHow
- ベストアンサー率28% (1424/5027)
トリガーが入ったときにイベント起動できない場合の繰り返し処理には幾つか方法が有ります。 for ... next (回数指定の繰り返し) Do ... loop (一定の条件が満たされるまでの繰り返し) timer コントロールを使った方法 (一定時間になったらのくりかえし)
- piroin654
- ベストアンサー率75% (692/917)
コメント抜きで、 Option Explicit Dim i As Long Praivate Sub START_Click() If dioInpData = 1 Then i = i + 1 End If Text1.Text = i End Sub Private Sub Form_Load() Text1.Text = 0 End Sub
- umekihajime
- ベストアンサー率23% (13/55)
ヒントを2つ 外部信号を受け取る部分は、信号が変化するとイベントが発生する仕組みですか? そうでなければ、タイマーコントロールの使い方を調べて見てください。 newの値の変化を判断する方法は、 if old <> new then old = new call 値が変化した時の処理 end if 頑張ってください。
- goo_account
- ベストアンサー率100% (1/1)
VB6の環境はもう無いので確認できないけど思ったことだけ 一見STARTという名前を付けたボタンかなにかのクリックイベントの処理に見えたが × Praivate Sub START Click() ? Private Sub START_Click() この時点でエラーにならない? Dim i as string i = 0 型を理解していないと思う(VB6ではエラーにならなかったと思うが) Dim i As String ならば文字列型なので i = "0" になる しかしカウンタとして i を使用するならふつうは Dim i As Long または Dim i As Integer とするだろう Dim dioInpData as stringも同様 解決案 案1:i をStaticで静的変数として宣言する。i = 0は余計。変数の初期化時には、数値変数は 0 に初期化されるだろう。 案2:i をプロシージャの外部でモジュールレベルのメンバ変数として宣言する。 案3:i をプロジェクト内で参照できるGlobal(Publicだっけ?)変数として宣言する。 案4:Text1.Textの内容が数値として評価できることが保証されるなら、そのままカウンタとして使用する。 Text1.Text = 1 + CLng(Text1.Text) >・スタートボタン押したらdioInpData一回確認したら終わってしまう。 >外部信号を受け取ったらText Boxの値に+1します。外部信号(0 or 1)受け取りはできたので、 コードはスタートボタンのクリックイベント? 外部信号(0 or 1)を受け取った時にプロシージャを呼び出すようにしないとだめだと思う。
- umekihajime
- ベストアンサー率23% (13/55)
追伸 ごめんなさい、valではなくcintだったかも知れません。
お礼
umekihajime様 ありがとうございます。 明日朝会社で試します! これでカウントアップが出来れば、あとは トリガーの割り込み(?)待機(?)です。 何かヒントはあるでしょうか・・・?
- umekihajime
- ベストアンサー率23% (13/55)
ひとまず今のソースを使った方法を示します。 formloadイベント等で、Text1.text = "0"としておいてください。 後は Text1.text = i + 1の部分をText1.text = val(Text1.text) + 1 としてください。
- storm-rider
- ベストアンサー率52% (10/19)
これではスタートボタンを押して End sub まで処理を行って終了ですよね? 外部信号がどのようにして渡してあるのかは分かりませんが 画面を用意して、トリガーを受け取ったら +1する処理を行う。 そして画面表示で待機するように作らないよダメですよ もう少し頑張ってみてください^^b
お礼
storm-rider様 ありがとうございます。 umekihajimeさんの回答で+1の処理がなんとかなりそうです。 トリガーを受け取るよう待機するというのが、コードが 思いつきません。 もう少しヒントいただけますか!? もちろん、明日自分で頑張ります! 明日にでもまたOK wave見に来ます!
お礼
タイマーで一定間隔にチェックしてdioInputDataが1のときにカウントアップして、別のタイムアップするまで繰り返すでできました! ありがとうございました。 またよろしくお願い致します。