■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#577-2フォルダ選択ダイアログの表示なっちゃん2003-08-26(火) 19:13
     #578-2RE#577:フォルダ選択ダイアログの表示K.J.K.2003-08-26(火) 19:31
     #582-2RE#577:フォルダ選択ダイアログの表示なっちゃん2003-08-27(水) 08:43
     #585-2RE#582:フォルダ選択ダイアログの表示Fより2003-08-27(水) 10:26
     #587-2RE#577:フォルダ選択ダイアログの表示なっちゃん2003-08-27(水) 11:34
     #590-2RE#587:フォルダ選択ダイアログの表示匿名5902003-08-27(水) 14:40
     #592-1RE#590:フォルダ選択ダイアログの表示なっちゃん2003-08-27(水) 15:47
     #600-3RE#592:フォルダ選択ダイアログの表示匿名6002003-08-28(木) 09:59
     #616-3RE#600:フォルダ選択ダイアログの表示なっちゃん2003-08-28(木) 17:14
     #619-3RE#616:フォルダ選択ダイアログの表示匿名6192003-08-28(木) 17:50
     #622-2RE#619:フォルダ選択ダイアログの表示なっちゃん2003-08-28(木) 21:03
#577-2
フォルダ選択ダイアログの表示
お世話になっています、なっつです。
現在、SHBrowseForFolder関数を用いて、フォルダ選択ダイアログを
表示させています。
現在、困っていることは、初期フォルダの設定です。
ローカルドライブにおいては、できるのですが、ネットワーク上の
共有フォルダの初期設定ができません。
"\\"からはじまるパスだとうまくいかないみたいです。
どうやったらフルパス名を取得することができるのでしょうか?

VisualC++ではできるみたいなのですが、VCでいう【LPSHELLFOLDER】が
VBでは、何になるのか分かりません。
VBでは、できないことなのでしょうか?

以上です。よろしくお願いします。
#578-2
RE#577:フォルダ選択ダイアログの表示
VB5以降ならIShellFolderも利用できますが、別にこれを使わなくても
可能だと思われます。
http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/FldrDlg.lzh
#582-2
RE#577:フォルダ選択ダイアログの表示
K.J.Kさん、回答ありがとうございます。
IShellFolderを使用した、VCでのソースの
サンプルならみつけたのですが、VBで、
IShellFolderを使用するとしたら、どのように
宣言をすればよいのでしょうか?

http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/FldrDlg.lzh を
見せていただきましたが、クラスモジュールなど、使用したことがないので、
できれば、APIでフォルダ選択ダイアログの表示をしたいのですが・・・。

よろしくお願いします。
#585-2
RE#582:フォルダ選択ダイアログの表示
> http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/FldrDlg.lzh を
> 見せていただきましたが、クラスモジュールなど、使用したことがないので、
> できれば、APIでフォルダ選択ダイアログの表示をしたいのですが・・・。

VB中級者以上だったら誰でも知ってる定番サイト
このサイトはブックマーク入り決定ですね。
http://www.vbvbvb.com/jp/

そのサイト中に・・・
http://www.vbvbvb.com/jp/gtips/0951/gSHBrowseForFolder.html
#587-2
RE#577:フォルダ選択ダイアログの表示
Fよりさん、回答ありがとうございます。

> VB中級者以上だったら誰でも知ってる定番サイト
> このサイトはブックマーク入り決定ですね。
> http://www.vbvbvb.com/jp/
> 
> そのサイト中に・・・
> http://www.vbvbvb.com/jp/gtips/0951/gSHBrowseForFolder.html

このサンプルは、フォルダ選択ダイアログを表示するだけのものでしょうか?
フォルダ選択ダイアログを表示し、ローカルドライブでの初期ドライブ設定は
できるのですが、ネットワークドライブのなかのフォルダの初期設定の方法が
分かりません。

APIを使用(自作クラスとかは使用せずに⇒クラスを作ったことがないので、
                    難しくて分かりません。また、
                    あまり時間がないので、理解するまでに
                    時間がかかってしまいそうなので…)
するだけで、できる方法をご存知でしたら教えて頂きたいと思います。
VBでネットワークコンピュータのフルパスを取得するのではなく、
VCでフルパス取得関数DLLを作成した方が良いのでしょうか?
#590-2
RE#587:フォルダ選択ダイアログの表示
> フォルダ選択ダイアログを表示し、ローカルドライブでの初期ドライブ設定は
> できるのですが、ネットワークドライブのなかのフォルダの初期設定の方法が
> 分かりません。

そこまでできていれば、
デフォルトのフォルダをネットワークドライブ内のフォルダへ設定できるはずです。

