OpenFileDialogで、フォルダも選択可能にしたい


まるお  2006-09-02 23:03:41  No: 133045

こんにちわ。まるおです。
いつも、お世話になりっぱなしです。

早速、質問なのですが、OpenFileDialogで、フォルダも選択可能にしたいのですが、
そのようなことは、可能なのでしょうか?

開発環境は、VB.NET 2005です。

調べた感じだと、無理っぽいと思ったのですが、
もしかしたら、何か裏技があるのかと思い、相談させてもらいました。

どなたかご存知の方がいましたら、ご教授いただければ幸いです。

よろしくお願いします。


K.J.K.  2006-09-03 04:54:14  No: 133046

フックして、CDN_FILEOKでのハンドリングをカスタマイズするとか
ディレクトリを選択するためのボタン・機能を追加してみては。

まぁ、ファイルの選択とフォルダの選択が分離しているのは、
確かに面倒ですからね。


まるお  2006-09-03 09:48:42  No: 133047

K.J.Kさん。
ご助言ありがとうございます。

挑戦してみようと思って、調べてみたのですが、良くわかりませんでした。
★の箇所で、エラーが表示されて実行することができません。

「'Integer' は、デリゲート型でないため、'AddressOf' 式を 'Integer' に変換できません」

adressOfで関数のポインタを渡せば出来ると思ったのですが、なぜ出来ないんでしょうか?
うーん。。。

ご助言いただけると助かります。

Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click
    Dim a As Object
    Dim rc As Object
    Dim DialoghWnd As Object
    Dim lpofn As OPENFILENAME

    With lpofn
        .flags = OFN_PATHMUSTEXIST Or OFN_HIDEREADONLY Or OFN_EXPLORER Or OFN_ENABLEHOOK
        .lStructSize = Len(lpofn)

        .lpstrFileTitle = New String(Chr(0), 256)
        .nMaxFileTitle = 256
        .lpstrFile = New String(Chr(0), 256)
        .nMaxFile = 256
        .lpstrTitle = "ファイルを開く"
        .lpfnHook = AddressOf hookproc ' ★

        .lpstrFilter = "HTML File(*.html)" & Chr(0) & "*.html" & Chr(0) & "Text File(*.txt)" & Chr(0) & "*.txt" & Chr(0) & "All File(*.*)" & Chr(0) & "*.*"
        .lpstrInitialDir = My.Application.Info.DirectoryPath
        .nFilterIndex = 2
        rc = GetOpenFileName(lpofn)
        If rc > 0 Then
            a = InStr(.lpstrFile, Chr(0))
            MsgBox(Mid(.lpstrFile, 1, a - 1))
        End If
    End With
End Sub


魔界の仮面弁士  2006-09-04 01:56:13  No: 133048

Integer 型にしている宣言を変更して、AddressOf で渡すメソッドの
引数仕様にあわせたデリゲート型にしてみるとか。


まるお  2006-09-11 00:08:17  No: 133049

魔界の仮面弁士さんの助言を元に、色々調べてみたのですが、
良くわかりません。

下記の★の箇所で、エラーが表示されます。
「'AddressOf' オペランドはメソッドの名前でなければなりません。かっこは不要です。」

どこが、悪いのでしょうか?
どなたかご助言ください。

----<Form1.vb>
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim lpofn As OPENFILENAME
        Dim hookFunction As DelegateFuncHook = AddressOf Module1.OFNHookProc

        With lpofn

            .flags = OFN_PATHMUSTEXIST Or OFN_HIDEREADONLY
            .lStructSize = System.Runtime.InteropServices.Marshal.SizeOf(lpofn)
            .hwndOwner = Me.Handle.ToInt32
            .lpstrFileTitle = New String(Chr(0), 256)
            .nMaxFileTitle = 256
            .lpstrFile = New String(Chr(0), 256)
            .nMaxFile = 256
            .lpstrTitle = "ファイルまたは、フォルダの選択"
            .lpstrFilter = "HTML File(*.html)" & Chr(0) & "*.html" & Chr(0) & "Text File(*.txt)" & Chr(0) & "*.txt" & Chr(0) & "All File(*.*)" & Chr(0) & "*.*"
            .lpstrInitialDir = My.Application.Info.DirectoryPath
            .nFilterIndex = 2
            .lpfnHook = AddressOf hookFunction  ' ★ ここでエラーが出る。

            Dim rc As Object
            rc = GetOpenFileName(lpofn)
            If rc > 0 Then
                Dim a As Object
                a = InStr(.lpstrFile, Chr(0))
                MsgBox(Mid(.lpstrFile, 1, a - 1))
            End If
        End With

    End Sub
