AB424サンプルのCDPlayerのTrackBarの設定について

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
MUGI

AB424サンプルのCDPlayerのTrackBarの設定について

#1 投稿記事 by MUGI »

サンプルを見て勉強中なのですが、そのままコンパイルして実行すると
TrackBarの動きが速すぎでした。
OSは、XP SP2で、何箇所かのPCで試しましたが同じです。
コードを見ると、Sub MainWnd_PlayButton_Clickのなかで、
nMax = (MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10
SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,nMax))
で設定しています。
MessageBoxを使って調べてみると、nMaxの値が変な値になっています。
nMaxを使わず、
SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,(MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10))
とすると正常に動きます。
文法的にも、nMaxに関しておかしいところは無いみたいです。
なぜ、nMaxを使うとおかしくなるのか、わかられるかたいらしゃいましたら教えていただけないでしょうか。
よろしくお願いします。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#2 投稿記事 by 7 »

> 文法的にも、nMaxに関しておかしいところは無いみたいです。
> なぜ、nMaxを使うとおかしくなるのか、わかられるかたいらしゃいましたら教えていただけないでしょうか。
想像のお話ですけど、変数nMaxの型に問題があるんじゃないでしょうか?
Dim nMax As Longだとダメだけど、Dim nMax As DWordにするとオーケーなどなど。
MAKELONG関数に渡すのは16ビット整数値なので、Integer型やWord型にしてみては如何でしょう?
MUGI

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#3 投稿記事 by MUGI »

ありがとうございます。
> MAKELONG関数に渡すのは16ビット整数値なので、Integer型やWord型にしてみては如何でしょう?
サンプルは元々、Dim nMax As Integer になっています。
wordにしても、まったく変わりません。
ということは、AB424のバグと言うことでしょうか?
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#4 投稿記事 by 7 »

> サンプルは元々、Dim nMax As Integer になっています。
> wordにしても、まったく変わりません。
じゃあ逆に、Long型やDWord型にしてみてください。
(MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10 の値がいくつになるか分からないんですけど、Integer型やWord型では収まりきらないのかもしれません。

バグだバグだと失敗を押し付けてしまうことは簡単なことです。すぐに諦めずもっとアガいてみましょう(^_^;)
ゲスト

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#5 投稿記事 by ゲスト »

質問に書いているように
>MessageBoxを使って調べてみると、nMaxの値が変な値になっています。
値は、本当は3080とかになるはずなのに、8とかになります。
型をおおきなものにしても、かわりはありません。
nMaxへの代入時に、おかしくなっているか、nMaxの参照アドレスがおかしいなどでしょうかね。
MUGI

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#6 投稿記事 by MUGI »

> バグだバグだと失敗を押し付けてしまうことは簡単なことです。すぐに諦めずもっとアガいてみましょう(^_^;)

失敗なら、このAB最新版についてくるサンプル作られた人の失敗ですよ。
私は、ソースに変更を加えず、単にコンパイルして動かそうとしてるだけですから。
なのに正しく動いてくれない。
念のため、別の回線と別のPCを使って、ABをダウンロードし直して追試しましたが、
現象は同じです。
よって、ダウンロード時のファイルの破損等は考えられません。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#7 投稿記事 by NoWest »

> > バグだバグだと失敗を押し付けてしまうことは簡単なことです。すぐに諦めずもっとアガいてみましょう(^_^;)
>
> 失敗なら、このAB最新版についてくるサンプル作られた人の失敗ですよ。
> 私は、ソースに変更を加えず、単にコンパイルして動かそうとしてるだけですから。
> なのに正しく動いてくれない。
> 念のため、別の回線と別のPCを使って、ABをダウンロードし直して追試しましたが、
> 現象は同じです。
> よって、ダウンロード時のファイルの破損等は考えられません。


わたしは現在AudioCDを持っていないのでテストできないのですが、
MUGIさんがテストで再生しようとしているオーディオデータの長さはどれくらいでしょうか?
MUGI

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#8 投稿記事 by MUGI »

> わたしは現在AudioCDを持っていないのでテストできないのですが、
> MUGIさんがテストで再生しようとしているオーディオデータの長さはどれくらいでしょうか?
ありがとうございます。
再生している音楽CDは、1曲5分8秒とか大体5分前後の曲です。
音楽の再生自体は、全く問題ありません。
単に、TrackBar の最大値が変なので、曲はまだ演奏開始したばかりなのに
終了まで移動してしまい、役に立たないのです。
BASIC32
記事: 30
登録日時: 2005年10月29日(土) 11:57
お住まい: 札幌市

確かに

#9 投稿記事 by BASIC32 »

私も、その問題で困っていたことがあり、結局、あきらめました。
確かに、すぐに終わってしまいます。
環境は、以下の通りです。
OS:Windows98SE/Me
ABのバージョン:4.2X
曲の長さ:約4:25
トラックバーの終了までの時間:約16秒(OSによってバラバラみたい)
CDライター:WinCD-R v6.5
CDリーダーのメーカー:バッファロー(型はわかりません)
ちなみに、ActiveBasicオフィシャルユーザーズガイドに付いている、
CDのサンプルのEXEを実行すると、正常に動作するのですが。。。
あと、AB4.24のサンプルに付属のEXEを実行すると、まともな動作をします。
ただ、トラックバーを動かすと、バグりますけど。
MUGI

Re: 確かに

#10 投稿記事 by MUGI »

> あと、AB4.24のサンプルに付属のEXEを実行すると、まともな動作をします。
> ただ、トラックバーを動かすと、バグりますけど。
情報ありがとうございます。
確かに、TrackBarの最大値の問題をクリアしても、TrackBarクリックでもおかしいですね。
一番最初から再生にしかなりませんね。
どうも、Sub MainWnd_HScrollの処理が2回連続で実行されるようです。
pos=SendMessage(GetDlgItem(hMainWnd,TrackBar1),TBM_GETPOS,0,0)\10
MessageBox(hMainWnd,Str$(pos),"pos",MB_OK)
mciSeekParms.dwTo=MCI_MAKE_TMSF(TrackNum, pos\60, pos mod 60,0)
上記の様に、途中にMessageBoxを挿入するだけで、途中からの再生ができるようになります。
まだ、それでも、TrackBarのクリックした位置と、TrackBarのカーソルの位置があっていないです。
このサンプルは、現在のABの学習用サンプルとしては、まずいと言うか
単なる代入さえ処理できない言語なのかと思ってしまいます。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#11 投稿記事 by NoWest »

> nMax = (MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10
> SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,nMax))
> で設定しています。
> MessageBoxを使って調べてみると、nMaxの値が変な値になっています。
シークがうまくできない理由までは突き止められていませんが、このnMaxの問題は分かりましたのでご報告しておきます。


