いつもお世話になっております。
過去ログを探しましたが見つけきれなかったので質問させていただきます。
現在、音楽再生のプログラムを作成しております。
数ある音楽と再生モードを1つのサブルーチンとして作成したく
その方法をご教示いただければ幸いです。
Delphi5 Pro
procedure SoundPlay(Section, Entry, Mode: String);
var
RS:TResourceStream;
begin
RS := TResourceStream.Create(hInstance, PChar(Section), PChar(Entry));
try
sndPlaySound(RS.Memory, Mode);
//Modeには 'SND_MEMORY or SND_ASYNC or SND_LOOP'の文字列;
finally
RS.Free;
end;
end;
上記のような形で実装したいのですが
"Mode"部分のキャスト方法がわかりません。
諸先輩方のアイデアをいただけたらと思います。
よろしくお願い致します。
キャストは不可能です。
最初から数値を渡すか、文字列をパースして数値に置き換える処理を自前で作成してください。
sndPlaySound 関数の第 2 引数の値は,整数値または 32 ビットの符号なし整数値です.
文字列ではありません.
(Windows のバージョンによって異なることがあります)
http://msdn.microsoft.com/ja-jp/library/cc428790.aspx
したがって,SND_MEMORY, SND_ASYNC, SND_LOOP 等の定数名で指定します.
もし,使用している Delphi のバージョンで,その定数名が定義されていなければ,
その定数名の値(整数値)で指定します.
定数名の値がどんな値かは,ネットで調べます.
ネット上になければ,Microsoft Windows SDK を入手すると調べることができます.
SDK は WIndows のバージョンによって異なりますが,新しいの入手しておけばいいかも知れません.
>もし,使用している Delphi のバージョンで,その定数名が定義されていなければ,
ファイル内の検索用のアプリ,あるいはユーティリティを持っていなくても,
Delphi の IDE から検索して調べることができます.
メニューの [検索] [ファイル検索] ダイアログで
[検索文字列] に検索文字列を入力
[対象] は,指定ディレクトリ
[ファイルマスク] の [参照] ボタンで [Source] を指定して,最後を \*.pas にする
[サブディレクトリを含める] にチェックを入れる
>フォイ様
ご教示ありがとうございます。
試行錯誤でやってみます。
>Mr.XRAY様
ご教示ありがとうございます。
サイトの方でもいつも勉強させていただいてます。
教えて頂いた通りに調べまして
下記ソースに変更した所、うまく行ってるようです。
procedure SoundPlay(Section, Entry, PlayMode: String);
var
RS:TResourceStream;
Modecd: Cardinal;
begin
Modecd := 0;
if Pos('SND_SYNC', PlayMode) > 0 then Modecd := Modecd + $0000;
if Pos('SND_ASYNC', PlayMode) > 0 then Modecd := Modecd + $0001;
if Pos('SND_NODEFAULT', PlayMode) > 0 then Modecd := Modecd + $0002;
if Pos('SND_MEMORY', PlayMode) > 0 then Modecd := Modecd + $0004;
if Pos('SND_LOOP', PlayMode) > 0 then Modecd := Modecd + $0008;
if Pos('SND_NOSTOP', PlayMode) > 0 then Modecd := Modecd + $0010;
if Pos('SND_NOWAIT', PlayMode) > 0 then Modecd := Modecd + $0008;
if Pos('SND_FILENAME', PlayMode) > 0 then Modecd := Modecd + $00020000;
if Pos('SND_RESOURCE', PlayMode) > 0 then Modecd := Modecd + $00040004;
RS := TResourceStream.Create(hInstance, PChar(Section), PChar(Entry));
try
sndPlaySound(RS.Memory, Modecd);
finally
RS.Free;
end;
end;
もう少しテストをしてみます。
ゴメンナさい.
>新しいの入手しておけばいいかも知れません.
この前まで書いて,Windows のバージョンが不明なのに気づましたが,適当に書いてしまいました.
Windows のバージョンに依存します.
Windows 7 であれば以下のどちらかで OK のハズです.
私は ISO の方をダウンロードして導入しています.
他の Windows のバージョン方は,申し訳ありませんが,自分で調べてください.
http://www.microsoft.com/en-us/download/details.aspx?id=8279
http://www.microsoft.com/en-us/download/details.aspx?id=8442
>Mr.XRAY様
丁寧にご教示ありがとうございます。
サンプルで置換しておりますコードは
MMSystem.pasにConstされている値です。
今の所問題ないようですので解決とさせていただきます。
どうもありがとうございました。
ツイート | ![]() |