こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VB6 カウントアップ処理について

お世話になっております。

Visual Basic6.0を使用して表示板を製作しています。まだまだプログラムレベルが低いので
ご教示ください。

外部信号を受け取ったらText Boxの値に+1します。外部信号(0 or 1)受け取りはできたので、
カウントアップの仕方を教えてください。
スタート ⇒ トリガーが入ったらカウントアップ ⇒ トリガーが入ったらカウントアップ ⇒ 
終了ボタン押すまで繰り返します。

トリガー : dioInpDataが0か1が入力される
スタート、終了はボタン押下

Praivate Sub START Click()

Dim dioInpData as string
Dim i as string

i = 0
If dioInpData = 1Then
 Text1.text = i + 1
End If

End sub

これだと、以下の問題が。。。
 ・スタートボタン押したらdioInpData一回確認したら終わってしまう。
 ・i = 0から始まるから常に1を表示していまう。

これまでボタン押下で一回処理で終了するプログラムしか組んでないので、
何回もトリガーが入ったら処理する、カウントアップの処理が初めてです。

自分で書いてて悲しくなりますが、こんなこともわからないんです。

どなたか教えてください。
何卒、よろしくお願いいたします。

投稿日時 - 2011-08-31 19:30:05

QNo.6980602

すぐに回答ほしいです

質問者が選んだベストアンサー

●ありゃー

案4の型が・・・
Text1.Text = CStr(1 + CLng(Text1.Text))
かも(/∇≦\)


●残り

プロシージャ内で宣言された dioInpData にいつ値が渡されているのかという疑問は残るが
(本来のコードでは別の場所で宣言、値が渡されているのかな?)

残りはumekihajimeさんのヒントの通りかと

1.タイマーコントロールで一定間隔毎に dioInpData の値を調べ→それなりの処理

2.dioInpData の値が設定された時に、同時にText1.Textの値を設定する。
  または、Text1.Textの値を設定する処理が書かれたプロシージャを呼び出す。

  簡単に思いつく外部信号の受け取り方法は2種類(他にもあるかも)

  1:(カスタム)コントロールのイベント(またはプロパティ値を参照?)
  2:コールバック関数が呼び出されている

  AddressOf 演算子で関数アドレスを取得、これを外部APIに渡しコールバックさせる。
  コールバック関数はフォーム、クラス、に書かれたコードだと
  インスタンシングされたりメモリから削除されたりするため標準モジュールにしか書けない。

  なのでこの方法の場合は標準モジュールのコードを調べる。

あと、昔VBマガジンに裏ワザで変数アドレスが使用できるとか書いてあった気がしたけど
やりかた覚えてないな・・・

投稿日時 - 2011-09-01 00:05:31

お礼

タイマーで一定間隔にチェックしてdioInputDataが1のときにカウントアップして、別のタイムアップするまで繰り返すでできました!
ありがとうございました。
またよろしくお願い致します。

投稿日時 - 2011-09-09 10:49:11

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

トリガーが入ったときにイベント起動できない場合の繰り返し処理には幾つか方法が有ります。
for ... next (回数指定の繰り返し)
Do ... loop (一定の条件が満たされるまでの繰り返し)
timer コントロールを使った方法 (一定時間になったらのくりかえし)

投稿日時 - 2011-09-01 10:30:58

ANo.6

コメント抜きで、


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

投稿日時 - 2011-08-31 23:15:31

ANo.5

ヒントを2つ

外部信号を受け取る部分は、信号が変化するとイベントが発生する仕組みですか?
そうでなければ、タイマーコントロールの使い方を調べて見てください。

newの値の変化を判断する方法は、
if old <> new then
old = new
call 値が変化した時の処理
end if

頑張ってください。

投稿日時 - 2011-08-31 22:50:23

ANo.4

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)を受け取った時にプロシージャを呼び出すようにしないとだめだと思う。

投稿日時 - 2011-08-31 22:05:42

ANo.3

追伸
ごめんなさい、valではなくcintだったかも知れません。

投稿日時 - 2011-08-31 20:19:10

お礼

umekihajime様
ありがとうございます。
明日朝会社で試します!

これでカウントアップが出来れば、あとは
トリガーの割り込み(?)待機(?)です。
何かヒントはあるでしょうか・・・?

投稿日時 - 2011-08-31 21:20:23

ANo.2

ひとまず今のソースを使った方法を示します。

formloadイベント等で、Text1.text = "0"としておいてください。
後は Text1.text = i + 1の部分をText1.text = val(Text1.text) + 1 としてください。

投稿日時 - 2011-08-31 20:16:38

ANo.1

これではスタートボタンを押して End sub まで処理を行って終了ですよね?

外部信号がどのようにして渡してあるのかは分かりませんが
画面を用意して、トリガーを受け取ったら +1する処理を行う。
そして画面表示で待機するように作らないよダメですよ

もう少し頑張ってみてください^^b

投稿日時 - 2011-08-31 19:51:44

お礼

storm-rider様
ありがとうございます。
umekihajimeさんの回答で+1の処理がなんとかなりそうです。
トリガーを受け取るよう待機するというのが、コードが
思いつきません。
もう少しヒントいただけますか!?

もちろん、明日自分で頑張ります!
明日にでもまたOK wave見に来ます!

投稿日時 - 2011-08-31 21:23:42

あなたにオススメの質問