何をどうしてどうなったのかしら?
どんなコードを書いていますか?
ネットワークドライブ内のフォルダを指定したら何が起きますか? 
「○○というエラーが出る」など具体的な症状を書いてください。
#592-1
RE#590:フォルダ選択ダイアログの表示
ご回答ありがとうございます。
 
> そこまでできていれば、
> デフォルトのフォルダをネットワークドライブ内のフォルダへ設定できるはずです。
> 
> 何をどうしてどうなったのかしら?
> どんなコードを書いていますか?
> ネットワークドライブ内のフォルダを指定したら何が起きますか? 
> 「○○というエラーが出る」など具体的な症状を書いてください。

デフォルトのフォルダをネットワークドライブ内のフォルダへ設定しているのですが、
フォルダ選択ダイアログから取得できるネットワークドライブのパス名が
例)"¥¥ワークグループ名−コンピュータ名¥共有フォルダ名¥フォルダ名"
となってます。
¥¥ワークグループ名−コンピュータ名の個所が略されてしまっているため、
うまく初期フォルダの指定ができていません。
しかし、取得したパス名を認識できるフルパス名にする方法が分からないのです。
コードを下に記述します。長くなってしまいましたが、宜しくお願いします。

//コード
/*API宣言*/
'pidlRootの定数
' デスクトップ
Public Const CSIDL_DESKTOP = &H0         
'ulFlags
' ディレクトリリのみ選択可能
Public Const BIF_RETURNNONLYFSDIRS = &H1 

' 文字最大数
Public Const MAX_PATH As Long = 260      
' ユーザーが定義できるメッセージ
' 使用領域を表すだけでこれ自体に意味はない
Public Const WM_USER = &H400             
' ダイアログの初期化終了、lParamはNULL
Public Const BFFM_INITIALIZED = 1        
' 選択が変更された。lParamは新しく選択されたフォルダのID
Public Const BFFM_SETSELECTIONA = (WM_USER + 102)
     
'----- フォルダセレクトダイアログ
Type BROWSEINFO
    hwndOwner As Long        'ダイアログボックスの親ウィンドウハンドル
    pidlRoot As Long         'ルートフォルダを指定する
    pszDisplayName As String 'ユーザが選択したフォルダ名(MAX_PATHを使用)
    lpszTitle As String      'ダイアログボックスの表示するコメント文
    ulFlags As Long          '動作方法を指定する定数の組み合わせ(不用のとき0)
    lpfn As Long             'コールバック関数へのポインタ
    lParam As Long           '同、パラメータ
    iImage As Long     'フォルダ用アイコンのシステムイメージリストのID(不用のとき0)
End Type

' フォルダ指定ダイアログを表示するAPI
Public Declare Function SHBrowseForFolder Lib "shell32.dll" _
(lpBrowseInfo As BROWSEINFO) As Long
' アイテム識別子のリストをシステムパスへ変換するAPI
Public Declare Function SHGetPathFromIDList Lib "shell32.dll" _
(ByVal pidl As Long, ByVal pszPath As String) As Long
' メッセージの送信API
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wmsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
' メモリ操作用API
Public Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal length As Long)

/*標準モジュール*/
'-------------------------------------------------------------------------
'   SHBrowseForFolderのコールバック関数
'
'   Deliver Value   :   ByVal hWnd As Long               →      ウィンドウハンドル
'                   :   ByVal uMsg As Long               →      コールバックメッセージ
'                   :   ByVal lParam As Long             →      wParam
'                   :   ByVal lpData As Long             →      ID
'   Return Value    :   Long                             →      Long型アドレス値
'-------------------------------------------------------------------------
Public Function BrowseCallbackProc(ByVal hWnd As Long, _
ByVal uMsg As Long, ByVal lParam As Long, ByVal lpData As Long) As Long
    
'----- 変数定義 -----
    Dim wStrPath As String ' 作業変数
    
'----- ダイアログの初期化が完了した時にパラメータにセットされているフォルダを指定する
       メッセージをWindowsに送信 -----
    If uMsg = BFFM_INITIALIZED Then ' メッセージ:初期化なら
        
        wStrPath = String(MAX_PATH, vbNullChar) ' バッファ初期化
        ' ポインタから文字列の取得
        Call CopyMemory(ByVal wStrPath, ByVal lpData, MAX_PATH) 
        If InStr(wStrPath, vbNullChar) > 0 Then
            ' パス名取得    
            wStrPath = Left(wStrPath, InStr(wStrPath, vbNullChar) - 1)  
        End If
        ' フォルダを選択 (1:フォルダのパス名へのポインタ)
        Call SendMessage(hWnd, BFFM_SETSELECTIONA, True, ByVal wStrPath)                
    End If
End Function

