C++Builder相談室 Part8

このエントリーをはてなブックマークに追加
931デフォルトの名無しさん:04/03/17 18:27
>>928->>30
ありがとう!
932924:04/03/17 19:02
自己レス
TTable::AddIndexでヨカッタのねん。
TMediaPlayerを使って、MP3の再生アプリを作りたいのですが、
普通に連続で再生するほうほうがわかりません。

あらかじめ、ファイルネームを配列fname[i]にi個読み込んでおいて
fname[0]からfname[i]まで連続で再生したのですが
どうすればよろしいのでしょうか?

kは任意の整数として

void fastcall()
{
MediaPlayer1->Filename=fname[k];
MediaPlayer1->Open();
MediaPlayer1->Play;
}

で1曲再生することはわかるのですが、1曲終わった後に次のk+1番目をそのまま再生するにはどうしたらいいのでしょう??
通常のプレイヤーのように、i+1が終わったら、i+2、i+3・・・
というふうに連続で再生したいのです
Notify か、タイマーで Mode を監視して曲の終わりを検知することが必要。

さて、ここから先が本題なのだが、入門なら MediaPlayer でもOKとしても、
少しでも実用を考えるなら、頑張って DirectShow を。
935933:04/03/18 03:38
レスありがとうございます
NotifyがいまいちよくわかってないのですがC言語の基本的知識で考えてみたのですが
まず、再生ボタンをクリックしたとき1曲目再生
k=0;←オフセット
void __fastcall TForm1::ButtonClick(TObject *Sender)
{
MediaPlayer1->FileName=fname[k];
MediaPlayer1->Open();
MediaPlayer1->Play();
Label1->Caption="再生中 "+(ExtractFileName(fname[k]));
k++;
}
void __fastcall TForm1::MediaPlayer1Notify(TObject *Sender)
{
if(k==i){
k=0;
MediaPlayer1->FileName=fname[k];
MediaPlayer1->Open();
MediaPlayer1->Play();
}
else{
MediaPlayer1->FileName=fname[k];
MediaPlayer1->Open();
MediaPlayer1->Play();
}
Label1->Caption="再生中 "+(ExtractFileName(fname[k]));
k++;
}
}
これで、順番に再生されると思ったのですが、バグってPCがフリーズしたりするようになります。
たまに、2,3曲連続再生に成功するのですが何がまずいんでしょうか?
簡単でいいのでNotifyを使用する方法を教えて頂きたいです。初心者厨房ですいません
>>935
Notifyの使い方はヘルプを見れば書いてある。
ヘルプを見ても分からなかったら、ヘルプのどこが分からないのかを
質問するように汁。

今回はサービス。
Notifyイベントは1曲再生が終わるごとに呼び出される(ようにする)んだから、
その中で連続再生してどうする。

void __fastcall TForm1::MediaPlayer1Notify(TObject *Sender)
{
if(k==i) k=0;
MediaPlayer1->FileName=fname[k];
MediaPlayer1->Open();
MediaPlayer1->Notify = true;
MediaPlayer1->Play();
Label1->Caption="再生中 "+(ExtractFileName(fname[k]));
k++;
}

ユーザが停止ボタンを押したときは、MediaPlayer1->Notifyをfalseにしてから停止しないと
次が再生されてしまうので注意。
てか、こういうものは遷移をきっちり管理しないとならんな。

あと、質問とは直接関係内が、クラスメンバや大域変数には意味の分かる名前を付けろと
入門書に書いてなかったか?
kだの i だのって名前は、使い捨てる変数だけにしろ。
とりわけ人様に質問するときは名前だけで用途が一目で分かるようにしておくもんだ。
↑訂正
別にNotifyイベント内で連続再生してるわけではないのだな。スマン。
プロパティの設定を忘れてるのが問題だ。
938933:04/03/18 16:07
いろいろアドヴァイスありがとうございます。
PC始めたばかりの高校生で勉強不足でした。
ヘルプ読み直してみます。
高校生か。
今なら間に合う、がんばって英語勉強しろよ〜
そしてWinodowsAPIとかはMS純正の英語のマニュアルを読破するのだ。

