VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 ダイアログ関係のメニュー
1.コモンダイアログを使ってカラー・フォント等のダイアログボックスの使用例
2.ファイルを開く及びファイルを保存ダイアログボックスを表示する
3.検索・置換をする(ダイアログボックスもどきを作成)
4.エクスプローラーの検索ダイアログを表示する
5.プリンターの設定]ダイアログボックスを表示する
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.その他、当サイト内に掲載のダイアログボックスに関するサンプル


2.ファイルを開く及びファイルを保存ダイアログボックスを表示する
1.ファイルを開く及びファイルを保存ダイアログボックスを表示する
2.
3.
4.
5.
6. 

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6)
Option :[Option Explicit]
参照設定:追加なし
使用 API:
GetOpenFileName / GetSaveFileName
その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。
    :使用コントロール類や配置は下図を参考にして下さい。

Option Explicit   'SampleNo=112  2002.05.22

'ファイル選択(開く)ダイアログボックスを表示する(P157)
Private Declare Function GetOpenFileName Lib "comdlg32.dll" _
  Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

'ファイル保存ダイアログボックスを表示する(P160)
Private Declare Function GetSaveFileName Lib "comdlg32.dll" _
  Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long

'動作条件を設定するOPENFILENAME構造体(P158)
Private Type OPENFILENAME
  lStructSize    As Long  '構造体のサイズ
  hwndOwner     As Long  '親ウィンドウのハンドル
  hInstance     As Long  'モジュールのインスタンスハンドル
  lpstrFilter    As String 'VBのファイルパターン
  lpstrCustomFilter As String 'カスタムフィルター
  nMaxCustFilter  As Long  '同バイト数
  nFilterIndex   As Long  'フィルターのインデックス
  lpstrFile     As String 'フルパス名を受取るバッファー
  nMaxFile     As Long  '同バイト数
  lpstrFileTitle  As String 'ファイル名を受取るバッファー
  nMaxFileTitle   As Long  '同バイト数
  lpstrInitialDir  As String '初期ディレクトリ名
  lpstrTitle    As String 'ダイアログボックスのキャプションタイトル
  flags       As Long  '動作を指定する定数の組合せ
  nFileOffset    As Integer 'フルパス中のファイル名までのオフセット
  nFileExtension  As Integer '同 拡張子までのオフセット
  lpstrDefExt    As String 'デフォルトの拡張子
  lCustData     As Long  'フックプロシージャに渡すデータ
  lpfnHook     As Long  'フックプロシージャOFNHookprocへのポインター
  lpTemplateName  As String 'テンプレートリソース名
End Type

'OPENFILENAME構造体のflagsで指定する定数
'[ファイルを開く]
'複数ファイルを選択可能にする
'Private Const OFN_ALLOWMULTISELECT = &H200
'指定のファイル名がない時ファイルを作成するかどうかを
'問い合わせるダイアログを表示する
'Private Const OFN_CREATEPROMPT = &H2000

'上書き禁止チェックボックスを表示しない
Private Const OFN_HIDEREADONLY = &H4

'ショートカットリンク(.lnk)ファイル名をそのまま返す
'(このフラッグを指定しないとき、リンク先のフルパスが戻る)
'Private Const OFN_NODEREFERENCELINKS = &H100000
'読み取り専用属性のファイルと書込み禁止ディレクトリを
'選択したとき、メッセージボックスを表示する
'Private Const OFN_NOREADONLYRETURN = &H8000
'上書き禁止チェックボックスをチェックする
'Private Const OFN_READONLY = &H1
'[ファイルを保管]

'既存ファイル名を指定したとき、メッセージボックスを表示する
Private Const OFN_OVERWRITEPROMPT = &H2

'lpstrDefExt と異なる拡張子の入力を許可する
'(このフラッグは lpstrDefExt が vbNullString のとき無効)
'Private Const OFN_EXTENSIONDIFFERENT = &H400

'指定のファイル名が存在しないとき、メッセージボックスを表示する
Private Const OFN_FILEMUSTEXIST = &H1000