これは単純にキャストの問題でした。

コード: 全て選択

nMax = (MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10
MCI_MSF_MINUTE()関数の返す値はBYTE形式であるため*60の結果が0~256の範囲に自動的に丸められていただけです。

下記のようにすれば問題はたぶん、起きないはずです。

コード: 全て選択

nMax = (60 * MCI_MSF_MINUTE(msp.dwReturn) + MCI_MSF_SECOND(msp.dwReturn)) * 10

今は、忙しいのでここまででご勘弁を(笑
MUGI

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#12 投稿記事 by MUGI »

お忙しい中調べていただいてありがとうございます。
> 下記のようにすれば問題はたぶん、起きないはずです。
>

コード: 全て選択

nMax = (60 * MCI_MSF_MINUTE(msp.dwReturn) + MCI_MSF_SECOND(msp.dwReturn)) * 10
確かに、上記の様にしますと、すぐに終わりにいく現象は直りました。
あほみたいな素朴な疑問なんですが、
SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,nMax)) を
SendMessage(hTrackBar,TBM_SETRANGE,0,MAKELONG(0,(MCI_MSF_MINUTE(msp.dwReturn) * 60 + MCI_MSF_SECOND(msp.dwReturn)) * 10))
の様にかくことでも、不具合が起きなくなりました。
計算途中の型の問題だとすると、nMaxのかわりに直接算式を書いても、おかしくなる気がするのですが、正常のようです。
代入の場合のみ発生するのでしょうか。
MessageBox(hMainWnd,Str$(MCI_MSF_MINUTE(msp.dwReturn)*60),"分*60 時間",MB_OK)
と書いても、正常値が表示されます。
お時間取れるときにでも、ご教授いただけたらと思います。
MUGI

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#13 投稿記事 by MUGI »

計算の前後を入れ換えると結果が異なる件ですが、バグ報告のほうに
KICOさんが投稿されました、題名: リテラル値同士の演算結果があります。
バグと言うことですが、今回の件も同じと考えていいのでしょうか?
そうだとすると、一応目処が立ったと考えますが。
でも、バーをクリックした時の動作がおかしいのがまだ解決した訳ではないのですが。
よろしくお願いします。
MUGI

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#14 投稿記事 by MUGI »

演奏中にTrackBar上の任意の1点をクリックしても最初からしか演奏されない件について
mciSendCommand(mop.wDeviceID,MCI_STOP,MCI_NOTIFY,dwWk) '停止コマンド追加

bErr=mciSendCommand(mop.wDeviceID,MCI_SEEK,MCI_TO,mciSeekParms)
の前に挿入。一度停止させる事で、途中から演奏が続くようになりました。
Dim dwWk as Dwordで定義しています。
ただ、この方法が正しいのかは、
If IsWindowEnabled(GetDlgItem(hMainWnd,PlayButton))=0 Then
'再生中のときは一時停止
SendMessage(hMainWnd,WM_COMMAND,PauseButton,0)
とゆうコードが前方にあるのでどうなのかな?とは思いますが。
ゲスト

Re: AB424サンプルのCDPlayerのTrackBarの設定について

#15 投稿記事 by ゲスト »

> 演奏中にTrackBar上の任意の1点をクリックしても最初からしか演奏されない件について
は、メッセージボックスをつかっていたせいでした。
メッセージボックスをはずすとOKでした。
上のメッセージのコードを入れると、TrackBarをスライドさせると正しくなりました。
(入れないと、TrackBarの位置と曲の位置があいません)
ただし、まだ2回連続して、この部分が動いてるかもしれません。
返信する