クラスモジュール内で、API呼び出す時にプロシージャへのポインタが必要 な時は(AddressOf演算子使用)クラス単体での処理は諦めないといけないので しょうか?
概要
クラス単体で(標準モジュールを使用しないで)APIでフォント設定のダイアログ を表示する機能を実装したい。 (フォント選択のダイアログを呼出すAPIをラッパーしたい。)
問題点
APIでフォントの設定をするダイアログを呼ぶには、tagCHOOSEFONT構造体への設定 が必要ですが
tagCHOOSEFONT構造体
Private Type tagCHOOSEFONT lStructSize As Long hwndOwner As Long hDC As Long lpLogFont As Long iPointSize As Long flags As Long rgbColors As Long lCustData As Long ※lpfnHook As Long 'ユーザー定義のフックプロシージャへのポインタ lpTemplateName As String hInstance As Long lpszStyle As String nFontType As Integer MISSING_ALIGNMENT As Integer nSizeMin As Long nSizeMax As Long End Type
※部の設定にはAddressOf演算子を使用して標準モジュール内にあるフック プロシージャへのポインタを設定しなければいけません。
実際には、 .lpfnHook = AddressOf myHookProc とは書けませんので、アドレスをLong型に 変換するFunctionを一発通しています。
'クラス側 With lpcf .lpfnHook = Address2Long(AddressOf myHookProc)
'標準モジュール側 Public Function Address2Long(Byval TargetProcAddress As Long) As Long Address2Long = TargetProcAddress End Function
Public Function myHookProc(ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '処理 End Function
AddressOfのヘルプには指定できるプロシージャは、「標準モジュールにある事」 と制限がありますので、今の作りではクラスと標準モジュールをセットにして管理 していかなければいけません。出来るのならばクラス一つで実現したいのです。 (今はいいですが、数年後まで覚えている自信がありません^^;)
クラスの使用イメージはこの様な具合です。 Private Sub FontSettingProc()
Dim myFontDialog As clsFontDialog
Set myFontDialog = New clsFontDialog With myFontDialog
.Show 'Showメソッドを作り API ChooseFontを呼出す IF .Selected Then 'OKボタンを押してダイアログを閉じたら
Debug.Print .FontName '各種フォントのプロパティを作成しておく Debug.Print .FontSize ・・・・ Debug.Print .FontUnderLine
'DBへ登録 'iniファイルへ登録 'レジストリへ登録 '隠しシートに登録 など、その事案に最適な場所に保存 Else End IF End With Set myFontDialog = Nothing
End Sub
これからも色々なプロジェクトを作成する祭に、「このクラスはこの標準モジュー ルがないとダメ、このUserFormはこの標準モジュールがなければ動かない」という 事を極力排除しようとしています。端的にいいますと、インポートさえすればそれ 単体で動く物を目指しています。(excelのみならず、accessなどでも使用出来る 様に)
クラス内に、AddressOfに指定するプロシージャを置くトリッキーな手法、 又は代替策などありましたらアドバイス頂けると幸いです。
#「それは、贅沢な悩みだ」「それは無理だわ」とかの突っ込みでもかまいません^^; 出来ないと言われなければ諦めがつかないもので、、
C/C++も多少かじった事がありますので「ポインタのポインタ」辺りまでは理解し ているつもりですが、応用がなかなか利きませんね^^;
この記事にはVBAのコードが含まれています。
緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他
++++++++++++++++++++ OS ⇒Windows XP Version⇒Excel 2003 ++++++++++++++++++++ |