'-------------------------------------------------------------------------------
'   アドレス変換処理
'
'   Deliver Value   :   ByVal pFunction As Long     →   コールバック関数のアドレス値
'   Return Value    :   Long                        →   Long型アドレス値
'---------------------------------------------------------------------------------
Public Function GetPointerOfFunction(ByVal pFunction As Long) As Long
    
'----- AddressOf関数で得たコールバック関数のアドレスをLong値に変換 -----
    GetPointerOfFunction = pFunction
    
End Function


'-------------------------------------------------------------------------
'   フォルダセレクトダイアログ処理
'
'   Deliver Value   :   ByVal wFormH   As Long         →      フォームハンドル
'                   :   ByVal set_path As String       →      初期パス名
'   Return Value    :   String                         →      セレクトパス
'-------------------------------------------------------------------------
Public Function FileFolderDlg(ByVal wFormH As Long, _
ByVal set_path As String) As String

'----- 変数定義 -----
    Dim get_path As String       ' 戻り値変数
    Dim udtBrows As BROWSEINFO   ' 構造体
    Dim wPath As String          ' 取得パス名
    Dim rtn As Long              ' 戻り値
    Dim strPathA As String       ' 作業変数

    FileFolderDlg = set_path     ' 取得できなかった場合の対策(前のフォルダ名)
    
'----- パラメータ用にANSI形式の文字列を変数に保存 -----
    If InStr(set_path, "\") = 0 Then   ' ドライブのみの場合、"\"をつける
        set_path = set_path & "\"
    End If
    ' パラメータ用ANSI形式文字列
    strPathA = StrConv(set_path & vbNullChar, vbFromUnicode)

'----- 構造体設定 -----
    With udtBrows
        .hwndOwner = wFormH                        ' ウィンドウハンドル
        .pidlRoot = CSIDL_DESKTOP                  ' ルート:デスクトップ
        .pszDisplayName = String(MAX_PATH, vbNullChar)  ' 初期化
        .lpszTitle = ""                            ' タイトル:Save Folder
        .ulFlags = BIF_RETURNNONLYFSDIRS           ' ディレクトリリのみ選択可能
        ' コールバック関数へのポインタ
        .lpfn = GetPointerOfFunction(AddressOf BrowseCallbackProc)
        .lParam = StrPtr(strPathA)                 ' コールバック関数へのパラメータ
        .iImage = 0                                ' ID:不要
    End With
    
    rtn = SHBrowseForFolder(udtBrows)              ' フォルダ選択ダイアログ表示
    wPath = String(MAX_PATH, vbNullChar)           ' 初期化
    If rtn <> 0 Then                               ' キャンセル ?(戻り値=0は
                                                     キャンセルボタンが押された)
        Call SHGetPathFromIDList(rtn, wPath)              ' 選択されたパス名取得
        wPath = Left(wPath, InStr(wPath, vbNullChar) - 1) ' NUll除去
        get_path = wPath                                  ' 戻り値-パス名
    Else
        get_path = ""                                     ' 戻り値-空文字
    End If
    
'----- 戻り値 -----
    FileFolderDlg = get_path

End Function

/*呼び出し側*/
Private Sub CommandBtuun_Click()
   
   Dim path_name As String

   path_name = Form1.Text1.text 
   path_name = FileFolderDlg(Me.hWnd, path_name)
End Sub
#600-3
RE#592:フォルダ選択ダイアログの表示
 
> デフォルトのフォルダをネットワークドライブ内のフォルダへ設定しているのですが、
> フォルダ選択ダイアログから取得できるネットワークドライブのパス名が
> 例)"¥¥ワークグループ名−コンピュータ名¥共有フォルダ名¥フォルダ名"
> となってます。
> ¥¥ワークグループ名−コンピュータ名の個所が略されてしまっているため、
> うまく初期フォルダの指定ができていません。
> しかし、取得したパス名を認識できるフルパス名にする方法が分からないのです。
> コードを下に記述します。長くなってしまいましたが、宜しくお願いします。
> 

コードをコピペして実行してみたところ、うちの環境では、
"¥¥ワークグループ名−コンピュータ名¥共有フォルダ名¥フォルダ名"
が取れてきています。

Private Sub Command_Click()
   
  Dim path_name As String

  path_name = Form1.Text1.Text
  path_name = FileFolderDlg(Me.hWnd, path_name)

  If path_name <> "" Then
    Form1.Text1.Text = path_name
  End If

End Sub

もしかして、こういうことですか?

うちの環境は、windows2000 VB6 SP5 です。
#616-3
RE#600:フォルダ選択ダイアログの表示
匿名600 さん、ご回答どうもありがとうございます。


