Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


695 / 2272 ツリー ←次へ | 前へ→

【10499】VBAとCallBack関数 SAU 08/8/7(木) 18:41 質問[未読]
【10500】Re:VBAとCallBack関数 neptune 08/8/7(木) 22:17 発言[未読]
【10501】Re:VBAとCallBack関数 SAU 08/8/8(金) 11:28 発言[未読]
【10502】Re:VBAとCallBack関数 neptune 08/8/8(金) 16:02 発言[未読]
【10504】Re:VBAとCallBack関数 neptune 08/8/8(金) 21:43 発言[未読]
【10506】Re:VBAとCallBack関数 SAU 08/8/11(月) 10:35 お礼[未読]

【10499】VBAとCallBack関数
質問  SAU  - 08/8/7(木) 18:41 -

引用なし
パスワード
   VBAでCallBack関数を組み込んでいます。
やりたいことは、dll(VB)を使って処理を行い、その処理の終了を待って、
次の処理をしたいのですが、うまくできません。
(処理の終了は、WindowProcのパラメータの値をチッェクすることで認識できます)

Form_Loadで、WindowProc()をサブクラス化してるのですが
Form_Load()が動いた時点で、固まってしまいます。
  →WindowProcから抜けてこない?! 

サンプルでVBのプロジェクトのソースコードを参考にしました。
VBのサンプルでは、だんまりにもならず、正常に処理の完了が拾えます。

VBプロジェクトのサブクラス化と、VBAのサブクラス化で何が違うのでしょうか。
一応、VBだとbasファイルになっているものは標準モジュールに書いています。
先に進めず、困っています。
なんでもいいのでアドバイスをよろしくお願いします。

【10500】Re:VBAとCallBack関数
発言  neptune  - 08/8/7(木) 22:17 -

引用なし
パスワード
   ▼SAU さん:
こんにちは

私にわかるかどうかは判りませんが、
>VBAでCallBack関数を組み込んでいます。
>やりたいことは、dll(VB)を使って処理を行い、その処理の終了を待って、
>次の処理をしたいのですが、うまくできません。
>(処理の終了は、WindowProcのパラメータの値をチッェクすることで認識できます)
どんな処理をしているかを書いた方が識者から良いアドバイスを受けられると
思いますよ。出来るだけソース(概要でも)も。

Form_Loadでサブクラス化しているのも引っかかります。キチンと表示後、
何らかのタイミングでサブクラスしてみたら切り分け出来るかも???

>VBプロジェクトのサブクラス化と、VBAのサブクラス化で何が違うのでしょうか。
>一応、VBだとbasファイルになっているものは標準モジュールに書いています。
>先に進めず、困っています。
>なんでもいいのでアドバイスをよろしくお願いします。
最大の違いは実行ファイル化できないことです。Accessではmdeファイルに
出来るのでものは試しで、mdeファイルにしてみたらどうですか?

ちなみにExcelではsettimerとかサブクラスは危なくて使う気がしません。

【10501】Re:VBAとCallBack関数
発言  SAU  - 08/8/8(金) 11:28 -

引用なし
パスワード
   neptuneさん、ありがとうございます。

>どんな処理をしているかを書いた方が識者から良いアドバイスを受けられると
>思いますよ。出来るだけソース(概要でも)も。

ボタンを押したら、指定したデータの音を再生し、再生が終わったら次のデータの音を再生する...という処理を作成したいのです。(テキスト合成音です)
WndProc()で終了を監視しないと、再生が終わらないうちに次の音声を再生してしまい、マズイのです。


現在のソースは

●ボタンをクリックするほうのモジュールは
Private Sub Form_Close()
  EndSubClass (Me.hWnd)
End Sub

Private Sub Form_Load()
  BeginSubClass (Me.hWnd)
End Sub

Private Sub 音声再生_Click()
  Dim r1 As Variant
  Dim Ret As String
  Dim m(10) As String
  Dim bib As Integer
  Dim tm As String
  Dim vv As String
  Dim ii As Long
  'stDocName = "FTM1"
  Dim speaker As Long
  
  Ret = 音再生初期処理() ・・・Dll内関数
  If 再生エラー() Then
    Exit Sub
  End If
 
  Ret = 音再生処理() ・・・Dll内関数
End Sub

●サブクラス化のほうは

