ファイル選択ダイアログボックスを表示 |
ファイル選択(保存)ダイアログボックスを表示 (112) | |
Option Explicit 'SampleNo=112 WindowsXP VB6.0(SP5) 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 Private Const OFN_HIDEREADONLY = &H4 Private Const OFN_OVERWRITEPROMPT = &H2 Private Const OFN_FILEMUSTEXIST = &H1000 Private Const OFN_PATHMUSTEXIST = &H800 Private Const OFN_EXPLORER = &H80000 Private strFileName As String Private Sub mnuFileExit_Click() Unload Me End Sub Private Sub mnuFileOpen_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 mnuFileSave_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を使って実現しました。ご使用される場合は、ご自分の環境に 合わせて変更してお使いください。 |
2002/05/22