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. |
検索キーワード及びサンプルコードの別名(機能名) |
ファイルを保存ダイアログボックスを表示する ファイルを開くダイアログボックスを表示する ファイルを選択ダイアログボックスを表示する |