Public Function WndProc(ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
    '読み上げ終了
   If lParam = -1 Then
     終了フラグ = True
  End If
  DefaultProc = colDProc(CStr(hWnd))
  WndProc = CallWindowProc(DefaultProc, hWnd, umsg, wParam, lParam)
End Function


Public Sub BeginSubClass(hWnd As Long)
  Static bAlready As Boolean
  Dim DefaultProc As Long
  If Not bAlready Then
    bAlready = True
    Set colDProc = New Collection
  End If
  DefaultProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc)
  colDProc.Add DefaultProc, CStr(hWnd)
End Sub

Public Sub EndSubClass(hWnd As Long)
  Dim Ret As Long
  Dim DefaultProc As Long
  DefaultProc = colDProc.Item(hWnd)
  Ret = SetWindowLong(hWnd, GWL_WNDPROC, DefaultProc)
  colDProc.Remove CStr(hWnd)
End Sub


のようにしています。

>Form_Loadでサブクラス化しているのも引っかかります。キチンと表示後、
>何らかのタイミングでサブクラスしてみたら切り分け出来るかも???

Form_Loadでサブクラス化ではなく、ボタンをクリックした時にサブクラス化も試してみたのですが、同じくWndProc()がLoopしてしまいました。

WndProc()がLoopしてしまうので、コードが間違っていると思うのですが
知識もなく、VBのサンプルに沿って書いているので、
どこが間違っているのかわかりません。

引き続き、宜しくお願いします。

【10502】Re:VBAとCallBack関数
発言  neptune  - 08/8/8(金) 16:02 -

引用なし
パスワード
   ▼SAU さん:
こんにちは

>Form_Loadでサブクラス化ではなく、ボタンをクリックした時にサブクラス化も試してみたのですが、同じくWndProc()がLoopしてしまいました。
そのように書かれていますが。。。。。サブクラス解除はフォームを閉じる時
ですから。


それと、良く判らない点
・変数「終了フラグ」 は使われているんですか?
・全てのmessageでCallWindowProcを呼んでますがそれで良いんですか?
この辺りは全体像がわかってなければなんともいえないような気がします。

【10504】Re:VBAとCallBack関数
発言  neptune  - 08/8/8(金) 21:43 -

引用なし
パスワード
   ▼SAU さん:
こんにちは

気になったので少し調べました。

>やりたいことは、dll(VB)を使って処理を行い、その処理の終了を待って、
>次の処理をしたいのですが、うまくできません。
>(処理の終了は、WindowProcのパラメータの値をチッェクすることで認識できます)
確認ですが、Access内のFormにSendMessageでlpalamでTrueを送っているんですか?

音声関係は全く知らないのですが、ActiveX Dllの方で、
>ボタンを押したら、指定したデータの音を再生し、再生が終わったら次のデータの音を
>再生する...という処理を作成したいのです。(テキスト合成音です)
>WndProc()で終了を監視しないと、再生が終わらないうちに次の音声を再生してしまい、マズイのです。
の処理をした方が何かと安全と思いますが。
・再生したい音の配列を渡すとか。
・せめて、ActiveX DLLでFormをサブクラス化するとか
(現在のソースがあるからVBなら楽チンと思います。)


【参考】
[ACC2000] マウスのホイールでフォームのレコードをスクロールできないようにする方法
h tp://support.microsoft.com/kb/278379/ja

「詳細」を読んでみて下さい。一部抜粋すると
////////////////以下引用////////////////////
Microsoft Office Visual Basic Editor 読み込み後の、ウィンドウのサブクラス化には
問題があるため、マイクロソフトは、Microsoft Visual Basic または Microsoft Visual C++
を使用して ActiveX DLL を作成し、Microsoft Access アプリケーションから DLL を参照する方法
を強く推奨します。
///////////////////////引用終わり/////////////
とされており、現在の方法は問題の有るやり方を取っていると思われます。

ちなみに、Access97からの問題で、2007は知りませんが、その前のバージョンまでは同じと
考えた方がよろしいかと思います。

【10506】Re:VBAとCallBack関数
お礼  SAU  - 08/8/11(月) 10:35 -

引用なし
パスワード
   neptune さん、ありがとうございます。

教えていただいたように、いろいろ問題もあるようなので
結局、VBのソースもあることだし
ActiveX Dllの方で、サブクラス化する方法で解決させました。
いろいろとありがとうございました。
また何かありましたら、宜しくお願いします。m(__)m

695 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078198
(SS)C-BOARD v3.8 is Free