饂飩コーディング

iOSアプリやら、Unityやら、Cocos2dやらごにょごにょ書いております

添付型フィールドにwavファイルを追加してボタンクリックで音を出す。

サイトが引っ越しました。→https://scombu.com

約1秒後に自動的にリダイレクトします。切り替わらない場合はリンクをクリックしてください。

Accessで音を鳴らすにはいくつか方法がありますよね。
1,フォームにwavファイルを挿入して以下の様にする
  oleSound.Action = acOLEActivate
  参考にさせていただきました。
tsware.jp
2,API使って音を出す方法
  ・mciSendString
  ・PlaySound

などなど

そこでwavファイルの設置の仕方なんですが、AccessDBファイルを現場環境に納品する時に1はDBファイルに包括されているので問題ありませんが、
2の場合はwavファイルがフルパスで指定するのでDBファイルとwavファイルを別で納品して、現場の環境に合わせてwavファイルを設置しなければいけません。

ちなみに1の場合はwavファイル再生の時にMediaPlayerの画面がポップアップされるのでいまいち使い勝手がよくありません。OLEだからかなぁ・・・まぁ、それはさておき

どうせなら、2もあらかじめテーブル内にwavファイルを保持しておいて、使うときにTempフォルダに展開してからそのフルパスを使ってAPIにフルパスを渡して再生すれば、納品時に複数ファイルにならないし、設置環境にわざわざwav保管用のフォルダを作らなくても済むんじゃないかと考えました。(まぁTempフォルダに保管フォルダ作りはするんですけどね)


概略と実装方法は以下みたいな感じで!
概要
① 適切なテーブルに添付型フィールドを作成してそこにwavファイルを複数添付しておく。
➁ アプリケーションの起動時、もしくはファイルを開くときに①で添付したファイルをTempフォルダーに書き出す。
③ APIをCallして特定の音を出す。

実装方法
① 添付型フィールドを適当なテーブルに作成してそこにあらかじめ準備しておいたwavファイルを追加しておく。(複数でもOk)
➁ フォームを開く時にFSOでユーザーのtempフォルダーを取得しそこに保管用フォルダを作成する。
③ 上記保管フォルダーにテーブルに保管しておいた添付ファイル(wavファイル達)を.SaveToFileで出力する。
④ 出力したフルパスをグローバル変数にセットしておき、必要な場面でmciSendStringをcallして音を出す。

てな具合です。
さてやってみましょう

まずはテーブルに添付がたフィールドを作成してwavファイルを保管します。
f:id:appdeappuappu:20210410234703p:plain

そのフィールドにwavファイルを追加する。今回は二つ
f:id:appdeappuappu:20210410235039p:plain
f:id:appdeappuappu:20210410235335p:plainf:id:appdeappuappu:20210410235347p:plain

グローバル変数API定義の宣言

Public beepSound1DirectoryPath As String
Public beepSound2DirectoryPath As String
#If Win64 Then
    Public Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
    (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
     ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
#Else
    Public Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" _
    (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
     ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
#End If

FSOでtempフォルダのパスを取得してそこに保管用のフォルダを作成し添付データを出力する。

Public Function test()
On Error Resume Next
    Dim fso         As New FileSystemObject     'FSO
    Dim f           As Folder                   'Folder
    Dim newFolderName As String                 '新規作成するフォルダ名
    Dim newDirectoryPath As String              '新規作成するフォルダのフルパス
    
    Set f = fso.GetSpecialFolder(TemporaryFolder) 'Tempフォルダーパスの取得
    
   
    newFolderName = "TestFolder" 'このAccess用のtempフォルダ名
    newDirectoryPath = f & "\" & newFolderName
    
    beepSound1DirectoryPath = newDirectoryPath & "\sound1.wav"
    beepSound2DirectoryPath = newDirectoryPath & "\sound2.wav"
    
    If Dir(newDirectoryPath, vbDirectory) = "" Then
        fso.CreateFolder newDirectoryPath
    End If
     
    Set fso = Nothing
    
    '添付型カラムから添付したファイルをTempフォルダに出力する。
    Dim DB As DAO.Database
    Dim R1 As Recordset

    Set DB = CurrentDb()
    Set R1 = DB.OpenRecordset("テーブル1")
    R1.MoveFirst
    Do Until R1.EOF

        With R1("AddData").Value 'AddDataカラムのそれぞれのValueに添付データが入っている
            While Not .EOF
             .Fields("FileData").SaveToFile newDirectoryPath  'FileDataに添付データが入っている。
                                                              'FileNameでnewDirectoryPathに保存される。
             .MoveNext
            Wend
        End With
        R1.MoveNext
    Loop
    
    R1.Close
    DB.Close
    Set R1 = Nothing
    Set DB = Nothing
End Function

mscSendStringで音をだす。

Private Sub コマンド5_Click()
    Call mciSendString("play " & beepSound1DirectoryPath, "", 0, 0)
End Sub

Private Sub コマンド3_Click()
    Call mciSendString("play " & beepSound2DirectoryPath, "", 0, 0)
End Sub

後は最後に閉じるフォームに作成したTempフォルダ内のテストフォルダを削除する機能を必要に応じて実装する。

ボタンおすと音がでます!!!
f:id:appdeappuappu:20210411101057p:plain