それができれば普通のCとWindowsのイベントドリブンなC++の違いさえ念頭におけばなんとかなるさ。
自己突っ込み
Winodowsってなんだ
Windowsだろ
941924:04/03/18 18:32
再度質問お許しを。TTable::AddIndexで二次インデックスを動的に設定するのだが
Table1->AddIndex("Hoge", "Hoge", TIndexOptions() << ixCaseInsensitive, "Hoge");
ご覧のようにixDescendingは指定していないのに結果は降順になってしまう。
なして?
>>941
お前もだ。ヘルプのTTable::AddIndexの項目を声を出して10辺嫁。
943941:04/03/19 10:06
>>942
ありがとう。救われました(ヘルプ読んでみて思わず自分に対して「ぷっ」)。
944933:04/03/21 23:19
>>942さん
Notifyで連続再生はできたのですが、今度は停止ができなくなりました。
ボタンを押したときにfalseを代入してからStop()メソッドですよね
なぜかできない。。。
Timerを使って、連続再生する方法を考えてみたのですが、mp3ファイルの時間の長さを取得するのに
MediaPlayer1->Lengthを使用するんですよね?ヘルプにある
int TheLength;
 MediaPlayer1->TimeFormat = tfHMS;
TheLength = MediaPlayer1->Length;
// label 1 に「時」を表示する
Label1->Caption = IntToStr(LOBYTE(LOWORD(TheLength)));
// label 2 に「分」を表示する
Label2->Caption = IntToStr(HIBYTE(LOWORD(TheLength)));
// label 3 に「秒」を表示する
Label3->Caption = IntToStr(LOBYTE(HIWORD(TheLength)));
でも、意味不明な値しか取得できないのは何故でしょう?秒で取得したいのですが・・・
945933:04/03/22 00:30
すいません。質問半分撤回。
Notifyのイベントハンドラの中にStop()メソッドいれることで解決しました。

しかし、時間の取得は不明なままです。
だからヘルプを読めと。
tfHMSがサポートされていないんだろ。
tfMillisecondsならまずだいじょうぶた。
>>945
VCLヘルプから引用(TMediaPlayer::TimeFormat)
>すべての形式がすべてのデバイスでサポートされているとは限りません。
>サポートされていない形式を設定しようとすると,その代入は無視されます。

君がコピーしたサンプルコードにもちゃんと「デバイスによってはtfHMSを
サポートしない」とコメントがありますな。
948933:04/03/22 04:41
みたいですね
教えていただいてありがたいのですが
tfMilliseconds
↑これはなんでしょう?
OSはWindowsを使用しているのですが何か関係あったり?
949デフォルトの名無しさん:04/03/22 10:26
TMenuItemのOnClickイベントで右クリを検出する方法を教えてください
>>949
OnClickでは無理
自分でメッセージを拾うよし
Label1->Caption = DataList->Strings[0];
Label2->Caption = DataList->Strings[1];
Label3->Caption = DataList->Strings[2];
これを繰り返しで一括処理できませんか?
>>952
FindComponent
超初心者です。ヘルプを見てもサイトを検索しても
たどり着かなかったので、恥を忍んで質問します。
VCLコンポーネント(Imageコンポーネント)をソース上で生成するには、
どこにどう書けばよいのでしょうか?
よろしくお願いします。
954デフォルトの名無しさん:04/03/22 18:11
TImage *image = new TImage
>>953
'TImage::TImage()'に一致するものが見つからない
と出たのですが、どうすればよいのでしょうか?
よろしくお願いします。
956デフォルトの名無しさん:04/03/22 18:28
TImage *image = new TImage(this);
>>955
__fastcall virtual TImage(Classes::TComponent* AOwner);
>>956
一応生成することはできたようです。
しかし、それを画像をLoadFromFileメソッドを使用し、
CopyRectを使用して描画しようとしたところ
エラーが出てうまくいきませんでした。
>>957
publicのところに書けばよろしいのでしょうか?
実行しようとしたところ
)が必要 と出てコンパイルが通りませんでした。

質問ばかりですみませんが、よろしくお願いします。
>>958
エラーがでたなら、自分の書いたコードとそのエラーメッセージを
示した上で質問しなかったら誰も何も教えられないよ。
その辺はプログラミング以前の一般常識の問題。気をつけるべし。

>>957はTImageのコンストラクタの宣言。ヘルプからの引用。
これを見れば、TImageのコンストラクタを呼ぶときは
TComponent*型の引数が必要だと分かる。
よって具体的には>>956になるという事。
こういうことは、C++の基本さえ分かっていれば、
ヘルプを見ただけで自分で解決ができるはず。

悪いことを言わんからC++の入門書をまず読んで基本を身につけな。
でないと、何か一つするごとに人に聞いて回らなきゃならないぞ。

なお、サイトを見て回るよりは、定評のある入門書を読んだ方が
圧倒的に効率的で効果的。
こういうところで投資を惜しんではいかん。
960デフォルトの名無しさん:04/03/23 12:34
画像の透過について質問させてください。

Graphics::TBitmap *DSelect = new Graphics::TBitmap();

