標準モジュールでのMeキーワードの使用方法

解決


中年M  2007-11-14 15:44:00  No: 138122  IP: 192.*.*.*

VB6+VISTA
マイドキュメントフォルダー名をResult = SHGetSpecialFolderPath(Me.hWnd, lpszPath, nFolder, 0)のように使って取得しようとし、Form1にCommand1ボタンを付けて試しましたところ上手く取得でしました。これをSub Main()で取得したいのですが「Meキーワードの使用方法が不正です」というメッセージが出てしまいます。このような場合Me.hWndをどのように書けば良いか教えてください。

編集 削除
魔界の仮面弁士  2007-11-14 16:01:18  No: 138123  IP: 192.*.*.*

対象となる親ウィンドウのハンドルであれば、何でも良いと思いますよ。

とりあえず、Screen から ActiveForm を得ても良いでしょうし、
フォームが無いなら、デスクトップウィンドウでも良いでしょうし。

編集 削除
中年M  2007-11-14 17:00:04  No: 138124  IP: 192.*.*.*

お返事をありがとうございます。
実はハンドルというものを理解していないため今まではどこかのフォームモジュールにMe.hWndと書いていたのですが今回は立ち上げ時に取得する必要が出てきてこの質問をさせていただきました。
>とりあえず、Screen から ActiveForm を得ても良いでしょうし、
>フォームが無いなら、デスクトップウィンドウでも良いでしょうし。
勉強不足で申し訳ありませんが具体的にどのように書けば良いのか教えてください。

編集 削除
通ってみた  2007-11-15 08:52:20  No: 138125  IP: 192.*.*.*

具体的にどのように調べてわからなかったのか教えてください

例:「vb ActiveForm」で検索して全て見たが希望する情報が得られなかった

編集 削除
中年M  2007-11-15 11:03:51  No: 138126  IP: 192.*.*.*

通ってみた様  勉強不足ですみませんが今まで何日も、何度もやってわからなかったもので質問させてもらったものです。

第一段階:  GetSpdecialFolderを見つけましたがこれでは3種しか見つけられないようでした。
第2段階:  SHGetSpecialFolderPath  発見。  Form1でテストの結果取得成功。  しかしSubMain()では不可。
第3段階:  上記不成功のキーワードはハンドル。(VB6  ハンドル)http://homepage1.nifty.com/rucio/main/tyukyu/tyukyu4.htm
いじってみましたがこれはどうやら線を引くためのものらしいのであきらめました。

ここで質問しましたが回答はやはり「ハンドル」がネック。そこで再質問させてもらいました。

このサイトで数日前の他の質問を見ていたら「TemporalyFolder取得」がありました。そこには

Const ssfINTERNETCACHE As Long = &H20
MsgBox CreateObject("Shell.Application").NameSpace(ssfINTERNETCACHE).Self.Path

これをいじって  MyDocFolder = CreateObject("Shell.Application").NameSpace(&H5).Self.Path
としたら結果はオーライでした。

しかしこれからのこともありますので「ハンドル」の疑問についてお教えください。

編集 削除
通ってみた  2007-11-15 16:21:13  No: 138127  IP: 192.*.*.*

ウインドウハンドル、つまりフォーム画面の管理番号のようなものですよね
標準モジュールはフォーム画面がありませんよね
画面がないのにMeと言われても、Windowsは困る訳です

適当なフォームをつくってそいつに処理を渡すのが一番簡単なのではないでしょうか

質問タイトル、質問内容は、自分の知りたいことを書かなければ、最後になって「自分が知りたいのはそんなことじゃない」と言い出されて困るので、気をつけてください

例:ハンドルとは
  :ハンドルというものの概念がわかりません
答:「vb ハンドル」で検索してください

編集 削除
中年M  2007-11-15 17:59:22  No: 138128  IP: 192.*.*.*

了解しました。(VB6  ハンドル)などで調べても分からなかったので質問させていただいたものです。質問の内容は最初の質問のSubMain()でMe.hWndというのをどう書くか、に尽きます。

結論はハンドルとはFormに対応するものなのでFormが必要。従って適当なFormを作ってそこで処理させる、というものと理解しました。魔界の仮面弁士様のアイデア  
>フォームが無いなら、デスクトップウィンドウでも良いでしょうし。

Formを作らないでできるのであれば具体的にどんなことをすれば良いのかも知りたかったですがとりあえずの問題は解決したものとして解決のチェックをいれさせていただきました。ご回答をありがとうございました。

編集 削除
魔界の仮面弁士  2007-11-15 18:37:17  No: 138129  IP: 192.*.*.*

> デスクトップウィンドウでも良いでしょうし。
この場合は、GetDesktopWindow という API 関数で取得できます。
# まぁ、0 を指定しても動きはするのですが。


> 結論はハンドルとはFormに対応するものなのでFormが必要。
今回のハンドルはそうですが、すべてのハンドルが Form に対応するわけではありません。

一口にハンドルといっても、実際には
  1. ウィンドウ ハンドル ← 今回必要となっているもの
  2. デバイスコンテキスト ハンドル
  3. ビットマップ ハンドル
  4. アイコン ハンドル
などなど、非常に多くの種類のハンドルがあります。
(その他、ファイルハンドル、インターネットハンドル、プロセスハンドルなど)

たとえば 1 は、ウィンドウの管理番号を意味します。
VB6 で言えば、ウィンドウ要素(Form, TextBox など)の hWnd プロパティに相当します。

2 は、プリンタや画面など、描画先のキャンパスを監理するIDです。
VB6 でいえば、Form, Printer などの hDC プロパティにあたります。

3 や 4 は、画像オブジェクトに対するものです。
VB6 でいえば、Picture オブジェクトの Handle プロパティです。

編集 削除
GOD  2007-11-15 19:46:48  No: 138130  IP: 192.*.*.*

>画面がないのにMeと言われても、Windowsは困る訳です
>
画面がなくても Me キーワードは使用できますよ。(クラスとかね。)
詳しくは「Meキーワードの使用方法が不正です」が出たときにヘルプボタンを
クリックすれば説明が出るはずです。

編集 削除
中年M  2007-11-16 11:19:42  No: 138131  IP: 192.*.*.*

魔界の仮面弁士さま  的確、明解なるご回答をありがとうございました。GetDesktopWindowでMe.hWndに代わるものを取得でき,これによりSubMain()でマイドキュメントのフォルダー名が取得ました。

'/////////////
'特殊フォルダのパスを取得する    'Public Declare Function SHGetSpecialFolderPath Lib "SHELL32" _
    Alias "SHGetSpecialFolderPathA" (ByVal hwndOwner As Long, _
    ByVal lpszPath As String, ByVal nFolder As Long, _
    ByVal fCreate As Long) As Long

    '//Public Declare Function GetDesktopWindow Lib "USER32" () As Long

'//////////////////////////
    Dim DThandle As Long
    Dim lpszPath As String
    Dim MyDocFolder As String

    
    DThandle = GetDesktopWindow
    
    'パス名を受け取るバッファを確保
    
    lpszPath = String$(260, vbNullChar)

    '関数の実行

    RET = SHGetSpecialFolderPath(DThandle, lpszPath, &H5, 0)
    MyDocFolder = Left$(lpszPath, InStr(lpszPath, vbNullChar) - 1)

またハンドルの種類は沢山あることなどの解説をありがとうございました。色々調べてもまず沢山ある見かけない用語の理解からつまづいてしまいますがこれを機に理解のきっかけにしたいと思います。ありがとうございました。

編集 削除