MENU  □ MANUAL  □ 新着記事  □ 新規トピック追加  □ トピック一覧  □ SEARCH  □ 過去ログ
ログ内検索
・ キーワードを複数指定する場合は 半角スペース で区切ってください。
・ 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
・ 過去ログから探す場合は過去ログをチェック。
・ 過去ログは番号が大きいほど新しいログです。

キーワード/
検索条件/ (AND) (OR)
検索範囲(現在のログ)
(過去ログ1) (過去ログ2) (過去ログ3) (過去ログ4) (過去ログ5)
(過去ログ6) (過去ログ7) (過去ログ8) (過去ログ9) (過去ログ10)
(過去ログ11) (過去ログ12) (過去ログ13) (過去ログ14) (過去ログ15)
(過去ログ16) (過去ログ17) (過去ログ18) (過去ログ19) (過去ログ20)
(過去ログ21) (過去ログ22) (過去ログ23) (過去ログ24) (過去ログ25)
(過去ログ26) (過去ログ27) (過去ログ28) (過去ログ29) (過去ログ30)
(過去ログ31) (過去ログ32) (過去ログ33) (過去ログ34) (過去ログ35)

過去ログ23 を検索

HIT数 / 6件
NO.143081  クラス内でAddressOfに指定するプロシージャ
■投稿者/ みそじのおじさん
■投稿日/ 2011/02/07(17:37)
□URL/

クラスモジュール内で、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
++++++++++++++++++++
親記事
削除チェック/

NO.143084  Re[1]: クラス内でAddressOfに指定するプロシージャ
■投稿者/ よろずや
■投稿日/ 2011/02/07(20:05)
□URL/ http://webcache.googleusercontent.com/search?q

そんな先のことまで考えなくても...
VBAは、いつまで今のままの形で使えるのか?
APIは、いつまで今のままの形で使えるのか?
クラスじゃなくて ActiveX なんてのもあるけど。
記事NO.143081 のレス /
削除チェック/

NO.143085  Re[2]: クラス内でAddressOfに指定するプロシージャ
■投稿者/ 藤代千尋
■投稿日/ 2011/02/07(20:32)
□URL/

他に方法はないような。(^^;)

VBA のクラスって静的メソッド等を持てないから、静的メソッドのためにクラス同名の標準モジュールを作ったりはしますので、VBA ではクラス・標準モジュールがセットがいたしかたないのかも。


なにか方法を知っている人がいるかな? 私も知りたい。(^o^)
記事NO.143081 のレス /
削除チェック/

NO.143087  Re[3]: クラス内でAddressOfに指定するプロシージャ
■投稿者/ みそじのおじさん
■投稿日/ 2011/02/07(21:14)
□URL/

よろずやさん、藤代さんどうもです。

>そんな先のことまで考えなくても...
>VBAは、いつまで今のままの形で使えるのか?

それを考えると、とても不安になります。

>APIは、いつまで今のままの形で使えるのか?

64ビット版が主流になると。。。ですね

>クラスじゃなくて ActiveX なんてのもあるけど

これは、ActiveXを自作するといった事でしょうか?
一度も経験がありませんが作成できる様になるのが夢ですね。




>他に方法はないような。(^^;)

>VBA のクラスって静的メソッド等を持てないから、静的メソッドのためにクラス同名の標準モジュールを作ったりはしますので、VBA ではクラス・標準モジュールがセットがいたしかたないのかも。

識者の方に、こう言って頂けると諦めがつきますね^^
もしかしたら、識者の方々はスーパーテクニックを使って秘かに実装しているのでは?なんて思っていました^^

>なにか方法を知っている人がいるかな? 私も知りたい。(^o^)

そうですね。もう少し開けて待ってみますね。
お二方ありがとうございます。

記事NO.143081 のレス /
削除チェック/

NO.143099  Re[4]: クラス内でAddressOfに指定するプロシージャ
■投稿者/ Abyss
■投稿日/ 2011/02/08(18:05)
□URL/

お邪魔します。

不可能ではありませんが、それなりの知識を要します。
COM仕様、InLine Assemblyの知識など。

本題ではありませんが、

>With lpcf
> .lpfnHook = Address2Long(AddressOf myHookProc)

の部分は、

With lpcf
.lpfnHook = VBA.CLng(AddressOf myHookProc)

で自作関数の省略が可能です。


この記事にはVBAのコードが含まれています。

緑の太文字→注釈
茶色の太文字→条件分岐
赤の太文字→ループ
青の太文字→その他
記事NO.143081 のレス /
削除チェック/

NO.143103  Re[5]: クラス内でAddressOfに指定するプロシージャ
■投稿者/ みそじのおじさん
■投稿日/ 2011/02/08(21:32)
□URL/

Abyssさん、レスありがとうございます。

>不可能ではありませんが、それなりの知識を要します。
>COM仕様、InLine Assemblyの知識など。

3つのキーワードをググってみましたが、一筋縄でくような物でないですね^^;
例えば、VB中学校の
ht tp://homepage1.nifty.com/rucio/main/dotnet/technique/teq2_COM.htm
のこの様な所を見てきました。

VBAの知識だけでは、まったく歯が立たないような感じですね。


mougでの熊谷さんと、Abyssさんのやり取りで
ht tp://www.moug.net/faq/viewtopic.php?t=56086
ここも見ていましたが、まったく話についていけず、、

熊谷さんやAbyssさんのように、あのようなコードをスラスラ書けるようなスキル
をもっていないと相当厳しいんでしょうね。
私には、当分先の話になりそうです。

今回は、クラスと同名の標準モジュールで管理する方法で進みたいと思います。
みなさま、ありがとうございました。

#VBA.Longの件ありがとうございます。

#私が質問させて頂いている間隔は不定期ですが、こうやってみなさまと
お話が出来るのを楽しみにして質問させて頂いておりますので、何か
ありましたらよろしくお願い致します^^



この記事にはVBAのコードが含まれています。

緑の太文字→注釈
茶色の太文字→条件分岐
赤の太文字→ループ
青の太文字→その他
記事NO.143081 のレス / END
削除チェック/


パスワード/

- Child SEARCH -