'ダイアログ終了前に、書き込み禁止属性などのチェック
'のためのテスト用ファイルを作成しない
'Private Const OFN_NOTESTFILECREATE = &H10000
'[共通]
'ファイル名の有効性をチェックしない
'(ただし、ファイル名が不正な場合、メッセージは表示される)
'Private Const OFN_NOVALIDATE = &H100
'有効なパス名だけを受付ける(不正なファイル名が入力されたとき、
'メッセージを表示する。ただし、これがデフォルトの設定であるので、

'このフラッグを指定する必要はない)
Private Const OFN_PATHMUSTEXIST = &H800

'ヘルプボタンを表示する
'Private Const OFN_SHOWHELP = &H10
'[その他]
'lpfnHook メンバーを有効にする
'Private Const OFN_ENABLEHOOK = &H20
'エクスプローラー型のダイアログのリサイズを可能にする
'Private Const OFN_ENABLESIZING = 0
'テンプレートを使う
'Private Const OFN_ENABLETEMPLATE = &H40
'hInstance はテンプレートへのポインターを指す
'Private Const OFN_ENABLETEMPLATEHANDLE = &H80

'エクスプローラー型ダイアログとして表示
Private Const OFN_EXPLORER = &H80000

'旧スタイルのダイアログのとき、ロングファイル名を使用可能にする
'(エクスプローラー型のときは常にロングファイル名が使える)
'Private Const OFN_LONGNAMES = &H200000
'ダイアログ終了後、元のディレクトリに戻る
'Private Const OFN_NOCHANGEDIR = &H8
'旧スタイルのダイアログのとき、ショートファイル名を使用可能にする
'(エクスプローラー型のときは常にロングファイル名が使える)
'Private Const OFN_NOLONGNAMES = &H40000
'ネットワークボタンを非表示・無効にする
'Private Const OFN_NONETWORKBUTTON = &H20000
'ファイルを開いたときにネットワーク共有違反のため

'エラーが発生してもエラーを無視する
'Private Const OFN_SHAREAWARE = &H4000

Private strFileName  As String

Private Sub Command1_Click()
'ファイルを開くダイアログボックスを表示する
  Dim tOpenFileName As OPENFILENAME
  With tOpenFileName
    '構造体のサイズを設定
    .lStructSize = Len(tOpenFileName)
    '親ウィンドウのハンドルを指定
    .hwndOwner = Me.hWnd
    'アプリケーションのインスタンスのハンドルを指定
    .hInstance = App.hInstance '不要の時 0&
    'ファイルパターンを設定(複数指定する場合は続いて記入)
    .lpstrFilter = "テキストファイル(*.txt)" & vbNullChar & "*.txt" _
    & vbNullChar & "すべてのファイル(*.*)" & vbNullChar & "*.*"

    '優先的に表示させるフィルターのインデックス
    .nFilterIndex = 1
    'ファイル名の内容を初期化
    .lpstrFile = String$(256, Chr$(0)) ' "*.txt" & String$(256, Chr$(0))
    '同バイト数
    .nMaxFile = 256
    'ファイル名を受取るバッファーの設定(Nullで埋めておく)
    .lpstrFileTitle = String$(256, Chr$(0))
    '同バイト数
    .nMaxFileTitle = 256
    'デフォルトのフォルダー名の設定
    .lpstrInitialDir = "C:\"
    'ダイアログのキャプション名
    .lpstrTitle = "ファイルを開く"
    'flagsの動作の設定
    .flags = OFN_EXPLORER Or OFN_PATHMUSTEXIST _
      Or OFN_FILEMUSTEXIST Or OFN_HIDEREADONLY
  End With
  'ダイアログの表示
  If GetOpenFileName(tOpenFileName) = 0 Then
    'キャンセルボタンを押した場合(クローズ・エラーも)
    strFileName = ""
    Exit Sub
  Else
    '開くボタンを押した場合(ファイル名を取得)
    strFileName = Left$(tOpenFileName.lpstrFile, _
        InStr(tOpenFileName.lpstrFile, vbNullChar) - 1)
  End If
  '一応拡張子を照合してからOpen
  If StrComp(Right$(strFileName, 4), ".txt", 1) = 0 Then
    'テキストファイルをバイナリデータとして読込表示する
    Dim intFileNo As Integer
    '使用可能なファイル番号を取得する
    intFileNo = FreeFile
    'ファイルをシーケンシャル入力モードで開く
    Open strFileName For Input As #intFileNo
    'バイナリデータとして読込んでUnicodeに変換して表示
    Text1.Text = StrConv(InputB$(LOF(intFileNo), intFileNo), vbUnicode)
    Close #intFileNo
  Else
    MsgBox "正しいファイル名を指定して下さい。"
  End If
