sndPlaySoundのCardinalをStringでキャストするには?

解決


デルファー  2014-01-23 20:12:53  No: 45938

いつもお世話になっております。
過去ログを探しましたが見つけきれなかったので質問させていただきます。

現在、音楽再生のプログラムを作成しております。
数ある音楽と再生モードを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"部分のキャスト方法がわかりません。
諸先輩方のアイデアをいただけたらと思います。
よろしくお願い致します。


フォイ  2014-01-24 00:24:53  No: 45939

キャストは不可能です。
最初から数値を渡すか、文字列をパースして数値に置き換える処理を自前で作成してください。


Mr.XRAY  2014-01-24 03:40:10  No: 45940

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 のバージョンによって異なりますが,新しいの入手しておけばいいかも知れません.


Mr.XRAY  2014-01-24 04:37:17  No: 45941

>もし,使用している Delphi のバージョンで,その定数名が定義されていなければ,

ファイル内の検索用のアプリ,あるいはユーティリティを持っていなくても,
Delphi の IDE から検索して調べることができます.

メニューの [検索] [ファイル検索] ダイアログで
[検索文字列] に検索文字列を入力
[対象] は,指定ディレクトリ
[ファイルマスク] の [参照] ボタンで [Source] を指定して,最後を \*.pas にする
[サブディレクトリを含める] にチェックを入れる


デルファー  2014-01-24 19:04:10  No: 45942

>フォイ様
ご教示ありがとうございます。
試行錯誤でやってみます。

>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;

もう少しテストをしてみます。


Mr.XRAY  2014-01-25 16:54:22  No: 45943

ゴメンナさい.

>新しいの入手しておけばいいかも知れません.

この前まで書いて,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


デルファー  2014-01-26 00:56:49  No: 45944

>Mr.XRAY様

丁寧にご教示ありがとうございます。
サンプルで置換しておりますコードは
MMSystem.pasにConstされている値です。

今の所問題ないようですので解決とさせていただきます。
どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加