// 画像データの読込み
DSelect->LoadFromFile(ExtractFilePath( Application->ExeName ) + "system\\Select.bmp");

// 透過指定
DSelect->Transparent = true;
DSelect->TransparentMode = tmFixed;
DSelect->TransparentColor = clWhite;

// フォームの左上隅に描画
Form1->Canvas->Draw( 240, 0, DSelect );

delete DSelect;

とあるサンプルを参考にした↑のソースで透過画像を表示することはできるのですが、
画像位置の移動など、分からないことが多いので、TImageで画像を透過する
方法をお教えください。
Image1->Picture->Bitmap = DSelect;
とか、やってみたのですが、上手くいきませんでした。
Borland C++BuilderってコンパイラーはBorland C++ Compilerしか使えないんですか?
>>961
他のコンパイラではObjectPascalとの互換性の問題でコンパイルできません。
963デフォルトの名無しさん:04/03/23 14:21
>>962
そうなんですか…親切にありがとうございました。
>>960
TImage::Transparent
>>964
気が付きませんでした。
ありがとうございます。
>>959
解説書なら数冊あるのですが…。
とりあえず入門書みてみます。
ありがとうございました。
>>966
本が何冊あってもその内容を自分が理解できなきゃ何の役にもたたん。
あと、君に必要なのは「BCBの解説書」じゃなくて「C++の入門書」だぞ。
968デフォルトの名無しさん:04/03/23 17:11
このたった一行で未定義の例外が飛ぶ。ランタイムのバグ?
UPDATE4だしCSCRIPTでOLEの動作確認してるんで環境はOKのはず。

#include <vcl.h>
#include <sysvari.h>
#include <dbdaoint.h>

#pragma link "rtl.bpi"
#pragma link "vcl.bpi"

int main() {
Variant dao = Variant::CreateObject("DAO.DBEngine.36");
exit(0);
return 0;
}
>>968
未定義の例外でなく "EOleSysError"だが?
あと、「CoInitializeは呼び出されていない」というメッセージも来るが?

なんでもかんでもライブラリのバグにするなよ。
例外を投げる関数を呼び出したら、
その一行で例外が飛んできて当たり前だ罠。

例外が未定義になるのは、
必要なヘッダがインクルードされてないからだろ。
971 ◆KcrJZ6hEJI :04/03/25 00:43
 ゴミ箱を空にするAPI SHEmptyRecycleBin を呼び出そうとすると
リンクでエラーになります。

Unresolved external 'SHEmptyRecycleBinA' referenced from XXXX..OBJ

shellapi.h をインクルードしてますが、他に手順が足りないような気がする
のですが、なんなのでしょう?

環境は BCB3 Pro On NT4SP6 です。
>>971
Minimum DLL Version shell32.dll version 4.71 or later
Custom Implementation No
Header shellapi.h
Import library shell32.lib
Minimum operating systems Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0
> 例外が未定義になるのは、
>必要なヘッダがインクルードされてないからだろ。
DLL内で別スレッドが起動して、
その内部で構造化例外が投げられているからでは?
MSJのlodprf32で見るとそういう現象
CppWebBrowserを使い、普通にNavigate()でWebを表示したとします。
HTMLでゆうtarget="_brank"のタグを踏んだとき
すなわち、HTMLによって別ウィンドウで表示されるときはIEが起動してしまいますよね?
これを回避して、同じexeをIEのように起動しリンク先を表示させるにはどうしたらよいのでしょうか?


>>971
DLLからLIBファイルを作る。
漏れはそれでBCB1で使った実績有り。
976 ◆KcrJZ6hEJI :04/03/25 10:40
>>972,975 Thanks.

 DLLからLIBを作る。ですか…。調べてやってみます。
しかし原因が環境にあったとは。。。

 ってことは、この環境では(ゴミ箱を空にする)別の正当な
方法があるってことですかね。
>>976
そもそもshell32.libをプロジェクトに追加してない予感
978デフォルトの名無しさん:04/03/25 11:31
TIconをHICONに変換する方法をおしえてください
>>978
Handleプロパティ?
980 ◆KcrJZ6hEJI
結果報告。できました。

C:\...\CBuilder3\Bin>implib shel3247.lib C:\Winnt\...\Shellapi32.dll
C:\...\CBuilder3\Bin>move shel3247.lib ..\lib

 として、プロジェクトのメイクファイルに shel3247.lib をリンクするよう
追加。これで無事にリンクも通りました。が…

 テストしてみるとAPIは呼んでいるようですが、ゴミ箱のクリアは
されてない…。なんで?