[リストへもどる]
一括表示

投稿時間:2003/05/17(Sat) 00:52
投稿者名:遠藤
Eメール:
URL :
タイトル:
フォルダの参照ダイアログ
フォルダ参照ダイアログを呼び出したときにフォームの中央にきません。どうすれば中央にくるのでしょうか?

投稿時間:2003/05/17(Sat) 11:08
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: フォルダの参照ダイアログ
なにで、どのように表示しているのでしょうか?

 下記HPのサンプルを試して見て下さい。

  http://homepage2.nifty.com/Dee/vb/soft/index.html
  
  上記の3番のサンプルはオーナーフォームの中央に表示。 4番のサンプルは画面の中央に表示
 されます。 
 (しんじさんのサンプルは3番のサンプルと同様です)


簡単な方法なら  Shellオブジェクト を使って表示するとか。
但し、WinXP でないと画面中央に表示されません。
(Win98で試していたら画面中央には表示されませんでした??)

投稿時間:2003/05/17(Sat) 17:56
投稿者名:しんじ
Eメール:
URL :
タイトル:
Re^2: フォルダの参照ダイアログ
多分APIのコードだとおもいますのでそう予測して記載していますが、
APIだとかなり面倒くさいです。
引数を見れば分かりますが、BROWSEINFO構造体はオーナーフォームのハンドルしか渡せません。

   hwndOwner As Long        'ダイアログボックスの親ウィンドウのハンドル  ← コード内のこの部分

という事はオーナーフォームの中央に表示されるが規定値です。
どうしてもAPIでやるのであれば独自でコールバック関数を作る必要があると思います。

高機能が要らないのであれば花ちゃんさん紹介のページの方法をお勧めします。  → こちらは出来ます。
コードはそのページに記載されているので調べてみて下さい。
ちなみに私はオーナーフォームの中央っていうのが好きなのでAPI使っています。
APIだと設定もいろいろできますしね。

FORMにコマンドボタン一つつけてコード貼り付けて試してみて下さい。
どうやっても中央に表示されない事が分かります。

'-- サンプルコードはフォルダのパスを取得するということ前提にしてください。
'--BASに記載

Declare Function SHBrowseForFolder Lib "shell32.dll" _
    Alias "SHBrowseForFolderA" _
    (lpbi As BROWSEINFO) As Long


'ダイアログボックスを初期化する情報を格納した構造体
Type BROWSEINFO
   hwndOwner As Long        'ダイアログボックスの親ウィンドウのハンドル
   pidlRoot As Long         'ルートフォルダ
   pszDisplayName As String 'ユーザーが選択したフォルダ名
   lpszTitle As String      'ダイアログボックスに表示するメッセージ
   ulFlags As Long          '動作方法を指定する
   lpfn As Long             'コールバック関数へのポインタ
   lParam As Long           'コールバック関数へのパラメータ
   iImage As Long           'フォルダ用アイコンのシステムイメージリストのID
End Type

'ルートフォルダを指定する定数
Public Const CSIDL_DESKTOP = &H0&           'デスクトップ
Public Const CSIDL_PROGRAMS = &H2&          'Windows\プログラム
Public Const CSIDL_CONTROLS = &H3&          'コントロールパネル
Public Const CSIDL_PRINTERS = &H4&          'プリンタ
Public Const CSIDL_PERSONAL = &H5&          'My Documents
Public Const CSIDL_FAVORITES = &H6&         'Favorities
Public Const CSIDL_STARTUP = &H7&           'スタートアップ
Public Const CSIDL_RECENT = &H8&            '最近使ったファイル
Public Const CSIDL_SENDTO = &H9&            '送る
Public Const CSIDL_BITBUCKET = &HA&         'ごみ箱
Public Const CSIDL_STARTMENU = &HB&         'スタートメニュー
Public Const CSIDL_DESKTOPDIRECTORY = &H10& 'Windows\デスクトップ
Public Const CSIDL_DRIVES = &H11&           'マイコンピュータ
Public Const CSIDL_NETWORK = &H12&          'ネットワーク
Public Const CSIDL_NETHOO = &H13&           'Windows\NetHood
Public Const CSIDL_FONTS = &H14&            'Windows\Fonts
Public Const CSIDL_TEMPLATES = &H15&        'Windows\ShellNew

'動作方法を指定する定数
Public Const BIF_RETURNONLYFSDIRS = &H1&        'ディレクトリの選択のみ可能
Public Const BIF_DONTGOBELOWDOMAIN = &H2&       'ネットワークフォルダを含まない
Public Const BIF_STATUSTEXT = &H4&              'ダイアログボックスにステータス表示領域を追加する
Public Const BIF_RETURNFSANCESTORS = &H8&       '親ディレクトリのみを選択可能にする
Public Const BIF_EDITBOX = &H10&                'ダイアログボックス内にアイテム名入力用のテキストボックスを追加する
Public Const BIF_VALIDATE = &H20&               '無効なアイテム名が入力されたときBroeseCallbackProcコールバック関数を呼び出す
Public Const BIF_BROWSEFORCOMPUTER = &H1000&    'コンピュータフォルダのみ選択可能
Public Const BIF_BROWSEFORPRINTER = &H2000&     'プリンタフォルダのみ選択可能
Public Const BIF_BROWSEINCLUDEFILES = &H4000&   'ファイルも表示する

Public Const MAX_PATH = 260                 'フォルダ名の最大長

Declare Function SHGetPathFromIDList Lib "shell32.dll" _
    Alias "SHGetPathFromIDListA" _
    (ByVal pidl As Long, _
    ByVal pszPath As String) As Long

Declare Function CoTaskMemFree Lib "OLE32.dll" _
    (ByVal pv As Long) As Long

'--どこかのイベントに記載
    Dim udtBROWSEINFO As BROWSEINFO
    Dim lngPidl As Long
    Dim strPath As String * MAX_PATH    '--フォルダ名格納
    Dim rc As Long
    
    Dim strClassName As String
    
    With udtBROWSEINFO
        .hwndOwner = Me.hwnd
        .pidlRoot = CSIDL_DESKTOP
        .ulFlags = BIF_RETURNONLYFSDIRS
    End With
    
    '--[フォルダ参照のダイアログを開く]
    lngPidl = SHBrowseForFolder(udtBROWSEINFO)
    
    rc = SHGetPathFromIDList(lngPidl, strPath)
    
    '--処理を記載

    Call CoTaskMemFree(lngPidl)