End Sub


Private Sub
Command2_Click()
'ファイルを保存ダイアログボックスを表示する
  Dim tOpenFileName As OPENFILENAME
  Dim lngRet    As Long
  With tOpenFileName
    '構造体のサイズを設定
    .lStructSize = Len(tOpenFileName)
    '親ウィンドウのハンドルを指定
    .hwndOwner = Me.hWnd
    'アプリケーションのインスタンスのハンドルを指定
    .hInstance = App.hInstance '不要の時 0&
    'ファイルパターンを設定(複数指定する場合は続いて記入)
    .lpstrFilter = "テキストファイル(*.txt)" & vbNullChar & "*.txt" _
    & vbNullChar & "すべてのファイル(*.*)" & vbNullChar & "*.*"

    '優先的に表示させるフィルターのインデックス
    .nFilterIndex = 1
    'ファイル名の内容を初期化
    .lpstrFile = strFileName & String$(256, Chr$(0))
    '同バイト数
    .nMaxFile = 256
    'ファイル名を受取るバッファーの設定(Nullで埋めておく)
    .lpstrFileTitle = String$(256, Chr$(0))
    '同バイト数
    .nMaxFileTitle = 256
    'デフォルトのフォルダー名の設定
    .lpstrInitialDir = "C:\"
    'ダイアログのキャプション名
    .lpstrTitle = "名前を付けて保存"
    'flagsの動作の設定
    .flags = OFN_PATHMUSTEXIST Or OFN_FILEMUSTEXIST Or _
     OFN_HIDEREADONLY Or OFN_OVERWRITEPROMPT

  End With
  lngRet = GetSaveFileName(tOpenFileName)
  If lngRet = 0 Then
  'キャンセルボタンを押した場合(クローズ・エラーも)
    strFileName = ""
    Exit Sub
  Else
  '保存ボタンを押した場合(ファイル名を取得)
    strFileName = Left$(tOpenFileName.lpstrFile, _
        InStr(tOpenFileName.lpstrFile, vbNullChar) - 1)
  End If
  '一応拡張子を照合してからSAVE
  If StrComp(Right$(strFileName, 4), ".txt", 1) = 0 Then
    'テキストファイルをバイナリモードで書込み
    Dim intFileNo As Integer
    intFileNo = FreeFile
    'ファイルをバイナリモードで開く
    Open strFileName For Binary Access Write As #intFileNo
      'テキストファイルを丸ごと書込み
      Put #intFileNo, , Text1.Text
    Close #intFileNo
  Else
    MsgBox "正しいファイル名を指定して下さい。"
  End If
End Sub


自分で使うだけなら、CommonDialog コントロールを使えば簡単ですが、プログラムを配布したりすると、添付しなければならないし、ファイルサイズが大きくなったり、その他問題も発生します。
そこで、ちょっと面倒ですがAPIを使って実現しました。ご使用される場合は、ご自分の環境に合わせて変更してお使いください。
このページのトップへ移動します。 2.


このページのトップへ移動します。 3.


このページのトップへ移動します。 4.


このページのトップへ移動します。 5.


このページのトップへ移動します。 6.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
ファイルを保存ダイアログボックスを表示する ファイルを開くダイアログボックスを表示する
ファイルを選択ダイアログボックスを表示する



このページのトップへ移動します。