Note

kamiyuiは 尽くして捧げて 貢いでも 今なお遠き 修業の道 辛之奏上

全体表示

[ リスト ]

 親知らず子知らず。親の上に載っているだけで子だと言えるだろうか。

本当の子であるならば、親から離れて動き回ることが出来るのではないか。

親が前面に出る事を主張したとき、子の訴えが見えなくなる。

本当の親と子の関係であるとは、いえないに違いない。

良妻賢母さんはつぶやく。「親の命有っての子供の命。」

意味はわからない。わかったような気にはなる?

不気味で複雑な呟きだ。なんと言っても、うちの母ちゃんの声は

低くてドスが効いている。

「怖い。まさしく恐怖だ。事の善悪、正誤など関係ない。メンドクサイ。。」

今回は、親であるか子であるか。親子関係の検証方法を見てみたいと思う。

もしかしたら? 失礼。言葉が足らなかったのかもしれない。

Excel UserForm と そのコントロールツールとの親子関係の有無を

検証してみようと思う。


EnumChildWindows by Excel


 Excel UserForm は Windows ですが、そのコントロールツールは

Windows ではないと言われています。VBやDelphi,.Netframework などの

統合開発環境では、UserForm や そのコントロールに似た機能は

Windowsとして定義されています。そのためでしょうか。Excelで UserFormをTopMostに

すると、コントロールのツールチップは隠れてしまいます。

これは、一つの格差です。差別なのでしょうか。区別だといっています。

 話をExcel UserForm に戻します。もしもコントロールがWindowsであるとしたら、

UserFormの子のWindowsとして定義されているなら、各々のコントロールも

クラス名を持っているはずです。今回は VBA と Win32API の中から

EnumChildWindows 関数を使って、子Windowのクラス名の有無を確認し、

UserFormとコントロールの親子関係の有無を見ていきたいと思います。

(1)EnumChildWindows


 EnumChildWindowsは指定された親ウィンドウに属する子ウィンドウを列挙します。

この関数を呼び出すと、子ウィンドウのハンドルが順々にアプリケーション定義の

コールバック関数に渡されます。等等とあります。


この関数の定義を見てみましょう。

BOOL EnumChildWindows(
  HWND hWndParent,         // 親ウィンドウのハンドル
  WNDENUMPROC lpEnumFunc,  // コールバック関数へのポインタ
  LPARAM lParam            // アプリケーション定義の値
   );
   
なるほど。よくわかりません。ただ、親ウィンドウのハンドルと

コールバック関数へのポインタが必要なことは、わかります。

親Windowのハンドルは、そのクラス名がわかれば、FindWindow関数から求めることが

出来ます。クラス名は、昨日EnumWindows関数から求めましたので、

この値を使うことにします。

次に、コールバック関数であるEnumChildProc 関数の定義を見てみましょう。

BOOL CALLBACK EnumChildProc(
	HWND hwnd,      // 子ウィンドウのハンドル
	LPARAM lParam   // アプリケーション定義の値
   );
   
   

(2)VBAの関数への変換


 それぞれの関数をVBAで呼び出す定義を見てみましょう。

'EnumChildWindowsの定義
Declare Function EnumChildWindows Lib "USER32" _
	(ByVal hWndParent As Long, _
	ByVal lpEnumFunc As Long, _
	ByVal lParam As Long) As Long

'FindWindowの定義
Declare Function FindWindow Lib "USER32" _
	Alias "FindWindowA" _
	(ByVal lpClassName As String, _
	ByVal lpWindowName As String) As Long

次に、コールバック関数であるEnumChildProc 関数を

関数としてどのように定義して使えばよいか、見てみましょう。

Public Function EnumChildProc _
	(ByVal hWnd As Long, ByVal lParam As Object) As Long
	
End Function

(3)クラスの列挙2


 昨日作成したUserForm クラスの列挙 を 先ずEnumWindowsを使い

表示されているWindowsのクラス名を求め、その中から、任意のクラス名を選択し、

そのWindowの子クラスをEnumChildWindowsで求めるように、

クラスの列挙2として作り直してみました。結論から言います。

これを用いて、UserFormのクラス名から子Windowsを探ってみると、

コントロールのクラス名もキャプションも帰ってきませんでした。

すいません。今回はここまでとさせてもらいます。

次回、VBAの中で実際どのようなマクロを記述しているか見ていきたい

と思います。

イメージ 1


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事