> コードをコピペして実行してみたところ、うちの環境では、
> "¥¥ワークグループ名−コンピュータ名¥共有フォルダ名¥フォルダ名"
> が取れてきています。
> 
> Private Sub Command_Click()    
>   Dim path_name As String
> 
>   path_name = Form1.Text1.Text
>   path_name = FileFolderDlg(Me.hWnd, path_name)
> 
>   If path_name <> "" Then
>     Form1.Text1.Text = path_name
>   End If
> End Sub
> 
> もしかして、こういうことですか?
> うちの環境は、windows2000 VB6 SP5 です。

コードをコピー、実行して頂き、ありがとうございます。
私の環境も匿名600 さんと同じ環境です。

匿名600 さんがコードを実行した時、
Text1 に書かれてあるフォルダが青く選択されていましたでしょうか?

私が実現したいことは、、"マイネットワーク"上にあるフォルダを
取得(コードを実行すると、path_nameには 
"¥¥ワークグループ名−コンピュータ名¥共有フォルダ名¥フォルダ名"が
代入されるはずです)し、再度ダイアログを開いたときに、
Text1 に書かれてあるフォルダが青く選択されているという状態です。

前回記述したコードでは、ローカルドライブ上でのフォルダやドライブでなら、
選択したフォルダが、次にダイアログを開いたときに青く選択されています。
ただ、ネットワーク上のフォルダだと、できません。
【¥¥ワークグループ名−コンピュータ名】に原因があり、このパス名は、
\\の部分が略されたもののようです。
(C:\----\----\----\ … \共有フォルダ名¥フォルダ名)を取得できれば
実現できそうなのですが、
この"¥¥ワークグループ名−コンピュータ名¥共有フォルダ名¥フォルダ名"から、
実際の正確なパス名の取得方法がわかりません。

長くなりましたが、分かるようでしたら、方法を教えて頂きたいと思います。
宜しくお願いします。


#619-3
RE#616:フォルダ選択ダイアログの表示
匿名600です。

> 匿名600 さんがコードを実行した時、
> Text1 に書かれてあるフォルダが青く選択されていましたでしょうか?

前回というか、Text1に表示されたフォルダが青く選択された状態になってました。
どこを選んでも、何回やっても、ダイアログを開くと、Text1の場所が青く選択されています。

ちなみに、階層でいうと、
マイネットワーク>自分のワークグループ>クライアントPC>フォルダ1
マイネットワーク>自分のワークグループ>クライアントPC>フォルダ1>フォルダ2

マイネットワーク>他のワークグループ>クライアントPC>フォルダ1
マイネットワーク>他のワークグループ>クライアントPC>フォルダ1>フォルダ2

いずれも青く選択されてました。

Text1の表示は \\ から始まってます。

的外れな回答でしたらすみません、、。
#622-2
RE#619:フォルダ選択ダイアログの表示
匿名619さん、ご回答どうもありがとうございます。

 もう一度、プログラムを動かしてみました。
 匿名619さんからの前回のご指示通り、
 Private Sub Command_Click()    
    Dim path_name As String
 
    path_name = Form1.Text1.Text
    path_name = FileFolderDlg(Me.hWnd, path_name)
 
    If path_name <> "" Then
      Form1.Text1.Text = path_name
    End If
 End Sub

 と、ソースも書き直してみました。

> 前回というか、Text1に表示されたフォルダが青く選択された状態になってました。
> どこを選んでも、何回やっても、ダイアログを開くと、Text1の場所が青く選択されています。
> 
> ちなみに、階層でいうと、
> マイネットワーク>自分のワークグループ>クライアントPC>フォルダ1
> マイネットワーク>自分のワークグループ>クライアントPC>フォルダ1>フォルダ2
> 
> マイネットワーク>他のワークグループ>クライアントPC>フォルダ1
> マイネットワーク>他のワークグループ>クライアントPC>フォルダ1>フォルダ2
> 
> いずれも青く選択されてました。

 私の環境では、ワークグループは複数(5個)あり、
 自分のワークグループは、エクスプローラでみると、
 3番目にあたります。

 実行結果は、私の場合、
  マイネットワーク>自分のワークグループ>クライアントPC>フォルダ1>フォルダ2
 と
  マイネットワーク>自分のワークグループ>クライアントPC>フォルダ1>フォルダ2
 では、青く選択されており、
  マイネットワーク>他のワークグループ>クライアントPC>フォルダ1
 では、選択されませんでした。

 また、
  マイネットワーク>他のワークグループ>クライアントPC>フォルダ1
 の場合、他のワークがエクスプローラで見て、
 1番目のワークグループでは、青く選択され、2番目以降のものはダメでした。

 匿名619さんのネットワークの環境は、いかがでしょうか?
 匿名619さんが使用したプログラムを参考にしたいのですが、
 プログラム(ソース)を頂くことは可能でしょうか?

以上です。宜しくお願いします。

お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)