■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
|
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(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
#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
なっちゃん2003-08-26(火) 19:13
お世話になっています、なっつです。 現在、SHBrowseForFolder関数を用いて、フォルダ選択ダイアログを 表示させています。 現在、困っていることは、初期フォルダの設定です。 ローカルドライブにおいては、できるのですが、ネットワーク上の 共有フォルダの初期設定ができません。 "\\"からはじまるパスだとうまくいかないみたいです。 どうやったらフルパス名を取得することができるのでしょうか? VisualC++ではできるみたいなのですが、VCでいう【LPSHELLFOLDER】が VBでは、何になるのか分かりません。 VBでは、できないことなのでしょうか? 以上です。よろしくお願いします。
K.J.K.2003-08-26(火) 19:31
VB5以降ならIShellFolderも利用できますが、別にこれを使わなくても 可能だと思われます。 http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/FldrDlg.lzh
なっちゃん2003-08-27(水) 08:43
K.J.Kさん、回答ありがとうございます。 IShellFolderを使用した、VCでのソースの サンプルならみつけたのですが、VBで、 IShellFolderを使用するとしたら、どのように 宣言をすればよいのでしょうか? http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/FldrDlg.lzh を 見せていただきましたが、クラスモジュールなど、使用したことがないので、 できれば、APIでフォルダ選択ダイアログの表示をしたいのですが・・・。 よろしくお願いします。
Fより2003-08-27(水) 10:26
> 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
なっちゃん2003-08-27(水) 11:34
Fよりさん、回答ありがとうございます。 > VB中級者以上だったら誰でも知ってる定番サイト > このサイトはブックマーク入り決定ですね。 > http://www.vbvbvb.com/jp/ > > そのサイト中に・・・ > http://www.vbvbvb.com/jp/gtips/0951/gSHBrowseForFolder.html このサンプルは、フォルダ選択ダイアログを表示するだけのものでしょうか? フォルダ選択ダイアログを表示し、ローカルドライブでの初期ドライブ設定は できるのですが、ネットワークドライブのなかのフォルダの初期設定の方法が 分かりません。 APIを使用(自作クラスとかは使用せずに⇒クラスを作ったことがないので、 難しくて分かりません。また、 あまり時間がないので、理解するまでに 時間がかかってしまいそうなので…) するだけで、できる方法をご存知でしたら教えて頂きたいと思います。 VBでネットワークコンピュータのフルパスを取得するのではなく、 VCでフルパス取得関数DLLを作成した方が良いのでしょうか?
匿名5902003-08-27(水) 14:40
> フォルダ選択ダイアログを表示し、ローカルドライブでの初期ドライブ設定は > できるのですが、ネットワークドライブのなかのフォルダの初期設定の方法が > 分かりません。 そこまでできていれば、 デフォルトのフォルダをネットワークドライブ内のフォルダへ設定できるはずです。 何をどうしてどうなったのかしら? どんなコードを書いていますか? ネットワークドライブ内のフォルダを指定したら何が起きますか? 「○○というエラーが出る」など具体的な症状を書いてください。
なっちゃん2003-08-27(水) 15:47
ご回答ありがとうございます。 > そこまでできていれば、 > デフォルトのフォルダをネットワークドライブ内のフォルダへ設定できるはずです。 > > 何をどうしてどうなったのかしら? > どんなコードを書いていますか? > ネットワークドライブ内のフォルダを指定したら何が起きますか? > 「○○というエラーが出る」など具体的な症状を書いてください。 デフォルトのフォルダをネットワークドライブ内のフォルダへ設定しているのですが、 フォルダ選択ダイアログから取得できるネットワークドライブのパス名が 例)"¥¥ワークグループ名−コンピュータ名¥共有フォルダ名¥フォルダ名" となってます。 ¥¥ワークグループ名−コンピュータ名の個所が略されてしまっているため、 うまく初期フォルダの指定ができていません。 しかし、取得したパス名を認識できるフルパス名にする方法が分からないのです。 コードを下に記述します。長くなってしまいましたが、宜しくお願いします。 //コード /*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
匿名6002003-08-28(木) 09:59
> デフォルトのフォルダをネットワークドライブ内のフォルダへ設定しているのですが、 > フォルダ選択ダイアログから取得できるネットワークドライブのパス名が > 例)"¥¥ワークグループ名−コンピュータ名¥共有フォルダ名¥フォルダ名" > となってます。 > ¥¥ワークグループ名−コンピュータ名の個所が略されてしまっているため、 > うまく初期フォルダの指定ができていません。 > しかし、取得したパス名を認識できるフルパス名にする方法が分からないのです。 > コードを下に記述します。長くなってしまいましたが、宜しくお願いします。 > コードをコピペして実行してみたところ、うちの環境では、 "¥¥ワークグループ名−コンピュータ名¥共有フォルダ名¥フォルダ名" が取れてきています。 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 です。
なっちゃん2003-08-28(木) 17:14
匿名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:\----\----\----\ … \共有フォルダ名¥フォルダ名)を取得できれば 実現できそうなのですが、 この"¥¥ワークグループ名−コンピュータ名¥共有フォルダ名¥フォルダ名"から、 実際の正確なパス名の取得方法がわかりません。 長くなりましたが、分かるようでしたら、方法を教えて頂きたいと思います。 宜しくお願いします。
匿名6192003-08-28(木) 17:50
匿名600です。 > 匿名600 さんがコードを実行した時、 > Text1 に書かれてあるフォルダが青く選択されていましたでしょうか? 前回というか、Text1に表示されたフォルダが青く選択された状態になってました。 どこを選んでも、何回やっても、ダイアログを開くと、Text1の場所が青く選択されています。 ちなみに、階層でいうと、 マイネットワーク>自分のワークグループ>クライアントPC>フォルダ1 マイネットワーク>自分のワークグループ>クライアントPC>フォルダ1>フォルダ2 マイネットワーク>他のワークグループ>クライアントPC>フォルダ1 マイネットワーク>他のワークグループ>クライアントPC>フォルダ1>フォルダ2 いずれも青く選択されてました。 Text1の表示は \\ から始まってます。 的外れな回答でしたらすみません、、。
なっちゃん2003-08-28(木) 21:03
匿名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さんが使用したプログラムを参考にしたいのですが、 プログラム(ソース)を頂くことは可能でしょうか? 以上です。宜しくお願いします。
このページと関連する記事:
#7497-0フォルダを指定するダイアログボックス1999-10-16(土) 21:03#5833-1CommonDialogでフォルダ名の取得1999-09-24(金) 14:38
#996-1「App.Path」について2004-02-06(金) 10:19
#33903-0フォルダ選択ダイアログのデフォルトパスを指定するには?2000-11-22(水) 09:38
#26611-0Environを使用してデスクトップのパスを取得できますか。2000-07-26(水) 19:17
#11418-0フルパス名について2000-09-14(木) 10:00
#6957-0ネットワークコンピュータからLAN接続しているドライブを取得する1999-10-08(金) 09:25
#14498-0フルパスからフォルダ名取得2001-02-14(水) 18:05
#2123-0ネットワークコンピュータ、デスクトップの情報を取得するには1999-09-24(金) 19:08
#4030-2ファイルを開くときフルパスでない指定の仕方2002-01-18(金) 14:58