End Class
----<Form1.vb>

----<Module1.vb>
Module Module1

    '*******************************************
    'ファイル選択ダイアログボックスを表示する
    '*******************************************
    Delegate Function DelegateFuncHook(ByVal hdlg As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (ByRef lpofn As OPENFILENAME) As Integer
    Public Structure OPENFILENAME
        Dim lStructSize As Integer                 '構造体のサイズ
        Dim hwndOwner As Integer                   'ダイアログボックスの親ウィンドウハンドル
        Dim hInstance As Integer                   'テンプレートリソースを持つモジュールのインスタンスハンドル (不用のとき0)
        '                                           flagsにOFN_ENABLETEMPLATEを設定しているときのみ有効)                
        Dim lpstrFilter As String                  'フィルタ(Visual Basicのファイルパターンのこと)
        Dim lpstrCustomFilter As String            'カスタムフィルタ
        Dim nMaxCustomFilter As Integer            '同、バイト数
        Dim nFilterIndex As Integer                'ダイアログに優先的に表示するフィルタのインデックス
        '                                           lpstrFilterで指定した最初のフィルタのインデックスは1
        '                                           このメンバを0に設定すると、カスタムフィルタが使用される
        '                                           lpstrCustomFilterが設定されていないとき
        '                                           lpstrFilterの最初のフィルタを使用する

        Dim lpstrFile As String                    '(戻り値)フルパス名を受け取るバッファ
        Dim nMaxFile As Integer                    '同、バイト数
        Dim lpstrFileTitle As String               '(戻り値)ファイル名を受け取るバッファ
        Dim nMaxFileTitle As Integer               '同、バイト数
        Dim lpstrInitialDir As String              '初期のディレクトリ名
        Dim lpstrTitle As String                   'ダイアログのキャプション
        Dim flags As Integer                       '動作を指定
        Dim nFileOffset As Short                   'フルパス中のファイル名までのオフセット
        Dim nFileExtension As Short                '同、拡張子までのオフセット
        Dim lpstrdefext As String                  'デフォルトの拡張子
        Dim lCustData As Integer                   'フックプロシージャに渡すデータ
        Dim lpfnHook As Integer                    'フックプロシージャへのポインタ
        Dim lpTemplateName As String               'テンプレートリソース名
    End Structure

    'uFlagsの定数
    Public Const OFN_ALLOWMULTISELECT As Short = &H200S         '複数ファイルを選択可能にする
    Public Const OFN_CREATEPROMPT As Short = &H2000S            '指定のファイル名がないとき、ファイルを作成するかどうかを問い合わせるダイアログを表示する
    Public Const OFN_HIDEREADONLY As Short = &H4S               '上書き禁止チェックボックスを表示しない
    Public Const OFN_NODEREFERENCELINKS As Integer = &H100000   'ショートカットリンク(.lnk)ファイル名をそのまま返す(このフラッグを指定しないとき、リンク先のフルパスが戻る)
    Public Const OFN_NOREADONLYRETURN As Short = &H8000S        '読み取り専用属性のファイルと書込み禁止ディレクトリを選択したとき、メッセージボックスを表示する
    Public Const OFN_READONLY As Short = &H1S                   '上書き禁止チェックボックスをチェックする
    Public Const OFN_OVERWRITEPROMPT As Short = &H2S            '既存ファイル名を指定したとき、メッセージボックスを表示する
    Public Const OFN_EXTENSIONDIFFERENT As Short = &H400S       'lpstrDefExt と異なる拡張子の入力を許可する(このフラッグは lpstrDefExt が vbNullString のとき無効)
    Public Const OFN_FILEMUSTEXIST As Short = &H1000S           '指定のファイル名が存在しないとき、メッセージボックスを表示する
    Public Const OFN_NOTESTFILECREATE As Integer = &H10000      'ダイアログ終了前に、書き込み禁止属性などのチェックのためのテスト用ファイルを作成しない
    Public Const OFN_NOVALIDATE As Short = &H100S               'ファイル名の有効性をチェックしない(ただし、ファイル名が不正な場合、メッセージは表示される)
    Public Const OFN_PATHMUSTEXIST As Short = &H800S            '有効なパス名だけを受付ける(不正なファイル名が入力されたとき、メッセージを表示する。ただし、これがデフォルトの設定であるので、このフラッグを指定する必要はない)
    Public Const OFN_SHOWHELP As Short = &H10S                  'ヘルプボタンを表示する
    Public Const OFN_ENABLEHOOK As Short = &H20S                'lpfnHook メンバを有効にする
    Public Const OFN_ENABLESIZING As Short = 0                  '
    Public Const OFN_ENABLETEMPLATE As Short = &H40S            'テンプレートを使う
    Public Const OFN_ENABLETEMPLATEHANDLE As Short = &H80S      'hInstance はテンプレートへのポインタを指す
    Public Const OFN_EXPLORER As Integer = &H80000              'エクスプローラ型ダイアログとして表示
    Public Const OFN_LONGNAMES As Integer = &H200000            '旧スタイルのダイアログのとき、ロングファイル名を使用可能にする(エクスプローラ型のときは常にロングファイル名が使える)
    Public Const OFN_NOCHANGEDIR As Short = &H8S                'ダイアログ終了後、元のディレクトリに戻る
    Public Const OFN_NOLONGNAMES As Integer = &H40000           '旧スタイルのダイアログのとき、ショートファイル名を使用可能にする(エクスプローラ型のときは常にロングファイル名が使える)
    Public Const OFN_NONETWORKBUTTON As Integer = &H20000       'ネットワークボタンを非表示・無効にする
    Public Const OFN_SHAREAWARE As Short = &H4000S              'ファイルを開いたときにネットワーク共有違反のためエラーが発生してもエラーを無視する

    ' ウインドウメッセージ
    Public Const WM_INITDIALOG As Short = &H110S ' ダイアログ初期化メッセージ
    Public Const WM_COMMAND As Short = &H111S ' コントロールメッセージ
    Public Const WM_NOTIFY As Short = &H4ES ' 標準各種メッセージ

    '------------------------------------
    ' コモンダイアログフックプロシージャ
    '------------------------------------
    Public Function OFNHookProc(ByVal hdlg As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
        Select Case msg
            Case WM_INITDIALOG
                ' ダイアログ初期化
                'OFNHookProc = Form1.fncOFNProc_INITDIALOG(hdlg)
            Case WM_NOTIFY
                ' ダイアログ各種メッセージ
                'OFNHookProc = Form1.fncOFNProc_NOTIFY(hdlg, wParam, lParam)
            Case WM_COMMAND
                ' ダイアログコントロールメッセージ
                ' 本サンプルでは使用しませんが、後程説明します。
                OFNHookProc = True
            Case Else
                OFNHookProc = False
        End Select
    End Function
End Module
----<Module1.vb>


我龍院忠太  2006-09-11 20:55:49  No: 133050

>.lpfnHook = AddressOf hookFunction  ' ★ ここでエラーが出る。
Dim lpfnHook As Integer   ->  Dim lpfnHook As DelegateFuncHook   
.lpfnHook = AddressOf hookFunction  ->   .lpfnHook = hookFunction
まだ色々とエラーが有りそうですが、とりあえず。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加